Статический анализ кода | это... Что такое Статический анализ кода? (original) (raw)

Стати́ческий ана́лиз ко́да (англ. static code analysis) — анализ программного обеспечения, производимый без реального выполнения исследуемых программ (анализ, производимый с выполнением программ, называется динамический анализ кода). В большинстве случаев анализ производится над какой-либо версией исходного кода, хотя иногда анализу подвергается какой-нибудь вид объектного кода, например P-код или код на MSIL. Термин обычно применяют к анализу, производимому специальным ПО, тогда как ручной анализ называют пониманием или постижением программы.

В зависимости от используемого инструмента глубина анализа может варьироваться от определения поведения отдельных операторов до анализа, включающего весь имеющийся исходный код. Способы использования полученной в ходе анализа информации также различны — от выявления мест, возможно содержащих ошибки, до формальных методов, позволяющих математически доказать какие-либо свойства программы (например, соответствие поведения спецификации).

Некоторые люди считают программные метрики и обратное проектирование формами статического анализа.

В последнее время статический анализ всё больше используется в верификации свойств ПО, используемого в компьютерных системах высокой надёжности.

Содержание

Принципы статического анализа

Большинство компиляторов (например, GNU C Compiler) выводят на экран «предупреждения» (англ. warnings) — сообщения о том, что код, будучи синтаксически правильным, скорее всего, содержит ошибку. Например:

int x; int y = x+2; // Переменная x не инициализирована!

Это простейший статический анализ. У компилятора есть много других немаловажных характеристик — в первую очередь скорость работы и качество машинного кода, поэтому компиляторы проверяют код лишь на очевидные ошибки. Статические анализаторы предназначены для более детального исследования кода.

Типы ошибок, обнаруживаемых статическими анализаторами

void doSomething(const char* x) { char s[40]; sprintf(s, "[%s]", x); // sprintf в локальный буфер, возможно переполнение .... }

Object *p = getObject(); int pNum = reinterpret_cast(p); // на x86-32 верно, на x64 часть указателя будет потеряна; нужен size_t

dest.x = src.x + dx; dest.y = src.y + dx; // Ошибка, надо dy!

std::wstring s; printf ("s is %s", s);

void doSomething(int n, bool flag) // flag всегда равен true { if (flag) { // какая-то логика } else { // код есть, но не задействован } }

doSomething(n, true); ... doSomething(10, true); ... doSomething(x.size(), true);

std::string s; ... s.empty(); // код ничего не делает; вероятно, вы хотели s.clear()?

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

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

См. также

Примечания

  1. 1 2 Распознаётся PVS-Studio [1]

Ссылки