Предотвращение переполнения целых чисел для 3+ целых чисел - PullRequest
0 голосов
/ 30 апреля 2018

Я тестирую свой код C ++ 11 с помощью инструмента статического анализа (CodeSonar).

Вот мой код:

int weights_size = c * n * size * size;
int weights_memory_size = weights_size * sizeof(float);
if (IS_OVERFLOW_6(weights_memory_size, c, n, size, size, (int)sizeof(float))) {
    overflow_error();
}

l.weights = (float*) calloc(weights_size, sizeof(float));

Вот мой код макроса проверки переполнения целых чисел:

#define IS_OVERFLOW_6(multipliedVal, val1, val2, val3, val4, val5)  (((val1) > 0) && ((val2) > 0) && ((val3) > 0) && ((val4) > 0) && ((val5) > 0) && ((multipliedVal) > 0) && ((val1) == (((((multipliedVal) / (val2)) / (val3)) / (val4)) / (val5))) ? false : true)

Этот макрос прекрасно работал для проверки умножения двух целых чисел (макрос IS_OVERFLOW_3, который определен как

(((val1) > 0) && ((val2) > 0) && ((multipliedVal) > 0) && ((val1) == ((multipliedVal) / (val2))) ? false : true)

«работал нормально» означает, что инструмент CodeSonar не жаловался.

Однако инструмент статического анализа по-прежнему жалуется на проверки IS_OVERFLOW_6. то есть инструмент утверждает, что мог быть случай, который проходит проверку, но умножение все еще переполняется.

Чека недостаточно? или инструмент статического анализа не так?

...