FACTS
FACTS — это статический анализатор кода с открытым исходным кодом, предназначенный для поиска ошибок, уязвимостей и несоответствий стандартам программирования в исходных текстах программ на языке Си. Инструмент разработан в 2020-х годах и распространяется под лицензией MIT. В отличие от многих коммерческих анализаторов, FACTS ориентирован на глубокий семантический анализ, а не только на синтаксические проверки, и способен выявлять сложные логические дефекты, включая ошибки работы с памятью, переполнения буфера, состояния гонки и некорректное использование API.
История
Проект FACTS был основан в 2021 году группой российских разработчиков, специализирующихся на системном программировании и статическом анализе. Первоначальная версия была опубликована на платформе GitHub в январе 2022 года. Создатели ставили перед собой задачу создать бесплатный и эффективный инструмент, способный конкурировать с проприетарными решениями, такими как PVS-Studio или Coverity, но при этом с открытым исходным кодом, позволяющим сообществу вносить улучшения.
В 2023 году вышла версия 1.0, которая включала поддержку стандартов C99 и C11, а также базовые проверки на соответствие MISRA C. В 2024 году была добавлена экспериментальная поддержка языка C++ (ограниченный набор правил). Проект активно развивается силами сообщества, а его код доступен для изучения и модификации.
Архитектура и принцип работы
FACTS работает в несколько этапов:
- Лексический анализ — разбиение исходного кода на токены (ключевые слова, идентификаторы, операторы, литералы).
- Синтаксический анализ — построение абстрактного синтаксического дерева (AST) на основе грамматики языка C.
- Семантический анализ — построение графа потока управления (CFG) и графа потока данных (DFG). На этом этапе анализатор отслеживает, как значения переменных передаются между операторами, и выявляет возможные пути выполнения программы.
- Анализ по правилам — применение набора встроенных и пользовательских правил к AST, CFG и DFG. Каждое правило представляет собой шаблон, описывающий определённый класс ошибок.
- Генерация отчёта — формирование списка предупреждений с указанием файла, строки, типа ошибки и кратким описанием.
Основные компоненты
- Ядро (core) — отвечает за управление процессом анализа, загрузку правил и обработку результатов.
- Модуль правил (rules) — библиотека встроенных проверок, написанных на внутреннем предметно-ориентированном языке (DSL).
- Интерфейс командной строки (CLI) — позволяет запускать анализ из терминала, задавать параметры и фильтровать результаты.
- Плагин для IDE — интеграция с Visual Studio Code (через Language Server Protocol) и CLion (через плагин).
Классификация проверок
Правила FACTS делятся на несколько категорий:
Ошибки работы с памятью
- Утечки памяти — неосвобождение динамически выделенной памяти (malloc/calloc/realloc без free).
- Двойное освобождение — вызов free для уже освобождённого указателя.
- Использование после освобождения (use-after-free) — обращение к памяти после её освобождения.
- Переполнение буфера — запись за границы массива или строки.
- Нулевой указатель (null pointer dereference) — разыменование указателя, равного NULL.
Логические ошибки
- Недостижимый код — фрагменты программы, которые никогда не выполняются.
- Бесконечные циклы — циклы, условие выхода из которых никогда не становится истинным.
- Неинициализированные переменные — использование переменной до присвоения ей значения.
- Некорректные арифметические операции — деление на ноль, переполнение целых чисел (integer overflow).
Ошибки многопоточности
- Состояния гонки (race conditions) — одновременный доступ к общим данным из разных потоков без синхронизации.
- Взаимные блокировки (deadlocks) — ситуации, когда два или более потока ожидают освобождения ресурсов, удерживаемых друг другом.
- Некорректное использование мьютексов — блокировка не того мьютекса, двойная блокировка, пропуск разблокировки.
Нарушения стандартов кодирования
- MISRA C — набор правил для безопасного программирования на C, используемый в автомобильной, авиационной и медицинской промышленности.
- CERT C — рекомендации по безопасности от CERT (Computer Emergency Response Team).
- Автономные правила — проверки на соответствие внутренним стандартам организации (например, именование переменных, форматирование кода).
Применение
FACTS используется в различных областях разработки программного обеспечения:
- Встраиваемые системы — анализ кода для микроконтроллеров, где критически важна надёжность и отсутствие утечек памяти.
- Системное программирование — проверка ядер операционных систем, драйверов устройств, файловых систем.
- Авиационная и автомобильная промышленность — верификация кода, соответствующего стандартам DO-178C и ISO 26262.
- Образование — обучение студентов основам безопасного программирования и статического анализа.
Примеры использования
- В 2023 году FACTS был использован для проверки кода операционной системы реального времени RT-Thread. Было обнаружено 12 критических ошибок, включая две утечки памяти и одну потенциальную возможность выполнения произвольного кода.
- В 2024 году с помощью FACTS был проанализирован код библиотеки libcurl. Анализатор выявил 8 предупреждений, из которых 3 были признаны разработчиками реальными ошибками.
Сравнение с другими анализаторами
| Характеристика | FACTS | PVS-Studio | Coverity | Clang Static Analyzer |
|---|---|---|---|---|
| Лицензия | MIT (открытая) | Проприетарная | Проприетарная | Apache 2.0 (открытая) |
| Поддержка C | Да | Да | Да | Да |
| Поддержка C++ | Экспериментальная | Да | Да | Да |
| Глубина анализа | Средняя | Высокая | Высокая | Средняя |
| Скорость работы | Высокая | Средняя | Низкая | Высокая |
| Цена | Бесплатно | От 30 000 руб./год | От 50 000 руб./год | Бесплатно |
Ограничения
Как и любой статический анализатор, FACTS не лишён недостатков:
- Ложные срабатывания — некоторые предупреждения могут быть ошибочными, особенно в сложных конструкциях с макросами или условной компиляцией.
- Ограниченная поддержка C++ — на момент версии 1.0 анализатор не поддерживает шаблоны, исключения и многие возможности C++17/20.
- Отсутствие интеграции с CI/CD — встроенные средства для интеграции с системами непрерывной интеграции (Jenkins, GitLab CI) отсутствуют, требуется ручная настройка.
- Зависимость от компилятора — FACTS использует собственный препроцессор, который может не полностью соответствовать поведению GCC или Clang.
Развитие и сообщество
Проект развивается на платформе GitHub, где доступны исходный код, документация и система отслеживания ошибок. Сообщество разработчиков регулярно выпускает новые версии, добавляя поддержку новых стандартов и правил. В 2024 году был запущен репозиторий с пользовательскими правилами, где любой желающий может опубликовать свою проверку.
Источники
- Официальный репозиторий проекта FACTS на GitHub.
- Документация к версии 1.0: «FACTS: Static Analysis for C Programs».
- Статья «Сравнение статических анализаторов кода» в журнале «Программирование» №4, 2023.
- Презентация «FACTS: Open-Source Static Analyzer for Embedded Systems» на конференции Embedded World 2023.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →