В чем разница между статическим анализом кода и проверкой кода?

9

Я просто хотел узнать, в чем разница между статическим анализом кода и проверкой кода. Как каждый из этих двух сделан? В частности, какие инструменты доступны сегодня для обзора кода / статического анализа PHP? Я также хотел бы знать о хороших инструментах для обзора кода для любого языка.

Томас Оуэнс
источник
Обзор кода, как правило, представляет собой ручной процесс, при котором другой программист просматривает ваш код. Это способ обнаружить небольшие ошибки или отклонения от правил кодирования и т. Д., А также хороший способ улучшить общее качество кода. Статический анализ кода - это то, что вы можете использовать инструмент, хотя я никогда не делал это сам. Интересно посмотреть, что ответят другие
9
В двух словах? "Мозг".
MSalters

Ответы:

19

Проверка кода - это то, что делают люди, статический анализ - это то, что делают машины. Есть (иногда хорошие) инструменты статического анализа. Проверка кода - это когда коллега / наставник / профессор / друг просматривает ваш код и дает вам конструктивную критику.

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

Рэйф Кеттлер
источник
2
У меня всегда было впечатление, что проверка кода - это своего рода статический анализ, поскольку это способ измерения работоспособности программного обеспечения без его выполнения.
Буб
4
@Buhb: это существенно добавляет знание контекста. Рецензент кода должен понимать, выполняет ли код то, что от него ожидается. Статический инструмент (в лучшем случае, если язык позволяет это с помощью некоторого оформления / утверждения / контракта) проверяет, что формально все в порядке ... Таким образом, вы могли бы выразить это иначе: статический анализ - это своего рода проверка кода, выполненная алгоритмический.
Франческо
Просто добавлю, Линт (статический аналитик): Чувак, который не нужен !! Коллега (Рецензент): Вы тоже можете это сделать !!
Кушал
11

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

  1. разные инструменты статического анализа имеют разное понимание код, который они изучают, поэтому они могут сигнализировать (или не сигнализировать) о различных проблемах. Один инструмент может дать чистый отчет, а другой может жаловаться на миллион вещей.
  2. динамический инструмент (например, например, valgrind) может найти много других проблем ценой серьезной нагрузки на потребление ресурсов (время, использование памяти). Это так, потому что вы обычно используете инструментальную версию программного обеспечения. Обратите внимание, что, будучи каким-то образом инструментированным (замените ваш malloc на отладочный malloc), он не совсем идентичен вашему программному обеспечению (как вы можете видеть из времени выполнения)

Оба этих подхода страдают от недостатка контекста: они не знают, чего должен достичь sw.

Проверка кода выполняется другим программистом, который предположительно знает это и может проверить

  1. если код правильный
  2. если программное обеспечение семантически правильно.

Это намного дороже и имеет различную степень повторяемости, но очень помогает.

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

PS: я должен отметить, что обычно гораздо лучше применять инструменты с нуля. Преобразование унаследованной системы является гораздо менее приятным опытом из-за ложных срабатываний. Если вы начинаете с нуля и всегда стремитесь поддерживать чистоту инструмента анализа, вы, вероятно, избежите многих проблем.

pps: что касается инструментов, это зависит от языка. В мире C и C ++ вы можете начать с просмотра самой Visual Studio, которая содержит встроенный инструмент статического анализа. Относительно полный список можно найти в Википедии.

ppps: статический анализ больше подходит для статических языков, таких как C или C ++. Для Python может быть действительно трудно сказать, будет ли имя, которое ссылается на список в точке, ссылаться на список для остальной части программы из-за его динамических свойств. Это не означает, что ничего нельзя сделать, как показывает JIT-попытка, подобная PyPy .

Francesco
источник
2

Проверка кода - это когда старший или специализированный орган проверяет ваш код, ваш способ кодирования, стандарты, соблюдаемые в коде, и, в частности, логический уровень кода

Что касается статического анализа, то это анализ компьютерного программного обеспечения, который выполняется без фактического выполнения программ, созданных из этого программного обеспечения (анализ, выполняемый на исполняемых программах, называется динамическим анализом).

Список инструментов согласно технологии приведен в ссылке ниже

Список инструментов для статического анализа

Следовательно, обзор кода и статический анализ - это совершенно разные термины.

О.М. Вечность
источник
7
Ответ ОМ по сути правильный, за исключением того, что я придираюсь к «Старший или выделенный орган проверяет ваш код ...». Это правда, что некоторые нефункциональные магазины проводят проверки кода таким образом, как родитель / ребенок, во многих (и лучше) магазинах есть система однорангового анализа кода, которая не похожа на то, как учитель оценивает домашнюю работу. Там, где я работаю, для младшего не менее обычна проверка работы старшего. Цель состоит в том, чтобы вторая пара глаз посмотрела на весь код, прежде чем он будет зарегистрирован.
Джим В Техасе
2
@JimInTexas, то же самое в нашем магазине. Я бы сказал, что наиболее важным (долгосрочным) результатом проверок кода является распространение знаний, унификация практик и архитектурно-дизайнерское видение в команде. В этом отношении, младший просмотр кода старшего в худшем случае является отличным способом изучения лучших местных практик, но кто сказал, что старший никогда не делает ошибок, а младший никогда их не заметит?
Петер Тёрёк
1

Обзор кода - более качественная оценка, статический анализ кода - более количественная оценка.

Эй, парень, этот метод можно написать лучше

против Fe

Снижение производительности. Неэффективно идентифицировать пустую строку с помощью конструкции 'wcslen (str)> 0'. Более эффективным способом является проверка: str [0]! = '\ 0'.

Снижение производительности. Выражение типа strlen (MyStr.c_str ()) можно переписать как MyStr.length ()

Снижение производительности. В случае, если 'Order' является итератором, более эффективно использовать префиксную форму приращения. Замените итератор ++ итератором ++.

Хотя реальные ошибки могут (очевидно) существовать и обнаруживаться SCA

Неверный формат. Рассмотрите возможность проверки фактического аргумента N функции 'Foo'

Выражение было заключено в круглые скобки дважды: ((выражение)). Одна пара скобок не нужна или присутствует опечатка

Вызов функции memset приведет к переполнению буфера dest.lfFaceName

Ленивый Барсук
источник
извините, что оскорбляю вас. Что было сказано в моем (исчезнувшем?) Комментарии - знаете ли вы какую-либо причину, по которой человек не может предлагать те же комментарии, которые вы предоставляете в качестве примеров результатов статического анализа кода?
sq33G
@ sq33G: Нет. Любой человек с канцелярскими товарами (практически бесконечное количество бумаги) может смоделировать произвольную машину Тьюринга. Однако это скучно и отнимает много времени. (Возможно, не тот, который дан, но говорят неопределенное поведение в C).
Maciej Piechotka
Ах. Таким образом, реальный ответ на вопрос ОП состоит в том, что машины Тьюринга не полны человека.
sq33G
0

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

Отзывы - это оценка человеком какого-либо рабочего продукта, который может быть кодом. Обзоры могут также проводиться на дизайн или другие документы. Идея состоит в том, что люди, знакомые с рабочим продуктом, а не разработчиком, смотрят на него, чтобы найти ошибки, начиная от проблем безопасности до нарушений стандарта кодирования.

Технически анализ кода можно считать формой статического анализа, поскольку код фактически не выполняется во время просмотра. Однако в общепринятой терминологии «статический анализ» обычно относится к машинному анализу исходных или объектных файлов, в то время как «обзор» указывает, что анализом занимаются люди.

Томас Оуэнс
источник
-2

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

Статический анализ используется для анализа метрик качества кода, таких как циклометрическая сложность, индекс ремонтопригодности, глубина наследования и связи классов. Различные инструменты, доступные на рынке для анализа качества кода. C # разработчик использует Microsoft Visual Studio для создания метрических отчетов.

Balasubramanian.S
источник
-3

Статический анализ кода выполняется с помощью автоматизированного инструмента, проверка кода выполняется с людьми, прежде чем код будет зафиксирован.

Инструменты для проверки кода:

1. вне сравнения

2. разница программного обеспечения для контроля версий

Эти инструменты всегда используются для генерации разницы между старой версией и новой версией.

Upton
источник
2
1) Это не должно быть до того, как код будет зафиксирован - проверка кода выполняется людьми, и 2) я нахожу описание инструментов сравнения как инструментов обзора кода "интересным", конечно, это инструменты, используемые для идентификации кода для проверки, но если Меня спросили об инструментах проверки кода, я, вероятно, указал на те, которые помогают управлять процессом (например, я использовал Kiln и Crucible).
Murph