MIT обнаруживает ошибки переполнения


Это самая старая ошибка — переполнение преследовало любую попытку создать хорошую программу с тех пор, как мы начали писать код. Теперь у MIT есть улучшенная система для поиска ошибок переполнения путем изучения кода.

Ошибка переполнения возникает, когда любая арифметика дает результат, слишком большой для представления на доступном оборудовании. На заре программирования это было особой проблемой, потому что 8-битное оборудование было нормой, а в большинстве арифметических операций быстро заканчивались биты и возникало переполнение. Даже сегодня 8-битное оборудование используется во встроенных устройствах, и медицинские устройства являются примером, когда неожиданное переполнение может означать разницу между жизнью и смертью.

Ранее предпринимались попытки обнаружить проблемы переполнения путем изучения кода, но новый подход команды MIT, как утверждается, значительно лучше — обнаружение всех ошибок переполнения, обнаруженных предыдущими методами, а также некоторыми. Новый алгоритм был протестирован на пяти проектах с открытым исходным кодом, и он обнаружил три ошибки, обнаруженные в предыдущем анализе, и еще 11.

Принцип его работы состоит в том, чтобы сначала проанализировать потоковый граф программы, то есть количество возможных путей прохождения кода программы. Каждый ввод, применяемый к программе, приводит к тому, что она следует единственному пути через потоковый граф. В принципе, вы можете найти все ошибки переполнения, начав с самого начала и отслеживая, что происходит с данными. На практике количество возможных путей быстро сокращается. Это означает, что текущие средства поиска переполнения обычно находят проблемы на ранних этапах кода, но не глубоко в потоковом графе.

Новый подход, созданный исследователями из CSAIL, берет один входной образец, отслеживает его через потоковый граф и записывает символическое выражение, соответствующее операциям, выполняемым с ним. Всякий раз, когда происходит операция, которая может быть повреждена целочисленным переполнением, система, названная DIODE для обнаружения направленного целочисленного переполнения, записывает соответствующее символьное выражение. Умная часть состоит в том, что затем DIODE обрабатывает ввод, который может вызвать целочисленное переполнение. Причина, по которой это только «может», состоит в том, что возможно, что система имеет проверки ввода, которые заставляют программу принимать сконструированный ввод в другую часть потокового графа, где переполнения не происходит.

Если DIODE обнаруживает переполнение, он может предоставить отладочную информацию, состоящую из ввода и местоположения переполнения. Он также работает непосредственно с двоичными файлами x86, что делает возможным тестирование развернутого кода.


Добавить комментарий