Возможно, вам придется иметь дело с хорошим количеством ложных срабатываний, особенно если ваша база кода большая.
Большинство инструментов статического анализа работают с использованием «внутрипроцедурного анализа», что означает, что они рассматривают каждую процедуру изолированно, в отличие от «анализа всей программы», которая рассматривает всю программу.
Обычно они используют «внутрипроцедурный» анализ, потому что «анализ всей программы» должен учитывать многие пути через программу, которая на самом деле никогда не произойдет на практике и, следовательно, может часто генерировать ложноположительные результаты.
Внутрипроцессный анализ устраняет эти проблемы, просто сосредоточив внимание на одной процедуре. Однако для работы обычно требуется ввести «язык аннотации», который вы используете для описания метаданных для аргументов процедуры, типов возвращаемых данных и полей объектов. Для C++ эти вещи обычно реализуются с помощью макросов, которые вы украшаете. Затем аннотации описывают такие вещи, как «это поле никогда не является нулевым», «этот строковый буфер защищен этим целочисленным значением», «к этому полю может быть обращено только поток с надписью« фон »» и т. Д.
Анализ инструмент затем возьмет предоставленные вами аннотации и проверит, что написанный вами код действительно соответствует аннотациям. Например, если вы могли бы передать значение null в значение, помеченное как не равное null, оно будет отмечать ошибку.
В отсутствие аннотаций инструмент должен принять худшее, и поэтому будет сообщаться много ошибок, которые на самом деле не являются ошибками.
Поскольку, похоже, вы уже не используете такой инструмент, вы должны предположить, что вам придется потратить значительное количество времени на аннотирование кода, чтобы избавиться от всех ложных срабатываний, которые изначально будут сообщены. Сначала я запускаю инструмент и подсчитываю количество ошибок. Это должно дать вам оценку того, сколько времени вам потребуется, чтобы принять его в базе кода.
Wether or not the tool стоит того, что зависит от вашей организации. Каковы типы ошибок, которые вам больше всего нравятся? Будут ли они перегружать ошибки? Являются ли они ошибками, вызванными нулевыми ошибками или ошибками памяти? Являются ли они проблематичными? Являются ли они «упущенными, что мы не рассматривали этот сценарий», или «мы не тестировали китайскую версию нашего продукта на литовской версии Windows 98?».
Как только вы выясните, в чем состоят проблемы, вы должны знать, стоит ли это усилий.
Инструмент, вероятно, поможет с ошибками переполнения буфера, нулевой разыгрывания и ошибок утечки памяти. Есть вероятность, что он может помочь с ошибками в потоковой передаче, если он поддерживает анализ «раскраски нитей», «эффектов» или «разрешений». Тем не менее, эти типы анализа довольно передовые и имеют ОГРОМНОЕ нотационное бремя, поэтому они действительно приносят с собой некоторые расходы. Инструмент, вероятно, не поможет с другими типами ошибок.
Таким образом, это действительно зависит от того, какое программное обеспечение вы пишете, и какие ошибки вы используете чаще всего.
John Carmack недавно написал об этом: http://altdevblogaday.com/2011/12/24/static-code-analysis/ –
John Carmack. Анализ статического кода. Новая ссылка: http://www.viva64.com/ru/a/0087/ – 2015-03-25 06:59:52
@DavidNorman: Они все делают только файл по анализу файлов, поэтому, если вы хотите проанализировать, как функции взаимодействуют между файлами источников, вам необходимо нанять сталь несколько народов * (поскольку эти инструменты не могут выполнять весь анализ программы) *. – user2284570