162
Code review – это систематическая проверка исходного кода, проводящаяся
для того, чтобы обнаружить ошибки, допущенные на стадии разработки,
улучшить качество программы и навыки разработчиков.
Обычно code review включает участие:
• человека, который код писал;
• человека (или людей), которые этот код могут читать и понимать,
насколько хорошо он удовлетворяет общим и конкретным критериям.
Общие
критерии представляют собой стандарты кодирования (coding
standard). Конкретные критерии подразумевают знания требований, для
удовлетворения которых код написан.
Процедура анализа кода отличается от тестирования. При тестировании
программа проверяется на некотором наборе входных данных с целью
выявления несоответствия действительного поведения программы
специфицированному. Однако спецификация может определять поведение
программы лишь на подмножестве множества всех возможных
входных
данных. Таким образом, не все ошибки могут быть определены при помощи
тестирования. Для этого и нужно проводить анализ кода, который позволяет
обнаружить такие ошибки, а точнее уязвимые места исходного кода:
переполнение буферов, неинициализированная память, указатели (null-pointer),
«утечка» памяти, состояние гонок и др. Примеры такого рода ошибок можно
увидеть в статье,
посвященной статическому или динамическому анализу кода.
Можно сказать, что анализ исходного кода – это процесс получения
информации о программе из ее исходного кода или объектного кода. Исходный
код – это статическое, текстовое, удобочитаемое, исполняемое описание
компьютерной программы, которое может быть скомпилировано
автоматически в исполняемый код.
Анализ исходного кода включает три компонента:
1. Парсер
(parser), который выполняет синтаксический разбор исходного
кода и преобразует результаты анализа в одну или несколько форм
внутреннего представления. Большинство парсеров (синтаксических
анализаторов) основываются на компиляторах.
2. Внутреннее представление, которое абстрагирует конкретный аспект
программы и представляет его в форме, пригодной для выполнения
автоматического анализа. Например, переменные заменяются
соответствующими типами данных. Некоторые внутренние
представления создаются непосредственно парсерами, другие требуют
результатов предыдущего анализа. Классическими примерами таких
представлений является граф потоков управления (control-flow graph,
CFG), дерево вызовов (call graph), абстрактное синтаксическое дерево
(abstract syntax tree, AST), форма статического единственного
присваивания (static single assignment, SSA).