Быстрая и грязная проверка, которая обнаруживает неэнергинистическую итерацию, например,
std::unordered_map<...> map;
for (auto [k, v] : map) {
...
}
std::map<Something *, ...> map;
for (auto [k, v] : map) {
...
}
Предупреждения сообщаются только в том случае, если функции с предопределенными именами (например, printf ) встречаются в цикле.
В указательную деятельность CSA не сообщается о нетерминированной итерации ни над упорядоченными контейнерами с указателями, ни над неупорядоченными контейнерами не указателей.
Чтобы построить, установите (на Debian/Ubuntu) llvm , libclang-dev и libpcre3-dev :
$ sudo apt-get install llvm libclang-dev libpcre3-dev
и бежать
$ make clean all
Для создания отладки или дезинфекции версий make с DEBUG=1 , ASAN=1 или UBSAN=1 .
Запустите bin/find-flaky в файлах, которые вас интересуют:
$ bin/find-flaky tests/3-unordered-map-notok.cc
find-flaky: warning: calling IO function 'printf' inside flaky loop
По умолчанию инструмент ищет самые распространенные функции ввода -вывода (например, printf ), но вы предоставляете свои собственные шаблоны:
$ cat patterns.txt
# A useful comment
my_debug_fun
# Another one
other_fun
$ bin/find-flaky --patterns patterns.txt ...
Пользовательские флаги компиляции (обычно -D и -I ) могут быть поставляются с параметром --cflags , и условно может быть установлен с флагом -v . Для получения дополнительных вариантов запустите bin/find-flaky -h .
Построить, а затем бежать
$ make test
Found no errors