Static trace — это метод анализа программы, при котором путь выполнения кода восстанавливается без фактического запуска приложения: анализатор читает исходный или машинный код и строит возможные цепочки вызовов, переходов и операций. Если отладчик показывает вам, что программа делает прямо сейчас, то статическая трассировка отвечает на другой вопрос — какие пути выполнения вообще существуют и что может произойти при тех или иных входных данных.

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

Определение и суть статической трассировки

Термин static trace (статическая трасса, статическая трассировка) описывает последовательность инструкций или вызовов, полученную путём анализа кода «на бумаге» — без исполнения. Инструмент проходит по графу потока управления (control flow graph, CFG) и фиксирует, какие ветки, циклы и функции могут быть достигнуты.

Ключевое слово здесь — «возможные». Поскольку программа не запускается, анализатор не знает реальных значений переменных и вынужден рассматривать все допустимые ветвления. Из-за этого статическая трасса обычно шире реальной: она включает пути, которые на практике могут никогда не выполниться.

Противоположный подход — dynamic trace, динамическая трассировка, при которой программа реально запускается, а инструмент (например, strace, ltrace или отладчик) записывает фактически выполненные системные вызовы и инструкции. Динамическая трасса точна, но показывает только один конкретный сценарий запуска.

💡

Static trace анализирует все возможные пути выполнения кода без запуска программы, dynamic trace — один фактический путь при реальном запуске.