A fast and dirty checker which detects non-deterministic iteration e.g.
std::unordered_map<...> map;
for (auto [k, v] : map) {
...
}
std::map<Something *, ...> map;
for (auto [k, v] : map) {
...
}
Warnings are reported only if functions with predefined names (e.g. printf)
are encountered in a loop.
CSA's PointerIteration does not report nondeterministic iteration neither over ordered containers of pointers, nor over unordered containers of non-pointers.
To build, install (on Debian/Ubuntu) llvm, libclang-dev and libpcre3-dev:
$ sudo apt-get install llvm libclang-dev libpcre3-dev
and run
$ make clean all
To build debug or sanitized versions run make with DEBUG=1, ASAN=1 or UBSAN=1.
Run bin/find-flaky on files you are interested in:
$ bin/find-flaky tests/3-unordered-map-notok.cc
find-flaky: warning: calling IO function 'printf' inside flaky loop
By default tool looks for most common IO functions (like printf)
but you provide your own patterns:
$ cat patterns.txt
# A useful comment
my_debug_fun
# Another one
other_fun
$ bin/find-flaky --patterns patterns.txt ...
Custom compile flags (usually -D and -I) can be supplied with --cflags parameter and
verbosity can be set with -v flag.
For additional options run bin/find-flaky -h.
Build and then run
$ make test
Found no errors
- support other loop types