La raison d'un peu de tristesse était le commentaire sur l'un de nos articles. Dans cet article, il a été écrit que l'analyseur détecte une faute de frappe en émettant un avertissement au code suivant:
if (A[0] == 0)
{
X = Y;
if (A[0] == 0)
....
}
L'analyseur dit que la deuxième condition est toujours vraie. En effet, si vous examinez le corps de la fonction, il devient clair qu'un autre élément du tableau doit être vérifié.
À ce sujet, un commentaire a été reçu à peu près comme suit:
Oui, l'analyseur indique une erreur ici. Mais en général, cet avertissement est incorrect. Après tout, entre deux vérifications identiques, la valeur de l'élément peut changer, puis la deuxième vérification aura du sens.Je suis triste. Les programmeurs pensent toujours que les analyseurs de code sont construits sur des expressions régulières. On aurait trouvé deux identiques imbriqués si et jurer.
Naturellement, tout analyseur statique moderne suit les changements de valeur des variables. Si la variable ne change pas, il y aura un message. S'il change, il n'y aura pas de message. Pour cela, la technologie d'analyse des flux de données est utilisée.
C'est exactement ce que fait l'analyseur statique PVS-Studio. Jetons un coup d'œil à l'exemple synthétique suivant:
char get();
int foo(char *p, bool arg)
{
if (p[1] == 1)
{
if (arg)
p[0] = get();
if (p[1] == 1) // Warning
return 1;
}
if (p[2] == 2)
{
if (arg)
p[2] = get();
if (p[2] == 2) // Ok
return 2;
}
return 3;
}
Le code contient deux blocs similaires. Dans l'un, la variable vérifiée ne change pas, et dans le second, elle change. Par conséquent, l'analyseur émet un avertissement uniquement pour le premier bloc: V547 Expression 'p [1] == 1' est toujours vraie.
Les programmeurs n'ont pas à s'inquiéter. Les outils modernes sont avancés et n'émettent des avertissements que pour le code vraiment suspect. Il y a des faux positifs, mais, en règle générale, ils sont associés à la présence d'un code déroutant, ce qui peut être difficile à comprendre même pour une personne.
Liens supplémentaires
- Exemples d'erreurs détectées par le diagnostic V547 .
- Analyse statique et expressions régulières (pourquoi c'est une mauvaise idée :).
- Technologies utilisées dans l'analyseur de code PVS-Studio pour trouver des bogues et des vulnérabilités potentielles .
Si vous souhaitez partager cet article avec un public anglophone, veuillez utiliser le lien de traduction: Andrey Karpov. Opinions bouleversantes sur les analyseurs statiques .