Un vérificateur rapide et sale qui détecte une itération non déterministe par exemple
std::unordered_map<...> map;
for (auto [k, v] : map) {
...
}
std::map<Something *, ...> map;
for (auto [k, v] : map) {
...
}
Les avertissements ne sont signalés que si des fonctions avec des noms prédéfinis (par exemple printf ) sont rencontrées dans une boucle.
Le pointeur de la CSA ne signale pas une itération non déterministe ni sur des conteneurs ordonnés de pointeurs, ni sur des conteneurs non ordonnés de non-pointes.
Pour construire, installer (sur Debian / Ubuntu) llvm , libclang-dev et libpcre3-dev :
$ sudo apt-get install llvm libclang-dev libpcre3-dev
et courir
$ make clean all
Pour construire des versions de débogage ou désinfectées, make avec DEBUG=1 , ASAN=1 ou UBSAN=1 .
Exécutez bin/find-flaky sur les fichiers qui vous intéressent:
$ bin/find-flaky tests/3-unordered-map-notok.cc
find-flaky: warning: calling IO function 'printf' inside flaky loop
Par défaut, l'outil recherche les fonctions IO les plus courantes (comme printf ) mais vous fournissez vos propres modèles:
$ cat patterns.txt
# A useful comment
my_debug_fun
# Another one
other_fun
$ bin/find-flaky --patterns patterns.txt ...
Les drapeaux de compilation personnalisés (généralement -D et -I ) peuvent être fournis avec le paramètre --cflags et la verbosité peut être définie avec un drapeau -v . Pour des options supplémentaires, exécutez bin/find-flaky -h .
Construire puis courir
$ make test
Found no errors