Источник: MIT |
Специалисты МТИ написали утилиту Stack, помогающую не «потерять» ценные проверки созданных на Си/С++ программ на защищенность, которые компиляторами могут быть приняты за «мертвый» — никогда не исполняемый — код. Типичный пример, объясняют авторы утилиты, — упрощенная проверка на целочисленное переполнение «if a + b < a» вместо «if a > int_max — b»; программисты могут пользоваться первым вариантом, рассчитывая, что в случае превышения максимального для целых чисел объема памяти лишние биты значения суммы будут просто «отрезаться» и в результате получится меньшее число. Однако некоторые современные компиляторы вместо важной проверки «видят» код, который никогда не выполнится, и отбрасывают его.
Stack «знает» все подобные приемы, а также код, для которого поведение языка программирования не определено спецификацией, и, просмотрев программу, укажет на все возможные в этой связи ошибки. Утилита работает в два прохода — на первом ищется только мертвый код, на втором — также неопределенное поведение. Фрагменты, которые были «отрезаны» на втором проходе, но не на первом, отмечаются как потенциально проблемные. Программисты Intel, использующие Stack, отмечают, что у утилиты чрезвычайно низкий уровень ложноположительных срабатываний.