The problem is that TSan still fails [1] is that ignorelist does not
work for static functions without asterisk:
// test.cpp
#include <thread>
bool flag = false;
// avoid mangling
extern "C" {
static void set_flag_impl()
{
flag = true;
}
void set_flag()
{
set_flag_impl();
}
void set_flag_if()
{
if (flag)
flag = false;
}
}
int main()
{
std::thread t1([]{ set_flag(); });
std::thread t2([]{ set_flag_if(); });
t1.join();
t2.join();
return 0;
}
// ignorelist
[thread]
fun:set_flag_impl
$ clang++ -g -fno-omit-frame-pointer -fsanitize=thread -fsanitize-ignorelist=ignorelist -o test test.cpp && ./test
SUMMARY: ThreadSanitizer: data race /tmp/test-tsan-ignorelist/test.cpp:19:9 in set_flag_if
$ sed -i 's/set_flag_impl/*set_flag_impl*/' ignorelist
$ clang++ -g -fno-omit-frame-pointer -fsanitize=thread -fsanitize-ignorelist=ignorelist -o test test.cpp && ./test
OK
But, note that ignorelist is tricky, and will not work for
functions with __always_inline__ attribute for example.
P.S. set_flag_impl also has brackets in the output (i.e.
set_flag_impl()), while ther eis brackets for rd_avg_calc on CI [1].
[1]: https://s3.amazonaws.com/clickhouse-test-reports/63039/84bebc534ba7cf6e9dbfc1d91e8350939a84f87c/integration_tests__tsan__[6_6]//home/ubuntu/actions-runner/_work/_temp/test/output_dir/integration_run_parallel4_0.log
Signed-off-by: Azat Khuzhin <a.khuzhin@semrush.com>