Я тестирую свой код 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. то есть инструмент утверждает, что мог быть случай, который проходит проверку, но умножение все еще переполняется.
Чека недостаточно? или инструмент статического анализа не так?