Um verificador rápido e sujo que detecta iteração não determinística, por exemplo
std::unordered_map<...> map;
for (auto [k, v] : map) {
...
}
std::map<Something *, ...> map;
for (auto [k, v] : map) {
...
}
Os avisos são relatados apenas se funções com nomes predefinidos (por exemplo, printf ) forem encontrados em um loop.
A ponteitoração da CSA não relata a iteração não determinística, nem sobre recipientes ordenados de ponteiros, nem em recipientes não ordenados de não-ponteiros.
Para construir, instale (no Debian/Ubuntu) llvm , libclang-dev e libpcre3-dev :
$ sudo apt-get install llvm libclang-dev libpcre3-dev
e correr
$ make clean all
Para construir as versões depuradas ou higienizadas, make com que DEBUG=1 , ASAN=1 ou UBSAN=1 .
Execute bin/find-flaky nos arquivos nos quais você está interessado:
$ bin/find-flaky tests/3-unordered-map-notok.cc
find-flaky: warning: calling IO function 'printf' inside flaky loop
Por padrão, a ferramenta procura funções de OI mais comuns (como printf ), mas você fornece seus próprios padrões:
$ cat patterns.txt
# A useful comment
my_debug_fun
# Another one
other_fun
$ bin/find-flaky --patterns patterns.txt ...
Os sinalizadores de compilação personalizados (geralmente -D e -I ) podem ser fornecidos com parâmetro --cflags e a verbosidade pode ser definida com o sinalizador -v . Para opções adicionais, execute bin/find-flaky -h .
Construir e depois correr
$ make test
Found no errors