| //===-- tsan_test.cpp -----------------------------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file is a part of ThreadSanitizer (TSan), a race detector. |
| // |
| //===----------------------------------------------------------------------===// |
| #include "tsan_interface.h" |
| #include "tsan_test_util.h" |
| #include "gtest/gtest.h" |
| |
| static void foo() {} |
| static void bar() {} |
| |
| TEST(ThreadSanitizer, FuncCall) { |
| ScopedThread t1, t2; |
| MemLoc l; |
| t1.Write1(l); |
| t2.Call(foo); |
| t2.Call(bar); |
| t2.Write1(l, true); |
| t2.Return(); |
| t2.Return(); |
| } |
| |
| // We use this function instead of main, as ISO C++ forbids taking the address |
| // of main, which we need to pass inside __tsan_func_entry. |
| int run_tests(int argc, char **argv) { |
| TestMutexBeforeInit(); // Mutexes must be usable before __tsan_init(); |
| __tsan_init(); |
| __tsan_func_entry(__builtin_return_address(0)); |
| __tsan_func_entry((void*)((intptr_t)&run_tests + 1)); |
| |
| testing::GTEST_FLAG(death_test_style) = "threadsafe"; |
| testing::InitGoogleTest(&argc, argv); |
| int res = RUN_ALL_TESTS(); |
| |
| __tsan_func_exit(); |
| __tsan_func_exit(); |
| return res; |
| } |
| |
| const char *argv0; |
| |
| #ifdef __APPLE__ |
| // On Darwin, turns off symbolication and crash logs to make tests faster. |
| extern "C" const char* __tsan_default_options() { |
| return "symbolize=false:abort_on_error=0"; |
| } |
| #endif |
| |
| namespace __sanitizer { |
| bool ReexecDisabled() { |
| return true; |
| } |
| } |
| |
| int main(int argc, char **argv) { |
| argv0 = argv[0]; |
| return run_tests(argc, argv); |
| } |