Иногда на сайте stackoverflow.com мы видим очередной вопрос, как искать баги определённого типа. И знаем, что решением проблемы может стать использование PVS-Studio. К сожалению, мы вынуждены молчать, иначе ответ будет интерпретирован как неприкрытая реклама. Это статья про наши душевные муки, где рассмотрен конкретный пример такой ситуации.
Поводом начать писать этот текст, стал вопрос "Scan-Build for clang-13 not showing errors", заданный неким kratos из Индии. Человек спрашивает, как искать паттерны следующего типа:
Код, который он приводит в качестве примера:
int f1(){
int a=5;
short b=4;
bool a1=a;//maybe warn
bool b1=b;//maybe warn
if(a1&&b1)return 1;
return 0;
}
class M{
public:
virtual int GetAge(){return 0;}
};
class P:public M{
public:
virtual int GetAge(){return 1;}
P(){GetAge();}//maybe warn
~P(){GetAge();}//maybe warn
};
int main(){
return 0;
}
Для поиска ошибок, он пытается использовать компилятор Clang 13, но у него не получается.
Я не знаю, можно найти такие ошибки с помощью Clang или нет. Я не изучал этот вопрос. Скорее всего, можно, нужно только указать компилятору правильные флажки.
Однако меня так и подмывает дать ответ, суть которого: попробуй PVS-Studio. Хотя нет, для ответа слишком мало. Скажем так, мне очень хочется написать приблизительно такой комментарий:
Не могу подсказать, можно ли искать эти ошибки с помощью Clang, но однозначно эти ошибки сразу находит статический анализатор PVS-Studio: пример на сайте Compiler Explorer. Попробуй, быть может, он подойдёт лучше :)
На первый подозрительный паттерн анализатор реагирует сразу двумя способами. Поэтому всего получается 4 предупреждения:
И ещё два сообщения относятся к вызову виртуальных функций:
Эта информация могла бы быть вполне полезной для некоторых программистов. Но, к сожалению, про это никто не узнает на Stack Overflow :(.
Мало того, что в ответе упоминается коммерческий инструмент, так ещё это первый вопрос, который задаёт человек.
Будет выглядеть, как будто я специально создал виртуального пользователя, задал вопрос и сам ответил на него, чтобы представить PVS-Studio в выгодном свете.
Нельзя ничего отвечать. А то ещё забанят, усмотрев в этом тупой спамерский приём :). Сами спросили, сами ответили... Хоть бы виртуала, задающего вопрос, прокачали... Совсем ленивые :).
В общем, на Stack Overflow я ничего не написал, зато сделал эту маленькую заметку. И мне легче на душе стало, и читателям необычная история из жизни команды PVS-Studio :).
Примечание. Кто-то может едко заметить, что такой комментарий будет действительно являться рекламой проприетарного инструмента. И правильно, что за такое оштрафуют/забанят. Не согласен. С точки зрения многих разработчиков, никакой разницы нет. Есть множество сценариев, когда PVS-Studio можно использовать бесплатно: "Бесплатные варианты лицензирования PVS-Studio".
Спасибо за внимание. И, раз уж речь шла про Clang, приглашаю заодно заглянуть в недавнюю заметку "Выявляем ошибки в релизе LLVM 13.0.0". Безбажного вам кода!