Interested Article - Статический анализ кода

Стати́ческий ана́лиз ко́да ( англ. 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).

Статический анализ постоянно применяется для критического ПО в следующих областях:

  1. ПО для медицинских устройств.
  2. ПО для атомных станций и систем защиты реактора ( )
  3. ПО для авиации (в комбинации с динамическим анализом)
  4. ПО на автомобильном или железнодорожном транспорте

По данным VDC на 2012 год, примерно 28 % разработчиков встраиваемого ПО применяют средства статического анализа, а 39 % собираются начать их использование в течение 2 лет.

Формальные методы

Инструменты статического анализа

Инструменты по анализируемым языкам, некоторый из которых выделяет CISO CLUB :

C/C++:

C#:

Java:

JavaScript:

.NET:

PHP:

Python:

  • (англ.)
  • Pylint
  • Solar appScreener

Ruby:


Другие: [ источник не указан 2006 дней ]

  • T-SQL Analyzer — инструмент, который может просматривать программные модули в базах данных под управлением Microsoft SQL Server 2005 или 2008 и обнаруживать потенциальные проблемы, связанные с низким качеством кода.
  • от ЗАО "НПО "Эшелон" (Поиск НДВ, выявление опасных шаблонов по (англ.) [ неавторитетный источник ] )
  • SonarQube — платформа анализа и управления качеством кода с поддержкой различных языков программирования через систему плагинов.
  • — коммерческий статический анализатор кода от "НПО "ЭШЕЛОН", предназначенный для автоматизированного поиска дефектов в исходном коде приложений, разработанных на С#, C/C++, Java, PHP.
  • — инструмент статического анализа, разработанный в ИСП РАН . Поддерживает языки программирования C/C++, Java, C#. [ неавторитетный источник ]

См. также

Примечания

  1. 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
  2. от 15 мая 2018 на Wayback Machine / Блог компании PVS Studio
  3. 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
  4. FDA . Food and Drug Administration (8 сентября 2010). Дата обращения: 9 сентября 2010. 1 сентября 2010 года.
  5. Computer based safety systems — technical guidance for assessing software aspects of digital computer based protection systems, от 9 октября 2012 на Wayback Machine
  6. от 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.»
  7. Bill Graham. . Дата обращения: 2 сентября 2016. 25 августа 2016 года.
  8. VDC Research . VDC Research (1 февраля 2012). Дата обращения: 10 апреля 2012. 7 апреля 2012 года.
  9. (рус.) . cisoclub.ru (11 февраля 2021). Дата обращения: 19 ноября 2021. 19 сентября 2021 года.
  10. . clang-analyzer.llvm.org. Дата обращения: 14 мая 2016. 8 октября 2011 года.
  11. Anand Balachandran Pillai. Software Architecture with Python. — Packt Publishing Ltd, 2017. — С. 63-64.
  12. Adam Goucher, Tim Riley. . — O'Reilly Media, Inc., 2009. — P. .
  13. от 27 мая 2016 на Wayback Machine , ЗАО "НПО "Эшелон"
  14. . Дата обращения: 10 ноября 2017. 21 июня 2018 года.

Ссылки

  • // «Открытые системы», № 07, 2004
  • // «Открытые системы», № 08, 2006
  • // Программная инженерия и информационная безопасность. 2013 № 1, стр 50 (npo-echelon.ru)
  • // PVS-Studio (viva64.com)
Источник —

Same as Статический анализ кода