Стати́ческий ана́лиз ко́да (англ.static code analysis) — анализ исходного кода программного обеспечения, производимый без реального выполнения исследуемых программ (в отличие от динамического анализа). В большинстве случаев анализ производится над исходным кодом, хотя, иногда анализу подвергается объектный код, например P-код или код на MSIL. Термин обычно применяют к анализу, производимому специальным программным обеспечением (ПО), тогда как ручной анализ называют «program understanding», «program comprehension» (пониманием или постижением программы).
В зависимости от используемого инструмента глубина анализа может варьироваться от определения поведения отдельных операторов до анализа всего имеющегося кода. Способы использования полученной в ходе анализа информации также различны — от выявления мест, возможно содержащих ошибки (утилиты типа Lint), до формальных методов, позволяющих математически доказать какие-либо свойства программы (например, соответствие поведения спецификации).
В некоторых источниках программные метрики и обратное проектирование относятся к формам статического анализа. Получение метрик (англ.software quality objectives) и статический анализ часто совмещаются, особенно при создании встраиваемых систем.[1]
Примером простейшего синтаксического анализа являются генерируемые большинством компиляторов (например, GNU C Compiler) «предупреждения» (англ.warnings) — диагностические сообщения о потенциальной ошибочности синтаксически правильного кода. Например, для следующего кода на C может быть получено сообщение о неинициализированной переменной:
intx;inty=x+2;// Переменная x не инициализирована!
В связи с высокими требованиями к скорости компиляции и качеству машинного кода компиляторы проверяют код лишь на простейшие ошибки. Статические анализаторы предназначены для более детального исследования кода.
Неопределённое поведение — неинициализированные переменные, обращение к NULL-указателям. О простейших случаях сигнализируют и компиляторы;
Нарушение алгоритма пользования библиотекой. Например, во многих языках программирования каждому открытию файла должно соответствовать его закрытие, поэтому, если файловая переменная теряется раньше, чем файл закрывается, анализатор может сообщить об ошибке;
Object*p=getObject();intpNum=reinterpret_cast<int>(p);// на x86-32 верно, на x64 часть указателя будет потеряна; следует использовать intptr_t
Ошибки в повторяющемся коде. Многие программы исполняют несколько раз схожий код, обычно не создаваемый с нуля, а размножаемый и исправляемый.
dest.x=src.x+dx;dest.y=src.y+dx;// Опечатка: вместо dy указан dx
Ошибки форматных строк — в функциях форматированного ввода и вывода (например, printf) форматная строка может не соответствовать реальному количеству и типам параметров.
std::wstrings;printf("s is %s and d is %d",s);
Неизменный параметр, передаваемый в функцию, может свидетельствовать об изменившихся требованиях к программе или об ошибке при кодировании. В первом случае программист может избавиться от этого параметра и от связанной с ним логики.
voiddoSomething(boolflag)// flag всегда равен true{if(flag)// какая-то логикаelse// код есть, но не задействован}...doSomething(true);...
Утечки памяти и других ресурсов. В целом статические анализаторы проигрывают в сфере поиска утечек динамическим анализаторам кода[2][неавторитетный источник].
Traverser*t=newTraverser(Name);if(!t->Valid()){returnFALSE;// return до освобождения памяти.deletet;}
Вызов функций, не имеющих побочного эффекта как процедур (без сохранения возвращаемого значения):
std::strings;...s.empty();// код ничего не делает; возможно, опечатка и должно быть s.clear()?
Прочие ошибки.
Применение
В последнее время статический анализ всё больше используется в верификации свойств ПО, используемого в компьютерных системах высокой надёжности, особенно критичных для жизни (safety-critical[англ.]). Также применяется для поиска кода, потенциально содержащего уязвимости (иногда это применение называется Static Application Security Testing, SAST).[3]
Статический анализ постоянно применяется для критического ПО в следующих областях:
ПО для авиации (в комбинации с динамическим анализом)[6];
ПО на автомобильном или железнодорожном транспорте[7].
По данным VDC на 2012 год, примерно 28 % разработчиков встраиваемого ПО применяют средства статического анализа, а 39 % собираются начать их использование в течение 2 лет.[8]
Формальные методы
Список примеров в этой статье не основывается на авторитетных источниках, посвящённых непосредственно предмету статьи.
Добавьте ссылки на источники, предметом рассмотрения которых является тема настоящей статьи (или раздела) в целом, а не отдельные элементы списка. В противном случае список примеров может быть удалён.
T-SQL Analyzer — инструмент, который может просматривать программные модули в базах данных под управлением Microsoft SQL Server 2005 или 2008 и обнаруживать потенциальные проблемы, связанные с низким качеством кода;
SonarQube — платформа анализа и управления качеством кода с поддержкой различных языков программирования через систему плагинов.