Interested Article - Статический анализ кода
![](/images/008/288/8288979/1.jpg?rand=70988)
![](https://cdn.wafarin.com/avatars/6a6f9ac08513a095b191a1f0789b03ac.png)
- 2020-01-21
- 1
Стати́ческий ана́лиз ко́да ( англ. static code analysis ) — анализ программного обеспечения , производимый без реального выполнения исследуемых программ (в отличие от динамического анализа ). В большинстве случаев анализ производится над исходным кодом , хотя, иногда анализу подвергается объектный код, например P-код или код на MSIL . Термин обычно применяют к анализу, производимому специальным программным обеспечением (ПО), тогда как ручной анализ называют «program understanding», «program comprehension» ( пониманием или постижением программы).
В зависимости от используемого инструмента глубина анализа может варьироваться от определения поведения отдельных операторов до анализа всего имеющегося кода. Способы использования полученной в ходе анализа информации также различны — от выявления мест, возможно содержащих ошибки (утилиты типа Lint ), до формальных методов, позволяющих математически доказать какие-либо свойства программы (например, соответствие поведения спецификации).
В некоторых источниках программные метрики и обратное проектирование относятся к формам статического анализа. Получение метрик ( англ. software quality objectives ) и статический анализ часто совмещаются, особенно при создании встраиваемых систем.
Принципы статического анализа
Примером простейшего синтаксического анализа являются генерируемые большинством компиляторов (например, GNU C Compiler ) « » ( англ. warnings ) — диагностические сообщения о потенциальной ошибочности синтаксически правильного кода. Например для следующего кода на C может быть получено сообщение о не инициализированной переменной:
int x;
int y = x+2; // Переменная x не инициализирована!
В связи с высокими требованиями к скорости компиляции и качеству машинного кода компиляторы проверяют код лишь на простейшие ошибки. Статические анализаторы предназначены для более детального исследования кода.
Типы ошибок, обнаруживаемых статическими анализаторами
- Неопределённое поведение — неинициализированные переменные, обращение к NULL-указателям. О простейших случаях сигнализируют и компиляторы.
- Нарушение алгоритма пользования библиотекой. Например, во многих языках программирования каждому открытию файла должно соответствовать его закрытие, поэтому если файловая переменная теряется раньше, чем файл закрывается, анализатор может сообщить об ошибке.
-
Типичные сценарии, приводящие к
недокументированному поведению
.
Стандартная библиотека языка Си
известна большим количеством неудачных с точки зрения безопасности технических решений. Некоторые функции, например,
gets
, в принципе небезопасны.sprintf
иstrcpy
безопасны лишь при определённых условиях. - Переполнение буфера , чаще всего вызванное использованием небезопасных функций или неопределённым поведением.
- Типичные сценарии, мешающие кроссплатформенности .
Object *p = getObject();
int pNum = reinterpret_cast<int>(p); // на x86-32 верно, на x64 часть указателя будет потеряна; следует использовать intptr_t
- Ошибки в повторяющемся коде. Многие программы исполняют несколько раз схожий код, обычно не создаваемый с нуля, а размножаемый и исправляемый.
dest.x = src.x + dx;
dest.y = src.y + dx; // Опечатка: вместо dy указан dx
-
Ошибки форматных строк — в функциях форматированного ввода и вывода (например,
printf
) форматная строка может не соответствовать реальному количеству и типам параметров.
std::wstring s;
printf ("s is %s", s);
- Неизменный параметр, передаваемый в функцию, может свидетельствовать об изменившихся требованиях к программе или об ошибке при кодировании. В первом случае программист может избавиться от этого параметра и от связанной с ним логики.
void doSomething(bool flag) // flag всегда равен true
{
if (flag)
// какая-то логика
else
// код есть, но не задействован
}
...
doSomething(true);
...
- Утечки памяти и других ресурсов. В целом статические анализаторы проигрывают в сфере поиска утечек динамическим анализаторам кода [ неавторитетный источник ] .
Traverser *t = new Traverser(Name);
if (!t->Valid())
{
return FALSE; // return до освобождения памяти.
delete t;
}
- Вызов функций, не имеющих побочного эффекта как процедур (без сохранения возвращаемого значения):
std::string s;
...
s.empty(); // код ничего не делает; возможно, опечатка и должно быть s.clear()?
- Прочие ошибки.
Применение
В последнее время статический анализ всё больше используется в верификации свойств ПО, используемого в компьютерных системах высокой надёжности, особенно критичных для жизни ( ). Также применяется для поиска кода, потенциально содержащего уязвимости (иногда это применение называется Static Application Security Testing , SAST).
Статический анализ постоянно применяется для критического ПО в следующих областях:
- ПО для медицинских устройств.
- ПО для атомных станций и систем защиты реактора ( )
- ПО для авиации (в комбинации с динамическим анализом)
- ПО на автомобильном или железнодорожном транспорте
По данным VDC на 2012 год, примерно 28 % разработчиков встраиваемого ПО применяют средства статического анализа, а 39 % собираются начать их использование в течение 2 лет.
Формальные методы
![]() |
Список примеров в этой статье
не основывается на
авторитетных источниках
, посвящённых непосредственно предмету статьи.
|
Инструменты статического анализа
![]() |
В разделе
не хватает
ссылок на источники
(см.
рекомендации по поиску
).
|
Инструменты по анализируемым языкам, некоторый из которых выделяет CISO CLUB :
C/C++:
- BLAST
- (встроен в Clang )
- Coverity
- lint и lock_lint, входящие в состав Sun Studio
- Cppcheck ( )
- Solar appScreener
- (также Fortran и x86 asm)
- PVS-Studio
C#:
Java:
- FindBugs ( )
- PVS-Studio
- Solar appScreener
- Code Warrior
JavaScript:
.NET:
- ( Roslyn ) — фреймворк компилятора для C# и VB.NET, предоставляющий интерфейс для анализатора.
- FxCop
- Microsoft FxCop
- PVS-Studio
- ReSharper
PHP:
- Solar appScreener
- Code Warrior
Python:
- Pylint
- Solar appScreener
Ruby:
- Brakeman
- Code Warrior
Другие: [ источник не указан 2006 дней ]
- T-SQL Analyzer — инструмент, который может просматривать программные модули в базах данных под управлением Microsoft SQL Server 2005 или 2008 и обнаруживать потенциальные проблемы, связанные с низким качеством кода.
- от ЗАО "НПО "Эшелон" (Поиск НДВ, выявление опасных шаблонов по неавторитетный источник ] ) [
- SonarQube — платформа анализа и управления качеством кода с поддержкой различных языков программирования через систему плагинов.
- — коммерческий статический анализатор кода от "НПО "ЭШЕЛОН", предназначенный для автоматизированного поиска дефектов в исходном коде приложений, разработанных на С#, C/C++, Java, PHP.
- — инструмент статического анализа, разработанный в ИСП РАН . Поддерживает языки программирования C/C++, Java, C#. [ неавторитетный источник ]
См. также
Примечания
- Software Quality Objectives for Source Code. Proceedings Embedded Real Time Software and Systems 2010 Conference , ERTS2, Toulouse, France: Patrick Briand, Martin Brochet, Thierry Cambois, Emmanuel Coutenceau, Olivier Guetta, Daniel Mainberte, Frederic Mondot, Patrick Munier, Loic Noury, Philippe Spozio, Frederic Retailleau от 12 марта 2012 на Wayback Machine
- от 15 мая 2018 на Wayback Machine / Блог компании PVS Studio
- Improving Software Security with Precise Static and Runtime Analysis, Benjamin Livshits, section 7.3 "Static Techniques for Security," Stanford doctoral thesis, 2006. от 5 июня 2011 на Wayback Machine
- FDA . Food and Drug Administration (8 сентября 2010). Дата обращения: 9 сентября 2010. 1 сентября 2010 года.
- Computer based safety systems — technical guidance for assessing software aspects of digital computer based protection systems, от 9 октября 2012 на Wayback Machine
- от 6 октября 2013 на Wayback Machine // FAA, Certification Authorities Software Team (CAST), January, 2002: «Verification. A combination of both static and dynamic analyses should be specified by the applicant/developer and applied to the software.»
- Bill Graham. . Дата обращения: 2 сентября 2016. 25 августа 2016 года.
- VDC Research . VDC Research (1 февраля 2012). Дата обращения: 10 апреля 2012. 7 апреля 2012 года.
- (рус.) . cisoclub.ru (11 февраля 2021). Дата обращения: 19 ноября 2021. 19 сентября 2021 года.
- . clang-analyzer.llvm.org. Дата обращения: 14 мая 2016. 8 октября 2011 года.
- Anand Balachandran Pillai. Software Architecture with Python. — Packt Publishing Ltd, 2017. — С. 63-64.
- Adam Goucher, Tim Riley. . — O'Reilly Media, Inc., 2009. — P. .
- от 27 мая 2016 на Wayback Machine , ЗАО "НПО "Эшелон"
- . Дата обращения: 10 ноября 2017. 21 июня 2018 года.
Ссылки
- // «Открытые системы», № 07, 2004
- // «Открытые системы», № 08, 2006
- // Программная инженерия и информационная безопасность. 2013 № 1, стр 50 (npo-echelon.ru)
- // PVS-Studio (viva64.com)
![](https://cdn.wafarin.com/avatars/6a6f9ac08513a095b191a1f0789b03ac.png)
- 2020-01-21
- 1