Skip to content

Conversation

philnik777
Copy link
Contributor

Fixes #151733

@philnik777 philnik777 requested a review from a team as a code owner August 18, 2025 08:46
@llvmbot llvmbot added the libc++ libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi. label Aug 18, 2025
@llvmbot
Copy link
Member

llvmbot commented Aug 18, 2025

@llvm/pr-subscribers-libcxx

Author: Nikolas Klauser (philnik777)

Changes

Fixes #151733


Full diff: https://github.com/llvm/llvm-project/pull/154078.diff

2 Files Affected:

  • (modified) libcxx/include/mutex (+3-2)
  • (added) libcxx/test/extensions/clang/thread/thread.mutex/lock.verify.cpp (+43)
diff --git a/libcxx/include/mutex b/libcxx/include/mutex
index 78d8c8a9bcc6e..3f546f039f4c7 100644
--- a/libcxx/include/mutex
+++ b/libcxx/include/mutex
@@ -351,7 +351,7 @@ _LIBCPP_HIDE_FROM_ABI int try_lock(_L0& __l0, _L1& __l1, _L2& __l2, _L3&... __l3
 #    endif // _LIBCPP_CXX03_LANG
 
 template <class _L0, class _L1>
-_LIBCPP_HIDE_FROM_ABI void lock(_L0& __l0, _L1& __l1) {
+_LIBCPP_HIDE_FROM_ABI void lock(_L0& __l0, _L1& __l1) _LIBCPP_ACQUIRE_CAPABILITY(__l0, __l1) {
   while (true) {
     {
       unique_lock<_L0> __u0(__l0);
@@ -411,7 +411,8 @@ void __lock_first(int __i, _L0& __l0, _L1& __l1, _L2& __l2, _L3&... __l3) {
 }
 
 template <class _L0, class _L1, class _L2, class... _L3>
-inline _LIBCPP_HIDE_FROM_ABI void lock(_L0& __l0, _L1& __l1, _L2& __l2, _L3&... __l3) {
+inline _LIBCPP_HIDE_FROM_ABI void lock(_L0& __l0, _L1& __l1, _L2& __l2, _L3&... __l3)
+    _LIBCPP_ACQUIRE_CAPABILITY(__l0, __l1, __l2, __l3...) {
   std::__lock_first(0, __l0, __l1, __l2, __l3...);
 }
 
diff --git a/libcxx/test/extensions/clang/thread/thread.mutex/lock.verify.cpp b/libcxx/test/extensions/clang/thread/thread.mutex/lock.verify.cpp
new file mode 100644
index 0000000000000..0b3f87068589a
--- /dev/null
+++ b/libcxx/test/extensions/clang/thread/thread.mutex/lock.verify.cpp
@@ -0,0 +1,43 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: no-threads
+
+// <mutex>
+
+// GCC doesn't have thread safety attributes
+// UNSUPPORTED: gcc
+
+// ADDITIONAL_COMPILE_FLAGS: -Wthread-safety -Wno-comment
+
+// XFAIL: FROZEN-CXX03-HEADERS-FIXME
+
+#include <mutex>
+
+std::mutex m0;
+std::mutex m1;
+std::mutex m2;
+std::mutex m3;
+
+void f1() {
+  std::lock(m0, m1);
+} // expected-warning {{mutex 'm0' is still held at the end of function}} \
+     expected-warning {{mutex 'm1' is still held at the end of function}}
+
+void f2() {
+  std::lock(m0, m1, m2);
+} // expected-warning {{mutex 'm0' is still held at the end of function}} \
+     expected-warning {{mutex 'm1' is still held at the end of function}} \
+     expected-warning {{mutex 'm2' is still held at the end of function}}
+
+void f3() {
+  std::lock(m0, m1, m2, m3);
+} // expected-warning {{mutex 'm0' is still held at the end of function}} \
+     expected-warning {{mutex 'm1' is still held at the end of function}} \
+     expected-warning {{mutex 'm2' is still held at the end of function}} \
+     expected-warning {{mutex 'm3' is still held at the end of function}}

@philnik777 philnik777 force-pushed the annotate_std_lock branch 6 times, most recently from 6f85619 to 7364368 Compare August 20, 2025 13:52
@github-project-automation github-project-automation bot moved this from Needs Triage to Needs Merge in LLVM Release Status Sep 2, 2025
@philnik777 philnik777 merged commit 0a2eb85 into llvm:main Sep 3, 2025
14 of 18 checks passed
@github-project-automation github-project-automation bot moved this from Needs Merge to Done in LLVM Release Status Sep 3, 2025
@philnik777 philnik777 deleted the annotate_std_lock branch September 3, 2025 06:42
@philnik777
Copy link
Contributor Author

/cherry-pick 0a2eb85

@llvm-ci
Copy link
Collaborator

llvm-ci commented Sep 3, 2025

LLVM Buildbot has detected a new failure on builder sanitizer-aarch64-linux-fuzzer running on sanitizer-buildbot12 while building libcxx at step 2 "annotate".

Full details are available at: https://lab.llvm.org/buildbot/#/builders/159/builds/30029

Here is the relevant piece of the build log for the reference
Step 2 (annotate) failure: 'python ../sanitizer_buildbot/sanitizers/zorg/buildbot/builders/sanitizers/buildbot_selector.py' (failure)
...
[2652/2670] Building CXX object compiler-rt/lib/fuzzer/CMakeFiles/RTfuzzer.aarch64.dir/FuzzerExtFunctionsWeak.cpp.o
[2653/2670] Building CXX object compiler-rt/lib/fuzzer/CMakeFiles/RTfuzzer_main.aarch64.dir/FuzzerMain.cpp.o
[2654/2670] Building CXX object compiler-rt/lib/fuzzer/CMakeFiles/RTfuzzer.aarch64.dir/FuzzerSHA1.cpp.o
[2655/2670] Building CXX object compiler-rt/lib/fuzzer/CMakeFiles/RTfuzzer.aarch64.dir/FuzzerCrossOver.cpp.o
[2656/2670] Building CXX object compiler-rt/lib/fuzzer/CMakeFiles/RTfuzzer.aarch64.dir/FuzzerIOPosix.cpp.o
[2657/2670] Building CXX object compiler-rt/lib/fuzzer/CMakeFiles/RTfuzzer.aarch64.dir/FuzzerUtilLinux.cpp.o
[2658/2670] Building CXX object compiler-rt/lib/fuzzer/CMakeFiles/RTfuzzer.aarch64.dir/FuzzerUtilPosix.cpp.o
[2659/2670] Building CXX object compiler-rt/lib/fuzzer/CMakeFiles/RTfuzzer.aarch64.dir/FuzzerUtil.cpp.o
[2660/2670] Building CXX object compiler-rt/lib/fuzzer/CMakeFiles/RTfuzzer.aarch64.dir/FuzzerIO.cpp.o
[2661/2670] Building CXX object compiler-rt/lib/fuzzer/CMakeFiles/RTfuzzer.aarch64.dir/FuzzerMerge.cpp.o
FAILED: compiler-rt/lib/fuzzer/CMakeFiles/RTfuzzer.aarch64.dir/FuzzerMerge.cpp.o 
/home/b/sanitizer-aarch64-linux-fuzzer/build/llvm_build0/./bin/clang++ --target=aarch64-unknown-linux-gnu -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/home/b/sanitizer-aarch64-linux-fuzzer/build/llvm-project/compiler-rt/lib/fuzzer/../../include -fPIC -fno-semantic-interposition -fvisibility-inlines-hidden -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wmisleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color -ffunction-sections -fdata-sections -Wall -Wno-unused-parameter -O3 -DNDEBUG -std=c++17 -march=armv8-a -fPIC -fno-builtin -fno-exceptions -fomit-frame-pointer -funwind-tables -fno-stack-protector -fno-sanitize=safe-stack -fvisibility=hidden -fno-lto -Wthread-safety -Wthread-safety-reference -Wthread-safety-beta -O3 -gline-tables-only -Wno-gnu -Wno-variadic-macros -Wno-c99-extensions -ftrivial-auto-var-init=pattern -D_LIBCPP_ABI_VERSION=Fuzzer -nostdinc++ -fno-omit-frame-pointer -isystem /home/b/sanitizer-aarch64-linux-fuzzer/build/llvm_build0/runtimes/runtimes-bins/compiler-rt/lib/fuzzer/libcxx_fuzzer_aarch64/include/c++/v1 -MD -MT compiler-rt/lib/fuzzer/CMakeFiles/RTfuzzer.aarch64.dir/FuzzerMerge.cpp.o -MF compiler-rt/lib/fuzzer/CMakeFiles/RTfuzzer.aarch64.dir/FuzzerMerge.cpp.o.d -o compiler-rt/lib/fuzzer/CMakeFiles/RTfuzzer.aarch64.dir/FuzzerMerge.cpp.o -c /home/b/sanitizer-aarch64-linux-fuzzer/build/llvm-project/compiler-rt/lib/fuzzer/FuzzerMerge.cpp
In file included from /home/b/sanitizer-aarch64-linux-fuzzer/build/llvm-project/compiler-rt/lib/fuzzer/FuzzerMerge.cpp:11:
In file included from /home/b/sanitizer-aarch64-linux-fuzzer/build/llvm-project/compiler-rt/lib/fuzzer/FuzzerCommand.h:15:
In file included from /home/b/sanitizer-aarch64-linux-fuzzer/build/llvm-project/compiler-rt/lib/fuzzer/FuzzerDefs.h:19:
In file included from /home/b/sanitizer-aarch64-linux-fuzzer/build/llvm_build0/runtimes/runtimes-bins/compiler-rt/lib/fuzzer/libcxx_fuzzer_aarch64/include/c++/v1/set:537:
/home/b/sanitizer-aarch64-linux-fuzzer/build/llvm_build0/runtimes/runtimes-bins/compiler-rt/lib/fuzzer/libcxx_fuzzer_aarch64/include/c++/v1/__tree:1050:46: error: no matching member function for call to '__find_equal'
 1050 |               __node_base_pointer& __child = __find_equal(__parent, __key);
      |                                              ^~~~~~~~~~~~
/home/b/sanitizer-aarch64-linux-fuzzer/build/llvm_build0/runtimes/runtimes-bins/compiler-rt/lib/fuzzer/libcxx_fuzzer_aarch64/include/c++/v1/__tree:1041:75: note: while substituting into a lambda expression here
 1041 |           [this, &__max_node](const key_type& __key, __reference&& __val) {
      |                                                                           ^
/home/b/sanitizer-aarch64-linux-fuzzer/build/llvm_build0/runtimes/runtimes-bins/compiler-rt/lib/fuzzer/libcxx_fuzzer_aarch64/include/c++/v1/set:746:13: note: in instantiation of function template specialization 'std::__tree<unsigned int, std::less<unsigned int>, std::allocator<unsigned int>>::__insert_range_unique<std::__wrap_iter<unsigned int *>, std::__wrap_iter<unsigned int *>>' requested here
  746 |     __tree_.__insert_range_unique(__first, __last);
      |             ^
/home/b/sanitizer-aarch64-linux-fuzzer/build/llvm-project/compiler-rt/lib/fuzzer/FuzzerMerge.cpp:153:17: note: in instantiation of function template specialization 'std::set<unsigned int>::insert<std::__wrap_iter<unsigned int *>>' requested here
  153 |     AllFeatures.insert(Cur.begin(), Cur.end());
      |                 ^
/home/b/sanitizer-aarch64-linux-fuzzer/build/llvm_build0/runtimes/runtimes-bins/compiler-rt/lib/fuzzer/libcxx_fuzzer_aarch64/include/c++/v1/__tree:1177:72: note: candidate function template not viable: requires single argument '__v', but 2 arguments were provided
 1177 |   _LIBCPP_HIDE_FROM_ABI pair<__end_node_pointer, __node_base_pointer&> __find_equal(const _Key& __v) const {
      |                                                                        ^            ~~~~~~~~~~~~~~~
/home/b/sanitizer-aarch64-linux-fuzzer/build/llvm_build0/runtimes/runtimes-bins/compiler-rt/lib/fuzzer/libcxx_fuzzer_aarch64/include/c++/v1/__tree:1174:72: note: candidate function template not viable: requires single argument '__v', but 2 arguments were provided
 1174 |   _LIBCPP_HIDE_FROM_ABI pair<__end_node_pointer, __node_base_pointer&> __find_equal(const _Key& __v);
      |                                                                        ^            ~~~~~~~~~~~~~~~
/home/b/sanitizer-aarch64-linux-fuzzer/build/llvm_build0/runtimes/runtimes-bins/compiler-rt/lib/fuzzer/libcxx_fuzzer_aarch64/include/c++/v1/__tree:1183:3: note: candidate function template not viable: requires 3 arguments, but 2 were provided
 1183 |   __find_equal(const_iterator __hint, __node_base_pointer& __dummy, const _Key& __v);
      |   ^            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/b/sanitizer-aarch64-linux-fuzzer/build/llvm_build0/runtimes/runtimes-bins/compiler-rt/lib/fuzzer/libcxx_fuzzer_aarch64/include/c++/v1/__tree:1066:46: error: no matching member function for call to '__find_equal'
 1066 |               __node_base_pointer& __child = __find_equal(__parent, __nd->__get_value());
      |                                              ^~~~~~~~~~~~
/home/b/sanitizer-aarch64-linux-fuzzer/build/llvm_build0/runtimes/runtimes-bins/compiler-rt/lib/fuzzer/libcxx_fuzzer_aarch64/include/c++/v1/__tree:1057:52: note: while substituting into a lambda expression here
 1057 |           [this, &__max_node](__reference&& __val) {
      |                                                    ^
/home/b/sanitizer-aarch64-linux-fuzzer/build/llvm_build0/runtimes/runtimes-bins/compiler-rt/lib/fuzzer/libcxx_fuzzer_aarch64/include/c++/v1/set:746:13: note: in instantiation of function template specialization 'std::__tree<unsigned int, std::less<unsigned int>, std::allocator<unsigned int>>::__insert_range_unique<std::__wrap_iter<unsigned int *>, std::__wrap_iter<unsigned int *>>' requested here
  746 |     __tree_.__insert_range_unique(__first, __last);
      |             ^
/home/b/sanitizer-aarch64-linux-fuzzer/build/llvm-project/compiler-rt/lib/fuzzer/FuzzerMerge.cpp:153:17: note: in instantiation of function template specialization 'std::set<unsigned int>::insert<std::__wrap_iter<unsigned int *>>' requested here
  153 |     AllFeatures.insert(Cur.begin(), Cur.end());
      |                 ^
Step 7 (stage1 build all) failure: stage1 build all (failure)
...
[2652/2670] Building CXX object compiler-rt/lib/fuzzer/CMakeFiles/RTfuzzer.aarch64.dir/FuzzerExtFunctionsWeak.cpp.o
[2653/2670] Building CXX object compiler-rt/lib/fuzzer/CMakeFiles/RTfuzzer_main.aarch64.dir/FuzzerMain.cpp.o
[2654/2670] Building CXX object compiler-rt/lib/fuzzer/CMakeFiles/RTfuzzer.aarch64.dir/FuzzerSHA1.cpp.o
[2655/2670] Building CXX object compiler-rt/lib/fuzzer/CMakeFiles/RTfuzzer.aarch64.dir/FuzzerCrossOver.cpp.o
[2656/2670] Building CXX object compiler-rt/lib/fuzzer/CMakeFiles/RTfuzzer.aarch64.dir/FuzzerIOPosix.cpp.o
[2657/2670] Building CXX object compiler-rt/lib/fuzzer/CMakeFiles/RTfuzzer.aarch64.dir/FuzzerUtilLinux.cpp.o
[2658/2670] Building CXX object compiler-rt/lib/fuzzer/CMakeFiles/RTfuzzer.aarch64.dir/FuzzerUtilPosix.cpp.o
[2659/2670] Building CXX object compiler-rt/lib/fuzzer/CMakeFiles/RTfuzzer.aarch64.dir/FuzzerUtil.cpp.o
[2660/2670] Building CXX object compiler-rt/lib/fuzzer/CMakeFiles/RTfuzzer.aarch64.dir/FuzzerIO.cpp.o
[2661/2670] Building CXX object compiler-rt/lib/fuzzer/CMakeFiles/RTfuzzer.aarch64.dir/FuzzerMerge.cpp.o
FAILED: compiler-rt/lib/fuzzer/CMakeFiles/RTfuzzer.aarch64.dir/FuzzerMerge.cpp.o 
/home/b/sanitizer-aarch64-linux-fuzzer/build/llvm_build0/./bin/clang++ --target=aarch64-unknown-linux-gnu -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/home/b/sanitizer-aarch64-linux-fuzzer/build/llvm-project/compiler-rt/lib/fuzzer/../../include -fPIC -fno-semantic-interposition -fvisibility-inlines-hidden -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wmisleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color -ffunction-sections -fdata-sections -Wall -Wno-unused-parameter -O3 -DNDEBUG -std=c++17 -march=armv8-a -fPIC -fno-builtin -fno-exceptions -fomit-frame-pointer -funwind-tables -fno-stack-protector -fno-sanitize=safe-stack -fvisibility=hidden -fno-lto -Wthread-safety -Wthread-safety-reference -Wthread-safety-beta -O3 -gline-tables-only -Wno-gnu -Wno-variadic-macros -Wno-c99-extensions -ftrivial-auto-var-init=pattern -D_LIBCPP_ABI_VERSION=Fuzzer -nostdinc++ -fno-omit-frame-pointer -isystem /home/b/sanitizer-aarch64-linux-fuzzer/build/llvm_build0/runtimes/runtimes-bins/compiler-rt/lib/fuzzer/libcxx_fuzzer_aarch64/include/c++/v1 -MD -MT compiler-rt/lib/fuzzer/CMakeFiles/RTfuzzer.aarch64.dir/FuzzerMerge.cpp.o -MF compiler-rt/lib/fuzzer/CMakeFiles/RTfuzzer.aarch64.dir/FuzzerMerge.cpp.o.d -o compiler-rt/lib/fuzzer/CMakeFiles/RTfuzzer.aarch64.dir/FuzzerMerge.cpp.o -c /home/b/sanitizer-aarch64-linux-fuzzer/build/llvm-project/compiler-rt/lib/fuzzer/FuzzerMerge.cpp
In file included from /home/b/sanitizer-aarch64-linux-fuzzer/build/llvm-project/compiler-rt/lib/fuzzer/FuzzerMerge.cpp:11:
In file included from /home/b/sanitizer-aarch64-linux-fuzzer/build/llvm-project/compiler-rt/lib/fuzzer/FuzzerCommand.h:15:
In file included from /home/b/sanitizer-aarch64-linux-fuzzer/build/llvm-project/compiler-rt/lib/fuzzer/FuzzerDefs.h:19:
In file included from /home/b/sanitizer-aarch64-linux-fuzzer/build/llvm_build0/runtimes/runtimes-bins/compiler-rt/lib/fuzzer/libcxx_fuzzer_aarch64/include/c++/v1/set:537:
/home/b/sanitizer-aarch64-linux-fuzzer/build/llvm_build0/runtimes/runtimes-bins/compiler-rt/lib/fuzzer/libcxx_fuzzer_aarch64/include/c++/v1/__tree:1050:46: error: no matching member function for call to '__find_equal'
 1050 |               __node_base_pointer& __child = __find_equal(__parent, __key);
      |                                              ^~~~~~~~~~~~
/home/b/sanitizer-aarch64-linux-fuzzer/build/llvm_build0/runtimes/runtimes-bins/compiler-rt/lib/fuzzer/libcxx_fuzzer_aarch64/include/c++/v1/__tree:1041:75: note: while substituting into a lambda expression here
 1041 |           [this, &__max_node](const key_type& __key, __reference&& __val) {
      |                                                                           ^
/home/b/sanitizer-aarch64-linux-fuzzer/build/llvm_build0/runtimes/runtimes-bins/compiler-rt/lib/fuzzer/libcxx_fuzzer_aarch64/include/c++/v1/set:746:13: note: in instantiation of function template specialization 'std::__tree<unsigned int, std::less<unsigned int>, std::allocator<unsigned int>>::__insert_range_unique<std::__wrap_iter<unsigned int *>, std::__wrap_iter<unsigned int *>>' requested here
  746 |     __tree_.__insert_range_unique(__first, __last);
      |             ^
/home/b/sanitizer-aarch64-linux-fuzzer/build/llvm-project/compiler-rt/lib/fuzzer/FuzzerMerge.cpp:153:17: note: in instantiation of function template specialization 'std::set<unsigned int>::insert<std::__wrap_iter<unsigned int *>>' requested here
  153 |     AllFeatures.insert(Cur.begin(), Cur.end());
      |                 ^
/home/b/sanitizer-aarch64-linux-fuzzer/build/llvm_build0/runtimes/runtimes-bins/compiler-rt/lib/fuzzer/libcxx_fuzzer_aarch64/include/c++/v1/__tree:1177:72: note: candidate function template not viable: requires single argument '__v', but 2 arguments were provided
 1177 |   _LIBCPP_HIDE_FROM_ABI pair<__end_node_pointer, __node_base_pointer&> __find_equal(const _Key& __v) const {
      |                                                                        ^            ~~~~~~~~~~~~~~~
/home/b/sanitizer-aarch64-linux-fuzzer/build/llvm_build0/runtimes/runtimes-bins/compiler-rt/lib/fuzzer/libcxx_fuzzer_aarch64/include/c++/v1/__tree:1174:72: note: candidate function template not viable: requires single argument '__v', but 2 arguments were provided
 1174 |   _LIBCPP_HIDE_FROM_ABI pair<__end_node_pointer, __node_base_pointer&> __find_equal(const _Key& __v);
      |                                                                        ^            ~~~~~~~~~~~~~~~
/home/b/sanitizer-aarch64-linux-fuzzer/build/llvm_build0/runtimes/runtimes-bins/compiler-rt/lib/fuzzer/libcxx_fuzzer_aarch64/include/c++/v1/__tree:1183:3: note: candidate function template not viable: requires 3 arguments, but 2 were provided
 1183 |   __find_equal(const_iterator __hint, __node_base_pointer& __dummy, const _Key& __v);
      |   ^            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/b/sanitizer-aarch64-linux-fuzzer/build/llvm_build0/runtimes/runtimes-bins/compiler-rt/lib/fuzzer/libcxx_fuzzer_aarch64/include/c++/v1/__tree:1066:46: error: no matching member function for call to '__find_equal'
 1066 |               __node_base_pointer& __child = __find_equal(__parent, __nd->__get_value());
      |                                              ^~~~~~~~~~~~
/home/b/sanitizer-aarch64-linux-fuzzer/build/llvm_build0/runtimes/runtimes-bins/compiler-rt/lib/fuzzer/libcxx_fuzzer_aarch64/include/c++/v1/__tree:1057:52: note: while substituting into a lambda expression here
 1057 |           [this, &__max_node](__reference&& __val) {
      |                                                    ^
/home/b/sanitizer-aarch64-linux-fuzzer/build/llvm_build0/runtimes/runtimes-bins/compiler-rt/lib/fuzzer/libcxx_fuzzer_aarch64/include/c++/v1/set:746:13: note: in instantiation of function template specialization 'std::__tree<unsigned int, std::less<unsigned int>, std::allocator<unsigned int>>::__insert_range_unique<std::__wrap_iter<unsigned int *>, std::__wrap_iter<unsigned int *>>' requested here
  746 |     __tree_.__insert_range_unique(__first, __last);
      |             ^
/home/b/sanitizer-aarch64-linux-fuzzer/build/llvm-project/compiler-rt/lib/fuzzer/FuzzerMerge.cpp:153:17: note: in instantiation of function template specialization 'std::set<unsigned int>::insert<std::__wrap_iter<unsigned int *>>' requested here
  153 |     AllFeatures.insert(Cur.begin(), Cur.end());
      |                 ^

@llvmbot
Copy link
Member

llvmbot commented Sep 3, 2025

Failed to cherry-pick: 0a2eb85

https://github.com/llvm/llvm-project/actions/runs/17425303760

Please manually backport the fix and push it to your github fork. Once this is done, please create a pull request

@frederick-vs-ja
Copy link
Contributor

Looks like that this PR missed handling for Apple Clang...

@PiJoules
Copy link
Contributor

PiJoules commented Sep 3, 2025

It looks like this patch leads to -Wthread-safety incorrectly diagnosing a mutex held by unique_lock:

#include <mutex>

std::mutex m0, m1;

void func() {
  std::unique_lock ul1(m0, std::defer_lock);
  std::unique_lock ul2(m1, std::defer_lock);
  std::lock(ul1, ul2);
}
$ ~/misc/clang-cipd-latest/bin/clang++ -c -Wall -Wthread-safety /tmp/test.cc
/tmp/test.cc:9:1: warning: mutex 'ul1' is still held at the end of function [-Wthread-safety-analysis]
    9 | }
      | ^
/tmp/test.cc:8:3: note: mutex acquired here
    8 |   std::lock(ul1, ul2);
      |   ^
/tmp/test.cc:9:1: warning: mutex 'ul2' is still held at the end of function [-Wthread-safety-analysis]
    9 | }
      | ^
/tmp/test.cc:8:3: note: mutex acquired here
    8 |   std::lock(ul1, ul2);
      |   ^
2 warnings generated.

Do more _LIBCPP_NO_THREAD_SAFETY_ANALYSISs need to be added elsewhere to ensure these warnings don't pop up?

PiJoules added a commit to PiJoules/llvm-project that referenced this pull request Sep 4, 2025
…4078)"

This reverts commit 0a2eb85.

Reverting because this leads to a false positive with -Wthread-safety.
See llvm#156760.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
libc++ libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi. release:cherry-pick-failed
Projects
Development

Successfully merging this pull request may close these issues.

[libc++] False positive -Wthread-safety-analysis with std::lock()
6 participants