Symbolic execution
Метод важен для поиска ошибок и уязвимостей, которых невозможно обнаружить обычным тестированием из-за невообразимого числа комбинаций входных данных. Он лежит в основе современных инструментов автоматического поиска багов, например, в фаззинге и генерации тестов.
Как это работает на интуитивном уровне? Представьте, что вы идёте по лабиринту, где в каждой точке развилка с условием. Символьное исполнение проходит все развилки одновременно, запоминая условия пути. Когда условие противоречиво, путь отбрасывается. Для достижимого пути строится формула, из которой подбираются конкретные числа, приводящие выполнение в нужную точку. Так можно достоверно определить, выполнится ли фрагмент кода и что он сделает.
Пример: в коде просмотрщика PDF есть функция, копирующая данные из файла в буфер. Символьный исполнитель анализирует её, строя формулы для размера данных и границ буфера. Если есть размер, при котором запись выйдет за границу, он найдёт соответствующие значения и сформирует PDF-файл, вызывающий переполнение буфера. Этот файл затем используют, чтобы убедиться в уязвимости.
Итог: символьное исполнение — мощный инструмент для глубокого анализа кода, но он сталкивается с «взрывом путей», когда число ветвлений становится огромным. Поэтому на практике его применяют локально, для критичных участков. Тем не менее это незаменимый помощник в поиске трудноуловимых ошибок и уязвимостей.
Поделиться