Um dia do suporte ao usuário do PVS-Studio

Quadro 2

Congratulamo-nos com qualquer conversa sobre a qualidade do código. Nossos clientes, estudantes e outros usuários de todos os cantos da Internet nos escrevem. Independentemente do país, fuso horário ou idioma. Bem, linguagem falada, não programação. Entre as linguagens de programação, até agora estamos interessados ​​em um conjunto limitado. No momento, é C, C ++, C # e Java. Existem muitos benefícios na comunicação. Implementamos algumas sugestões de usuários imediatamente, porque elas são realmente úteis. Frequentemente, apenas ajudamos o projeto de alguém, explicando os avisos do analisador, que acabam sendo erros. Esta nota é sobre esse caso.

Sobre o analisador


O PVS-Studio é uma ferramenta projetada para detectar erros e possíveis vulnerabilidades no código fonte dos programas, escritos em C, C ++, C # e Java. Funciona em ambiente Windows, Linux e macOS.

Existem três formulários de feedback para entrar em contato conosco:

  1. Comentários
  2. Pedido de avaliação
  3. Pedido de preço

Quinta à noite


Um usuário ativo que tentou o analisador em seu código começou a enviar avisos falsos. Antes que eu pudesse responder, já havia três e-mails. Era o fim do dia útil e eu estava cansado (falando sobre a questão da confiabilidade da revisão manual do código). Nossa equipe estava se preparando ativamente para um lançamento forjado, que estava a alguns dias de distância.

Decidi responder na sexta-feira ou até na próxima semana:

Olá Constantine

Analisaremos seus avisos. Na próxima semana vou comentar sobre lugares suspeitos :-)

Esta nota é sobre a eficácia da análise de código estático. A revisão manual do código será inferior à verificação automática em muitos casos, especialmente no final do dia.

Com a permissão do usuário, cito nossos e-mails:

Email 1

Avisos V712 falso-positivos:

uint32_t StartUpCounter = 0, HSEStatus = 0; RCC->CR |= ((uint32_t)RCC_CR_HSEON); /* Wait till HSE is ready and if Time out is reached exit */ { HSEStatus = RCC->CR & RCC_CR_HSERDY; StartUpCounter++; } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); // V712... 

Email 2

V715 falso positivo para o mesmo fragmento:

 { // V715 ... lpmode.cpp 356 HSEStatus = RCC->CR & RCC_CR_HSERDY; StartUpCounter++; } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT)); 

Email 3

Gatos sagrados, um lugar tão assombrado! O analisador reclama do mesmo fragmento (veja o código dos emails anteriores):

V560 Uma parte da expressão condicional é sempre verdadeira: (StartUpCounter! = ((Uint16_t) 0x5000)). lpmode.cpp 356

V776 Loop potencialmente infinito. A variável na condição de saída do loop 'HSEStatus == 0' não altera seu valor entre as iterações. lpmode.cpp 356

Talvez eu não receba alguma coisa? Mas, na prática, tudo funciona e, se o quartzo não iniciar, sairemos desse fragmento com o tempo limite ;-)

Email 4 (resposta)

Olá Constantine

Analisaremos seus avisos. Na próxima semana vou comentar sobre lugares suspeitos :-)

Email 5

Droga! Somente após o seu e-mail, notei que a declaração "do" foi perdida ... Finalmente, tudo caiu em um buraco! Parece que perdi completamente a nitidez dos olhos%)

faça {...} enquanto (...);

Conclusão


Como você deve ter notado, havia quatro avisos do analisador para o mesmo fragmento, mas ainda levou tempo para convencer o usuário de que havia um erro. Em tal situação, a revisão manual nem teria chance.

Uma história semelhante com final feliz: " Como o PVS-Studio se mostrou mais atento do que três programadores e meio "

Use analisadores estáticos em seu projeto. Eles não substituem a revisão de código por colegas, mas adicionam suporte ao controle de qualidade do código.

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


All Articles