C'est dommage pour les opinions sur les analyseurs de code statique

Les outils d'analyse de code statique ont été très avancés. Ce ne sont pas du tout les «linters» qui étaient activement utilisés il y a 20 ans. Cependant, beaucoup les appellent encore des outils très simples. C'est dommage. C'est dommage tant pour la méthodologie d'analyse de code en général que pour l'outil PVS-Studio.







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







Si vous souhaitez partager cet article avec un public anglophone, veuillez utiliser le lien de traduction: Andrey Karpov. Opinions bouleversantes sur les analyseurs statiques .



All Articles