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)
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 .