← На главную

Call Graph Analyzer ищет скрытые panic в Rust

28.10.2026 13:48 · hackernews

Tweede golf совместно с Microsoft в рамках Open Device Partnership выпустила Call Graph Analyzer, или CGA. Инструмент извлекает граф вызовов Rust-программы из мономорфизированного MIR и показывает, какие достижимые функции способны завершиться panic. Команда cargo cga check выводит диагностику с путём вызова от entrypoint до потенциальной ошибки, включая место в исходном crate.

Полное отсутствие panic авторы не считают универсально разумной целью. Возврат Result или Option делает ошибку восстанавливаемой, checked_add уточняет арифметику, а wrapping_add явно выбирает переполнение по модулю. Но перенос всех предположений наверх по стеку часто заканчивается тем же завершением программы. Полезнее сделать panic-пути видимыми и отслеживать появление новых. Особенно это важно для ограниченной памяти embedded-устройств, bootloader, внешних сервисов, устойчивых к DoS, и кода обработки самих panic.

Прежние подходы имеют ограничения. Linker-метод срабатывает только при полном запрете panic в готовом binary и не подходит для библиотек. DWARF-анализ теряет часть графа после inline и linker-оптимизаций. HIR видит собственный crate, но не зависимости и неявные проверки границ. MIR позволяет исследовать crate вместе со standard library до удаления недостижимого кода, хотя это создаёт ложные срабатывания. Rust-analyzer работает независимо от rustc, но хуже справляется с некоторыми сложными proc macros.

CGA реализован как rustc-driver, подобно Clippy. Он начинает с entrypoints вроде main, _start и экспортируемых функций, затем обходит достижимые вызовы с конкретными generic-типами. Для dyn объектов анализ консервативно считает вызванными все подходящие vtable entries, а созданные function pointers — способными выполниться позже. Граф можно выгрузить в JSON или GraphViz dot.

Белый список отключает пути через доверенные функции, чёрный — запрещает вызовы выбранных API, например filesystem или process. Однако это не полная гарантия безопасности: внешние object-файлы и assembly CGA не анализирует.

Главная цена подхода — зависимость от нестабильного MIR и конкретной nightly-версии rustc. Установка выполняется из локального репозитория через cargo install --path ., а проверка обычно в два-три раза дольше cargo check. Граф может отличаться от production-binary из-за toolchain и флагов. Авторы советуют opt-level=2 для уменьшения ложных срабатываний без ожидаемых пропусков достижимых panic. Для работы требуется build-std; часть проектов со специальными build.rs пока несовместима.

Читать оригинал →