Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Duplicate
-
proton-c-0.33.0
-
None
-
None
Description
Functions pthread_mutex_lock and pthread_mutex_unlock return a status code. The status is not checked in Proton code, and any errors are therefore ignored.
According to notes on https://reviews.llvm.org/D18132?id=50550, which is the CL that implements the ReportTypeMutexInvalidAccess TSan check, ignoring the status there is standard practice. Hence the need for the ASan check.
The TSan warnings that were suppressed in # PROTON-2292 & PROTON-1496: false suspected collision between set/free only highlight a nonzero return code from the aforementioned functions. This can be demonstrated if return code check is inserted.
The TSan warnings are not concerned with potentialities (the way Coverity works), it reports the warnings as it sees the program to execute, and the undefined behavior is happening. There can be false positives, but this is probably not it.
In c-proactor-test/proactor_disconnect test, pthread_mutex_lock returns 22, which is EINVAL.
static inline void lock(pmutex *m) { int err = pthread_mutex_lock(m); if (err != 0) { fprintf(stderr, "Error locking mutex: %s\n", strerror(err)); exit(1); } } static inline void unlock(pmutex *m) { int err = pthread_mutex_unlock(m); if (err != 0) { fprintf(stderr, "Error unlocking mutex: %s\n", strerror(err)); exit(1); } }
/home/jdanek/repos/qpid/qpid-proton/cmake-build-debugwithtsan/c/tests/c-proactor-test -r xml -d yes --order lex Testing started at 9:53 AM ... ================== WARNING: ThreadSanitizer: use of an invalid mutex (e.g. uninitialized or destroyed) (pid=27191) #0 pthread_mutex_lock <null> (libtsan.so.0+0x4284b) #1 lock /home/jdanek/repos/qpid/qpid-proton/c/src/proactor/epoll-internal.h:329 (libqpid-proton-proactor.so.1+0xbb27) #2 pni_timer_set /home/jdanek/repos/qpid/qpid-proton/c/src/proactor/epoll_timer.c:248 (libqpid-proton-proactor.so.1+0xbb27) #3 pni_timer_free /home/jdanek/repos/qpid/qpid-proton/c/src/proactor/epoll_timer.c:144 (libqpid-proton-proactor.so.1+0xbe3a) #4 pconnection_final_free /home/jdanek/repos/qpid/qpid-proton/c/src/proactor/epoll.c:797 (libqpid-proton-proactor.so.1+0xc1a0) #5 pconnection_cleanup /home/jdanek/repos/qpid/qpid-proton/c/src/proactor/epoll.c:814 (libqpid-proton-proactor.so.1+0xc2f7) #6 pconnection_forced_shutdown /home/jdanek/repos/qpid/qpid-proton/c/src/proactor/epoll.c:855 (libqpid-proton-proactor.so.1+0x14c9d) #7 pn_proactor_free /home/jdanek/repos/qpid/qpid-proton/c/src/proactor/epoll.c:1994 (libqpid-proton-proactor.so.1+0x14c9d) #8 pn_test::auto_free<pn_proactor_t, &pn_proactor_free>::~auto_free() /home/jdanek/repos/qpid/qpid-proton/c/tests/././pn_test.hpp:53 (c-proactor-test+0x4355aa) #9 pn_test::proactor::~proactor() /home/jdanek/repos/qpid/qpid-proton/c/tests/./pn_test_proactor.hpp:38 (c-proactor-test+0x415149) #10 ____C_A_T_C_H____T_E_S_T____26 /home/jdanek/repos/qpid/qpid-proton/c/tests/proactor_test.cpp:677 (c-proactor-test+0x4329e1) #11 Catch::FreeFunctionTestCase::invoke() const /home/jdanek/repos/qpid/qpid-proton/tests/include/catch.hpp:7415 (c-proactor-test+0x454059) #12 Catch::TestCase::invoke() const /home/jdanek/repos/qpid/qpid-proton/tests/include/catch.hpp:8413 (c-proactor-test+0x454059) #13 Catch::RunContext::invokeActiveTestCase() /home/jdanek/repos/qpid/qpid-proton/tests/include/catch.hpp:6941 (c-proactor-test+0x454059) #14 Catch::RunContext::runCurrentTest(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&) /home/jdanek/repos/qpid/qpid-proton/tests/include/catch.hpp:6911 (c-proactor-test+0x454059) #15 Catch::RunContext::runTest(Catch::TestCase const&) /home/jdanek/repos/qpid/qpid-proton/tests/include/catch.hpp:6706 (c-proactor-test+0x454059) #16 Catch::runTests(Catch::Ptr<Catch::Config> const&) /home/jdanek/repos/qpid/qpid-proton/tests/include/catch.hpp:7086 (c-proactor-test+0x454059) #17 Catch::Session::runInternal() /home/jdanek/repos/qpid/qpid-proton/tests/include/catch.hpp:7258 (c-proactor-test+0x40d93c) #18 Catch::Session::run() /home/jdanek/repos/qpid/qpid-proton/tests/include/catch.hpp:7217 (c-proactor-test+0x40d93c) #19 Catch::Session::run(int, char const* const*) /home/jdanek/repos/qpid/qpid-proton/tests/include/catch.hpp:7182 (c-proactor-test+0x40d93c) #20 main /home/jdanek/repos/qpid/qpid-proton/tests/include/catch.hpp:11469 (c-proactor-test+0x40d93c) Location is heap block of size 1152 at 0x7b6400000500 allocated by main thread: #0 calloc <null> (libtsan.so.0+0x2f905) #1 pn_proactor /home/jdanek/repos/qpid/qpid-proton/c/src/proactor/epoll.c:1942 (libqpid-proton-proactor.so.1+0xca64) #2 pn_test::proactor::proactor(pn_test::handler*) /home/jdanek/repos/qpid/qpid-proton/c/tests/pn_test_proactor.cpp:45 (c-proactor-test+0x4139c9) #3 ____C_A_T_C_H____T_E_S_T____26 /home/jdanek/repos/qpid/qpid-proton/c/tests/proactor_test.cpp:677 (c-proactor-test+0x42fe5a) #4 Catch::FreeFunctionTestCase::invoke() const /home/jdanek/repos/qpid/qpid-proton/tests/include/catch.hpp:7415 (c-proactor-test+0x454059) #5 Catch::TestCase::invoke() const /home/jdanek/repos/qpid/qpid-proton/tests/include/catch.hpp:8413 (c-proactor-test+0x454059) #6 Catch::RunContext::invokeActiveTestCase() /home/jdanek/repos/qpid/qpid-proton/tests/include/catch.hpp:6941 (c-proactor-test+0x454059) #7 Catch::RunContext::runCurrentTest(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&) /home/jdanek/repos/qpid/qpid-proton/tests/include/catch.hpp:6911 (c-proactor-test+0x454059) #8 Catch::RunContext::runTest(Catch::TestCase const&) /home/jdanek/repos/qpid/qpid-proton/tests/include/catch.hpp:6706 (c-proactor-test+0x454059) #9 Catch::runTests(Catch::Ptr<Catch::Config> const&) /home/jdanek/repos/qpid/qpid-proton/tests/include/catch.hpp:7086 (c-proactor-test+0x454059) #10 Catch::Session::runInternal() /home/jdanek/repos/qpid/qpid-proton/tests/include/catch.hpp:7258 (c-proactor-test+0x40d93c) #11 Catch::Session::run() /home/jdanek/repos/qpid/qpid-proton/tests/include/catch.hpp:7217 (c-proactor-test+0x40d93c) #12 Catch::Session::run(int, char const* const*) /home/jdanek/repos/qpid/qpid-proton/tests/include/catch.hpp:7182 (c-proactor-test+0x40d93c) #13 main /home/jdanek/repos/qpid/qpid-proton/tests/include/catch.hpp:11469 (c-proactor-test+0x40d93c) Mutex M0 (0x7b64000005c0) created at: [failed to restore the stack] SUMMARY: ThreadSanitizer: use of an invalid mutex (e.g. uninitialized or destroyed) (/nix/store/zhbhxp4jgalycwffildy2bwcgmrsmayk-gcc-9.2.0-lib/lib/libtsan.so.0+0x4284b) in pthread_mutex_lock ================== Error locking mutex: Invalid argument ThreadSanitizer: reported 1 warnings Process finished with exit code 66
Attachments
Issue Links
- duplicates
-
PROTON-2292 [c] Proactor: TSAN failure in pni_timer_manager
- Closed