Un giorno dal supporto utenti PVS-Studio

Un giorno dal supporto utenti PVS-Studio

Diamo il benvenuto a qualsiasi chat sulla qualità del codice. I nostri clienti, studenti e altri utenti da tutti gli angoli di Internet ci scrivono. Indipendentemente dal paese, dal fuso orario o dalla lingua. Beh, parlare la lingua, non la programmazione. Tra i linguaggi di programmazione, siamo finora interessati a un insieme limitato. In questo momento, sono C, C++, C# e Java. Ci sono molti vantaggi dalla comunicazione. Attuiamo subito alcuni suggerimenti degli utenti, perché sono davvero utili. Spesso ci limitiamo a dare una mano con il progetto di qualcuno spiegando gli avvisi dell'analizzatore, che finiscono per essere errori. Questa nota riguarda questo caso.

Informazioni sull'analizzatore

PVS-Studio è uno strumento progettato per rilevare errori e potenziali vulnerabilità nel codice sorgente dei programmi, scritti in C, C++, C# e Java. Funziona in ambiente Windows, Linux e macOS.

Ci sono tre moduli di feedback per contattarci:

  • Commenti
  • Richiesta di prova
  • Richiesta di prezzo

Giovedì sera

Un utente attivo che ha provato l'analizzatore sul suo codice ha iniziato attivamente a inviare falsi avvisi. Prima che potessi rispondere, c'erano già 3 email. Era la fine della giornata lavorativa ed ero stanco (parlando della questione dell'affidabilità della revisione manuale del codice). Il nostro team si stava attivamente preparando per un rilascio ad alto volume, che sarebbe avvenuto tra pochi giorni.

Ho deciso di rispondere venerdì o anche durante la prossima settimana:

Ciao Costantino.

Esamineremo i tuoi avvisi. La prossima settimana commenterò i luoghi sospetti :-)

Questa nota riguarda l'efficacia dell'analisi del codice statico. In molti casi, la revisione manuale del codice sarà inferiore al controllo automatico, soprattutto alla fine della giornata.

Con il permesso dell'utente, ti citerò le nostre mail:

Email 1

Avvisi V712 falsi positivi:

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 per lo stesso frammento:

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

Email 3

Santo gatto, un posto così infestato! L'analizzatore si lamenta dello stesso frammento (vedi il codice delle email precedenti):

V560 Una parte dell'espressione condizionale è sempre vera:(StartUpCounter !=((uint16_t) 0x5000)). lpmode.cpp 356

V776 Ciclo potenzialmente infinito. La variabile nella condizione di uscita del ciclo 'HSEStatus ==0' non cambia il suo valore tra le iterazioni. lpmode.cpp 356

Forse non ho ricevuto qualcosa? Ma in pratica funziona tutto, e se il quarzo non si avvia, usciamo da questo frammento in timeout;-)

Email 4 (risposta)

Ciao Costantino.

Esamineremo i tuoi avvisi. La prossima settimana commenterò i luoghi sospetti :-)

Email 5

Dannazione! Solo dopo la tua email, ho notato che l'affermazione "do" è mancata... Alla fine, tutto è caduto in un solco! Sembra che abbia perso completamente la nitidezza degli occhi %)

fai {...} mentre (...);

Conclusione

Come avrai notato, c'erano 4 avvisi dell'analizzatore per lo stesso frammento, ma ci è voluto ancora del tempo per convincere l'utente che c'era un errore. In una situazione del genere, la revisione manuale non avrebbe nemmeno una possibilità.

Una storia simile a lieto fine:"Come PVS-Studio si è dimostrato più attento di tre programmatori e mezzo"

Usa analizzatori statici nel tuo progetto. Non sostituiscono la revisione del codice con i colleghi, ma aggiungono supporto al controllo della qualità del codice.