Mais uma vez, o analisador PVS-Studio mostrou-se mais atento do que uma pessoa

Pegue um bug

Estudando os avisos do analisador PVS-Studio no processo de verificação de vários projetos abertos, repetimos sempre o quão útil essa ferramenta pode ser. O analisador de código é incrivelmente atencioso e nunca se cansa. Indica erros que desaparecem mesmo com uma revisão cuidadosa do código. Considere outro caso.

A última vez que escrevi uma nota semelhante , estudando o código-fonte do projeto StarEngine: 2D Game Engine. Agora, o analisador mostrou sua superioridade sobre mim durante a verificação da estrutura Qt.

Na última vez, testamos a estrutura Qt em 2014. Muito tempo se passou, o projeto mudou e muitos novos diagnósticos apareceram no analisador PVS-Studio. Então, é bem possível escrever outro artigo, o que eu escrevi.

Escrevendo exemplos interessantes de erros, me deparei com este código:

QWindowsCursor::CursorState QWindowsCursor::cursorState() { enum { cursorShowing = 0x1, cursorSuppressed = 0x2 }; CURSORINFO cursorInfo; cursorInfo.cbSize = sizeof(CURSORINFO); if (GetCursorInfo(&cursorInfo)) { if (cursorInfo.flags & CursorShowing) // <= V616 .... } 

PVS-Studio emitiu um aviso para este código:

V616 CWE-480 A constante denominada 'CursorShowing' com o valor 0 é usada na operação bit a bit. qwindowscursor.cpp 669

Uma versão instável do PVS-Studio foi usada para verificação, então minha fé no analisador vacilou. "Ah, algo que quebramos nos mecanismos de processamento de transferências sem nome", suspirei e escrevi esse caso para o rastreador de erros como um erro que levava a um falso positivo.

Eu tinha certeza absoluta de que o analisador estava errado. Afinal, com apenas algumas linhas acima, está escrito que a constante CursorShowing é 1.

Ao mesmo tempo, tentei tomar cuidado! Examinei o código várias vezes para garantir que o analisador estivesse errado. Eu projetei esse trecho de código e a mensagem correspondente como um erro no rastreador de erros.

Fiz uma revisão completa deste pequeno pedaço de código e estraguei tudo de qualquer maneira. O analisador está certo, não a pessoa.

Em um estudo detalhado da situação, verificou-se que a constante cursorShowing denominada é declarada acima e a constante CursorShowing é usada na condição. A diferença está apenas na primeira letra! Em um lugar, é minúsculo e em outra capital.

Por que o código está compilando? Porque a constante CursorShowing também existe. Aqui está o anúncio dela:

 class QWindowsCursor : public QPlatformCursor { public: enum CursorState { CursorShowing, CursorHidden, CursorSuppressed }; .... } 

Como você pode ver, a constante CursorShowing é 0. Portanto, o analisador PVS-Studio está absolutamente certo ao dizer que a condição (cursorInfo.flags & CursorShowing) não faz sentido. A condição é sempre falsa.

O analisador encontrou um erro de digitação maravilhoso. Adoro análise de código estático! :)


Se você deseja compartilhar este artigo com um público que fala inglês, use o link para a tradução: Andrey Karpov. Mais uma vez, o analisador PVS-Studio provou ser mais atencioso do que uma pessoa .

Source: https://habr.com/ru/post/pt423771/


All Articles