Кратък преглед на анализаторите на статичен C код

Кратък преглед на анализаторите на статичен C/C++ код

Когато пишат код на C и C++, хората правят грешки. Много от тези грешки се откриват благодарение на -Wall , твърдения, тестове, щателни прегледи на кода, предупреждения от >

CppCheck е безплатен статичен анализатор за различни платформи с отворен код (GPLv3). Предлага се в пакети за много *nix системи извън кутията. CppCheck може също да се интегрира с много IDE. Към момента на писане CppCheck е жив, развиващ се проект.

[some.c:57]: (грешка) Често срещана грешка при преразпределяне: 'numarr' е анулиран, но не освободен при повреда

[some.c:154]: (грешка) Опасно използване на 'n' (strncpy не винаги го завършва с нула)

CppCheck е добър, защото работи доста бързо. Няма причина да не добавите неговото изпълнение към системата за непрекъсната интеграция, за да поправите директно всички-всички-всички предупреждения, които показва. Дори въпреки факта, че много от тях се оказват фалшиви положителни резултати на практика.

Clang статичен анализатор

Друг безплатен статичен анализатор за различни платформи с отворен код. Той е част от така наречения стек LLVM. За разлика от CppCheck, той работи много по-бавно, но намира и грешки, които са много по-сериозни.

Пример за създаване на отчет за PostgreSQL:

Пример за създаване на отчет за ядрото на FreeBSD:

Идеята, както може би се досещате, е да се направи почистване и след това да се стартира изграждането под сканиране-изграждане.

Резултатът е много хубав HTML отчет с подробни обяснения, възможност за филтриране на грешки по техния тип и т.н. Не забравяйте да погледнете извън сайта как изглежда.

В този контекст не могаТрябва да се отбележи, че в света на Clang / LLVM има и инструменти за динамичен анализ, така наречените „дезинфектанти“. Има много от тях, намират много готини грешки и работят по-бързо от Valgrind (макар и само под Linux). За съжаление, обсъждането на дезинфектанти е извън обхвата на тази публикация, така че ги проверете сами.

Затворен статичен анализатор, разпространяван срещу пари. PVS-Studio работи само под Windows и само с Visual Studio. Има много информация за съществуването на версия на Linux, но тя не е достъпна на официалния уебсайт. Доколкото разбирам, цената на лиценза се обсъжда индивидуално с всеки клиент. Наличен пробен период.

Тествах PVS-Studio 6.02 на Windows 7 SP1, работещ под KVM с инсталирано Visual Studio 2013 Express Edition. По време на инсталацията PVS-Studio допълнително изтегли .NET Framework 4.6. Изглежда така. Отваряте проекта (тествах на PostgreSQL) във Visual Studio, в PVS-Studio щракнете върху „Ще започна да изграждам проекта сега“, след това във Visual Studio щракнете върху Изграждане, когато изграждането приключи в PVS-Studio щракнете върху „Готово съм“ и вижте отчета.

PVS-Studio наистина намира много готини грешки, които Clang Static Analyzer не вижда (например). Също така много ми хареса интерфейсът, който ви позволява да сортирате и филтрирате грешките по техния тип, тежест, файл, в който са открити и т.н.

Допълнение: Опитах бета версията на PVS-Studio за Linux. Оказа се, че е много лесен за използване. Създайте pvs.conf с нещо подобно:

40 Mb) файл strace_out pvs-studio-analyzer анализ --cfg . /pvs.conf plog-converter -t tasklist -o result.task pvs-output.log

Актуализация: PVS-Studio за Linux е извън бета версия и вече е достъпно за всички.

Сканиране на покритие

Покритиесе счита за един от най-сложните (и следователно скъпи) статични анализатори. За съжаление, на официалния уебсайт е невъзможно да изтеглите дори пробната му версия. Можете да попълните формуляр и ако сте IBM, може да се свържем с вас. С много силно желание за Coverity, някои праисторически версии могат да бъдат намерени по неофициални канали. Предлага се за Windows и Linux и работи приблизително на същия принцип като PVS-Studio. Но без сериен номер или лекарство Coverity няма да ви покаже докладите. И за да намерите сериал или лекарство, трябва да имате не просто много силно желание, а много, много, много силно.

За щастие, Coverity има SaaS версия, наречена Coverity Scan. Coverity Scan не само е достъпен за обикновените смъртни, но е и напълно безплатен. Няма обвързване с конкретна платформа. Само отворени проекти обаче могат да бъдат анализирани с Coverity Scan.

Ето как работи. Регистрирате проекта си през уеб интерфейса (или се присъединявате към съществуващ, но това е по-малко интересен случай). За да видите отчетите, трябва да преминете през модерация, която отнема 1-2 работни дни.

Отчетите се изграждат по този начин. Първо, изграждате проекта си локално със специалния инструмент за изграждане на Coverity. Тази помощна програма е подобна на сканирането от Clang Static Analyzer и е достъпна за всички възможни платформи, включително всякакви екзотични като FreeBSD или дори NetBSD.

Инсталиране на Coverity Build Tool:

Подготовка на тестов проект (използвах кода от бележката Продължете да изучавате OpenGL: прост текстов изход):

След това изграждаме проекта под cov-build:

Важно! Не променяйте името на директорията cov-int.

Архивирайте директорията cov-int:

Качете архива чрез формуляра за качване на компилация на проект. Също така на уебсайта на Coverity Scan еинструкции за автоматизиране на тази стъпка с curl. Изчакайте малко и можете да видите резултатите от анализа. Моля, имайте предвид, че за да преминете модерирането, трябва да изпратите поне една компилация за анализ.

Coverity Scan търси грешки много добре. Със сигурност по-добър от Clang Static Analyzer. В същото време има фалшиви положителни резултати, но те са много по-малко. Удобно е, че уеб интерфейсът има нещо като вграден инструмент за проследяване на грешки, който ви позволява да задавате тежест на грешките, лице, отговорно за коригирането им и подобни неща. Можете да видите кои грешки са нови и кои вече са били в предишни версии. Фалшивите положителни резултати могат да бъдат маркирани като такива и скрити.

Имайте предвид, че не е необходимо да сте собственик, за да анализирате проект в Coverity Scan. Аз лично постигнах доста успех в анализирането на PostgreSQL код, без да се присъединявам към съществуващ проект. Изглежда също така, че със силно желание (например с помощта на подмодули на Git) можете да плъзнете малко и не много отворен код за проверка.

Заключение

Ето още няколко статични анализатора, които не бяха включени в прегледа:

Всеки от анализираните анализатори открива грешки, които другите не откриват. Ето защо в идеалния случай е по-добре да ги използвате всички наведнъж. Правейки това правилно през цялото време, най-вероятно обективно няма да работи. Но извършването на поне едно изпълнение преди всяко издание определено няма да е излишно. В същото време Clang Static Analyzer изглежда най-универсалният и в същото време доста мощен. Ако се интересувате от един анализатор, който трябва да използвате във всеки проект, използвайте го. Но все пак бих препоръчал да използвате допълнително поне PVS-Studio или Coverity Scan.

Какви статични анализатори сте пробвали и/или използвате редовно и какви са вашитевпечатления от тях?