AVERTISSEMENT: Mon travail de jour est de travailler pour une entreprise qui développe les outils d'analyse statique.
Je serais surpris si la plupart (si pas tous) les outils d'analyse statique n'avait pas une certaine forme de tête de vérification d'utilisation. Vous pouvez utiliser cette page de wikipedia pour obtenir une liste des outils disponibles et les e-mails des entreprises pour leur demander.
Quelques points à considérer lorsque vous êtes à l'évaluation d'un outil:
Pour la fonction surcharges, vous voulez tous les en-têtes contenant des surcharges pour être visible, pas seulement l'en-tête qui contient la fonction qui a été sélectionné par la résolution de surcharge:
// f1.h
void foo (char);
// f2.h
void foo (int);
// bar.cc
#include "f1.h"
#include "f2.h"
int main ()
{
foo (0); // Calls 'foo(int)' but all functions were in overload set
}
Si vous prenez l'approche par force brute, d'abord supprimer tous les en-têtes, puis rajoutez-les jusqu'à ce qu'il compile, si f1,.h' est ajouté en premier puis le code de la compilation, mais la sémantique du programme ont été modifiées.
Une règle similaire s'applique lorsque vous avez partielle et de spécialisations. Il n'a pas d'importance si la spécialisation est sélectionné ou non, vous devez vous assurer que toutes les spécialisations sont visibles:
// f1.h
template <typename T>
void foo (T);
// f2.h
template <>
void foo (int);
// bar.cc
#include "f1.h"
#include "f2.h"
int main ()
{
foo (0); // Calls specialization 'foo<int>(int)'
}
Comme pour la surcharge exemple, l'approche par force brute peut entraîner un programme qui encore compile mais a des comportements différents.
Un autre type d'analyse que vous pouvez regarder dehors pour est de vérifier si les types peuvent être transmises déclaré. Considérez les points suivants:
// A.h
class A { };
// foo.h
#include "A.h"
void foo (A const &);
// bar.cc
#include "foo.h"
void bar (A const & a)
{
foo (a);
}
Dans l'exemple ci-dessus, la définition de " A " n'est pas nécessaire, et donc le fichier d'en-tête 'foo.h' peut être modifié de sorte qu'il a une déclaration anticipée uniquement pour la "Une":
// foo.h
class A;
void foo (A const &);
Ce genre de vérifier également réduit l'en-tête de dépendances.