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