@dmckee
Eh bien, qui ne correspondent pas à l'intérieur d'un commentaire, mais voici la chose:
Tout d'abord, vous écrivez un bon analyseur statique. "Correct", dans ce contexte, signifie qu'il ne va pas rester silencieux si il n'y a rien de douteux sur le code analysé, de sorte à ce stade, vous allègrement l'amalgame entre indéfini et indéterminé des comportements. Ils sont à la fois mauvais et inacceptable dans le code critique, et de vous mettre en garde, à juste titre, pour deux d'entre eux.
Mais vous ne voulez avertir une fois pour un éventuel bug, et aussi vous savez que votre analyseur sera jugé dans les tests de performances en termes de "précision" et "rappel" par rapport à d'autres, peut-être pas correct, analyseurs, donc il ne faut pas avertir deux fois sur un même problème... que ce Soit un vrai ou fausse alarme (vous ne savez pas qui. vous ne savez jamais qui, sinon ce serait trop facile).
Si vous souhaitez émettre un seul avertissement pour
*p = x;
y = *p;
Parce que dès qu' p
est un pointeur valide lors de la première déclaration, il peut être supposé pour être un pointeur valide lors de la deuxième déclaration. Et pas de déduire cette mesure permettra de réduire votre score sur la précision métrique.
Si vous enseignez à votre analyseur de supposer qu' p
est un pointeur valide dès que vous ont mis en garde à ce sujet la première fois dans le code ci-dessus, de sorte que vous n'avez pas prévenu la deuxième fois. Plus généralement, vous apprendre à ignorer les valeurs (et de chemins d'exécution) qui correspondent à quelque chose que vous avez déjà averti.
Ensuite, vous vous rendez compte que pas beaucoup de gens sont de l'écriture de code critique, afin de vous faire d'autres, léger analyses pour le reste d'entre eux, sur la base des résultats de la première analyse correcte. Dire, un programme C de la trancheuse.
Et vous vous dites "eux": Vous n'avez pas à vérifier toutes les (fausses) alarmes émises par la première analyse. Les tranches de programme se comporte de la même que le programme d'origine aussi longtemps qu'aucun d'eux n'est déclenchée. La machine produit des programmes qui sont l'équivalent pour le découpage de critère pour "défini" les chemins d'exécution.
Et les utilisateurs gaiement ignorer les alarmes et l'utilisation de la trancheuse.
Et puis vous vous rendez compte que peut-être il y a un malentendu. Par exemple, la plupart des implémentations de memmove
(vous savez, celui qui gère les blocs qui se chevauchent) invoquer un comportement non spécifié lorsqu'il est appelé, avec des liens qui ne pointent pas sur le même bloc (en comparant les adresses qui ne pointent pas sur le même bloc). Et votre analyseur d'ignorer les deux chemins d'exécution, parce que les deux ne sont pas spécifiés, mais dans la réalité les deux chemins d'exécution sont équivalents et tout est bien.
Donc il ne devrait pas y avoir de malentendu sur la signification des alarmes, et si l'on a l'intention de les ignorer, seulement incomparable des comportements indéfinis, devraient être exclues.
Et c'est ainsi que vous vous retrouvez avec un fort intérêt dans la distinction entre un comportement non spécifié et un comportement indéfini. Personne ne peut vous blâmer pour en ignorant cette dernière. Mais les programmeurs vont écrire l'ancienne, sans même y penser, et quand vous dites que votre trancheuse exclut les "mauvais comportements" du programme, ils ne vont pas se sentir comme ils sont concernés.
Et c'est la fin d'une histoire qui n'a certainement pas de place dans un commentaire. Mes excuses à tous ceux qui ont lu jusque-là.