Я работаю над большим проектом, который обычно работает просто отлично, но показывает серьезные проблемы, когда размер входных данных превышает некоторые ограничения.
Эти проблемы (предположительно) возникают только из-за целочисленных переполнений со знаком, таких как:
int a, o;
// Initialize a and o
int x = (a+o) >> 1);
Очевидно, что как только сумма a и o переполняется (становится больше, чем 2 ^ 31-1), x больше не является средним значением a и o.
Есть ли общий способ найти все эти целочисленные переполнения в работающей программе?
Я имею в виду такой инструмент, как Valgrind или расширение GDB, которое ломается при каждой целочисленной арифметической инструкции, принимает параметры и сравнивает правильный результат (рассчитанный с типом данных большего размера или арифметикой произвольной точности) с фактическим результатом. Если результаты отличаются, он должен вывести предупреждение, вызвать прерывание отладки или что-то вроде этого.
Я знаю, как проверить одну арифметическую инструкцию на переполнение (например, проверить знак для дополнений), однако из-за огромного количества кода для меня нереально решить весь проект и вставить проверочный код везде от руки.