<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/57955>57955</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Fake positive "WARNING: ThreadSanitizer: lock-order-inversion (potential deadlock)" after mutex is unlock
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          Changqing-JING
      </td>
    </tr>
</table>

<pre>
    This  bug is originally reported in [google/sanitizer](https://github.com/google/sanitizers/issues/1419). But the original code is in llvm-project. So the ticket is referred to llvm for further analyzing and fix.

This bug is already reported by:
https://github.com/google/sanitizers/issues/814
https://github.com/google/sanitizers/issues/1419

## To reproduce the bug:
Build and run the follow code with thread sanitizer.
```c++
#include <thread>
#include <mutex>
#include <atomic>

std::mutex m1;
std::mutex m2;
std::mutex m3;

std::atomic<int> counter {0};

void foo(){
  std::unique_lock<std::mutex> lock1(m1);
  std::unique_lock<std::mutex> lock2(m2);
}

void xoo(){
  foo();
  std::unique_lock<std::mutex> lock2(m2);
  std::unique_lock<std::mutex> lock3(m3);
}

void yoo(){
  std::unique_lock<std::mutex> lock3(m3);
  std::unique_lock<std::mutex> lock1(m1);
}

int main(){
  std::thread th1([]{
    while(true){
      xoo();
      if(counter>10){
        break;
      }
    }
  });

  std::thread th2([]{
    while(true){
      yoo();
      counter++;
      if(counter>10){
        break;
      }
    }
  });

  th1.join();
  th2.join();
}
```

```shell
mkdir build
clang++ -g -fsanitize=thread -o build/sanitizerDemo main.cpp
./build/sanitizerDemo
```

## Expected behavior:
No warning and error

## Observed behavior:
Get warning:
```
==================
WARNING: ThreadSanitizer: lock-order-inversion (potential deadlock) (pid=2961)
  Cycle in lock order graph: M0 (0x55efb72306a8) => M1 (0x55efb72306d0) => M2 (0x55efb72306f8) => M0

  Mutex M1 acquired here while holding mutex M0 in thread T1:
    #0 pthread_mutex_lock <null> (sanitizerDemo+0x6cfaa) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #1 __gthread_mutex_lock(pthread_mutex_t*) /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/x86_64-linux-gnu/c++/11/bits/gthr-default.h:749:12 (sanitizerDemo+0xd0903) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #2 std::mutex::lock() /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/std_mutex.h:100:17 (sanitizerDemo+0xd1715) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #3 std::unique_lock<std::mutex>::lock() /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/unique_lock.h:139:17 (sanitizerDemo+0xd16a5) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #4 std::unique_lock<std::mutex>::unique_lock(std::mutex&) /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/unique_lock.h:69:2 (sanitizerDemo+0xd1457) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #5 foo() /home/jcq/workspace/ThreadSanitizerBugCandidate/main.cpp:13:32 (sanitizerDemo+0xd03d5) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #6 xoo() /home/jcq/workspace/ThreadSanitizerBugCandidate/main.cpp:17:3 (sanitizerDemo+0xd0465) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #7 main::$_0::operator()() const /home/jcq/workspace/ThreadSanitizerBugCandidate/main.cpp:30:7 (sanitizerDemo+0xd0de1) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #8 void std::__invoke_impl<void, main::$_0>(std::__invoke_other, main::$_0&&) /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/invoke.h:61:14 (sanitizerDemo+0xd0d9d) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #9 std::__invoke_result<main::$_0>::type std::__invoke<main::$_0>(main::$_0&&) /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/invoke.h:96:14 (sanitizerDemo+0xd0ced) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #10 void std::thread::_Invoker<std::tuple<main::$_0> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/std_thread.h:253:13 (sanitizerDemo+0xd0c95) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #11 std::thread::_Invoker<std::tuple<main::$_0> >::operator()() /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/std_thread.h:260:11 (sanitizerDemo+0xd0c35) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #12 std::thread::_State_impl<std::thread::_Invoker<std::tuple<main::$_0> > >::_M_run() /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/std_thread.h:211:13 (sanitizerDemo+0xd0b49) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #13 <null> <null> (libstdc++.so.6+0xdc2c2) (BuildId: 725ef5da52ee6d881f9024d8238a989903932637)

    Hint: use TSAN_OPTIONS=second_deadlock_stack=1 to get more informative warning message

  Mutex M2 acquired here while holding mutex M1 in thread T1:
    #0 pthread_mutex_lock <null> (sanitizerDemo+0x6cfaa) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #1 __gthread_mutex_lock(pthread_mutex_t*) /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/x86_64-linux-gnu/c++/11/bits/gthr-default.h:749:12 (sanitizerDemo+0xd0903) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #2 std::mutex::lock() /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/std_mutex.h:100:17 (sanitizerDemo+0xd1715) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #3 std::unique_lock<std::mutex>::lock() /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/unique_lock.h:139:17 (sanitizerDemo+0xd16a5) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #4 std::unique_lock<std::mutex>::unique_lock(std::mutex&) /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/unique_lock.h:69:2 (sanitizerDemo+0xd1457) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #5 xoo() /home/jcq/workspace/ThreadSanitizerBugCandidate/main.cpp:19:32 (sanitizerDemo+0xd048f) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #6 main::$_0::operator()() const /home/jcq/workspace/ThreadSanitizerBugCandidate/main.cpp:30:7 (sanitizerDemo+0xd0de1) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #7 void std::__invoke_impl<void, main::$_0>(std::__invoke_other, main::$_0&&) /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/invoke.h:61:14 (sanitizerDemo+0xd0d9d) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #8 std::__invoke_result<main::$_0>::type std::__invoke<main::$_0>(main::$_0&&) /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/invoke.h:96:14 (sanitizerDemo+0xd0ced) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #9 void std::thread::_Invoker<std::tuple<main::$_0> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/std_thread.h:253:13 (sanitizerDemo+0xd0c95) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #10 std::thread::_Invoker<std::tuple<main::$_0> >::operator()() /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/std_thread.h:260:11 (sanitizerDemo+0xd0c35) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #11 std::thread::_State_impl<std::thread::_Invoker<std::tuple<main::$_0> > >::_M_run() /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/std_thread.h:211:13 (sanitizerDemo+0xd0b49) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #12 <null> <null> (libstdc++.so.6+0xdc2c2) (BuildId: 725ef5da52ee6d881f9024d8238a989903932637)

  Mutex M0 acquired here while holding mutex M2 in thread T2:
    #0 pthread_mutex_lock <null> (sanitizerDemo+0x6cfaa) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #1 __gthread_mutex_lock(pthread_mutex_t*) /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/x86_64-linux-gnu/c++/11/bits/gthr-default.h:749:12 (sanitizerDemo+0xd0903) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #2 std::mutex::lock() /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/std_mutex.h:100:17 (sanitizerDemo+0xd1715) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #3 std::unique_lock<std::mutex>::lock() /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/unique_lock.h:139:17 (sanitizerDemo+0xd16a5) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #4 std::unique_lock<std::mutex>::unique_lock(std::mutex&) /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/unique_lock.h:69:2 (sanitizerDemo+0xd1457) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #5 yoo() /home/jcq/workspace/ThreadSanitizerBugCandidate/main.cpp:24:32 (sanitizerDemo+0xd0535) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #6 main::$_1::operator()() const /home/jcq/workspace/ThreadSanitizerBugCandidate/main.cpp:39:7 (sanitizerDemo+0xd1301) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #7 void std::__invoke_impl<void, main::$_1>(std::__invoke_other, main::$_1&&) /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/invoke.h:61:14 (sanitizerDemo+0xd12bd) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #8 std::__invoke_result<main::$_1>::type std::__invoke<main::$_1>(main::$_1&&) /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/invoke.h:96:14 (sanitizerDemo+0xd120d) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #9 void std::thread::_Invoker<std::tuple<main::$_1> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/std_thread.h:253:13 (sanitizerDemo+0xd11b5) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #10 std::thread::_Invoker<std::tuple<main::$_1> >::operator()() /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/std_thread.h:260:11 (sanitizerDemo+0xd1155) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #11 std::thread::_State_impl<std::thread::_Invoker<std::tuple<main::$_1> > >::_M_run() /usr/bin/../lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/std_thread.h:211:13 (sanitizerDemo+0xd1069) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #12 <null> <null> (libstdc++.so.6+0xdc2c2) (BuildId: 725ef5da52ee6d881f9024d8238a989903932637)

  Thread T1 (tid=2963, running) created by main thread at:
    #0 pthread_create <null> (sanitizerDemo+0x4f41d) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #1 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) <null> (libstdc++.so.6+0xdc398) (BuildId: 725ef5da52ee6d881f9024d8238a989903932637)
    #2 main /home/jcq/workspace/ThreadSanitizerBugCandidate/main.cpp:28:15 (sanitizerDemo+0xd05cd) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)

  Thread T2 (tid=2964, running) created by main thread at:
    #0 pthread_create <null> (sanitizerDemo+0x4f41d) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)
    #1 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) <null> (libstdc++.so.6+0xdc398) (BuildId: 725ef5da52ee6d881f9024d8238a989903932637)
    #2 main /home/jcq/workspace/ThreadSanitizerBugCandidate/main.cpp:37:15 (sanitizerDemo+0xd05df) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813)

SUMMARY: ThreadSanitizer: lock-order-inversion (potential deadlock) (/home/jcq/workspace/ThreadSanitizerBugCandidate/build/sanitizerDemo+0x6cfaa) (BuildId: c8889fc1fcd8a23e72c8e9304e3bd86a01df3813) in pthread_mutex_lock
==================
ThreadSanitizer: reported 1 warnings
```

## Environment
Ubuntu 22.04 + clang-14(installed by apt)
```
$ uname -a
Linux ubuntu 5.15.0-25-generic #25-Ubuntu SMP Wed Mar 30 15:54:22 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

$ clang++ --version
Ubuntu clang version 14.0.0-1ubuntu1
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztW1tv27gS_jXyC2FDpC6WHvzgxG03B8fpYpNisU8GLVE2G1l0KSqX_fU7pC6-yk1StWkLB4as8DKc-TgczieLcxE_jW6XPEdoXiwQfAvJFzyjafqEJFsLqViMeIYs72IhxCJlFnmf04wr_i-TljexSLBUap1bzhhq4LPgalnMB5FY6X8OuuTwD8_zgukb7OLQIuEAXRQKqSVrBkeRiJnWBkZO0_tVfy3FZxapAboRpqHi0R1TuoVkCZMSlFTCNEWJkCgpJLSSiIKsp395toC7GCX8cWDZE8sel1djd2U2TSWj8ZbN8ydtkmn3egMD7H6rCIPRltIWceCDboVWVYq4iJhBBOxoFL4oeBobk2WRmdpEpKl4KGF9gNGhUNuLmjFrYHy7_EQWudCfekyeRWkBnS3nsuxqOe-OVa4KxR5b6qgSKx5tKs01V7HW2xmbnmiFLefieA1prXGamr36esRLnikYF-wvMgV-YQ0vbGs42et2Lzg4iRDg0-CV0KYsRqiRV2T8S8FmqYjuQOiuGlq-rsDQHawAAc7rBBAtgGwL0Kru6_l4RM-N7p0N_UIBjhbgfE33p2_F-HCYb56kPT3BYdCK8qxdz2oFqaWWBeFRB8NNM4Qellwv60DJgu2K0H-PR6ZK__EEiis3BWWxfdgVQjWMfLfXsdF_7x99u21mqxnkNWY8tZhRW1AGkbcxEWZm8Fk0U7iRBbYeq9h4QB0Ed-JuXZgvWZqWZau7mEuIvBBty4IopdmiNBr1F6if1PHVciYV0H1RddgK-BO2EsbbBtF6XUoaQP3RdqdULLeGd49r2Cr1FsaW9J4L2ewL1wI9UJnV-yHsm1B5KODjPGfy_piAD7DnVhKasn1VnMlrPqbv3-O_rq-uP4BodGvQumkyDSjS67YvZMxkn2f3sE1yAXkJCdZCsUxxyBpi6GKWPQlNBQcfn5DQNwu9mvzLpyhlJq-AhsiIQwtJ10s9xNTW_exHz2PJfEgc26eBEaaVfIemeL86treryX51stPb3vXPqdm8QCaNvhRcpzCQsrBywaGlSGM9T-UOB3rxrN6zb3GDvVkIMBBal3Uz09yEPr3hZgV4KowMWu36ELmwH_0oobRCyiQMVzoioCgIgjCJcBLFASUOG5IoYKFju8yZx4FPbRwnToCdLUiNDhjNZosDLfQs7BQqi4zLQd8XudROrtfh-4H295TPdT4UQe7x_jHwZ77bT3lWPPYXWaEzIVw33LtUKcbxXnUiU_Wfc6WzKq1pP2YJLVI10FM_dCEQjDE5jlVsh7bTHVYE7e9K-rbC6_uhcxwKUKWcG4MDtm19HbbggIfY6w4H59mb9psitKVbiZETnsTIpx1i5L4Qo-1GoN5uI-K_NXa-hq5tlWHXG3aHnLfJh7XJS7HSan6OvsD1Qci7fE0jXbK31VwUi0vYHXlMla5ttmU973BxWkOEE3c47f4mQ-xI-aFWvk131-9Q92GZORu_s4g7s8tbsWYSCJms0q7StkhkuerGQkeP07Yo7Zjh7iwMkOExzeqazSAjEXdsxldr2HEvda1FLg9xeLe9JpteQj-sONZer9cfvmRLpcrVqlMN7LZiGsbdYRoegVOyHDZo_VjhEMiSvTyt2WG_4x2A8f1k8Ib-SXgj1iG82N7z2foxjgHuyiglt7cVVazT40iiBv7ZdIO4XaT7_n2VxTrlqwTVDX58elOaaiAnnmMieSvmYYeBEONu4T4aQd8STN8ki7gVTKdLMEkLmDcKtoI68naE946LyyL7CbDG-KTjzt2wQ6ydHfq4wyTBXlCt0nmQi4FfahCRiBxqMCRAhr2YeoQxPw4CnIQ2ceMA9lAaBiHQqtAhvjNsNNjo8Yd5aDtGRc7Q7c34evbxz9urj9c3QKdzBnlDPKv5_ixXVOfEE6x_BVgwhVZCapKfCLmiit-z5rnHiuU5XbCjTJw8h4njMxM_M_EzEz8z8TMTfwET75rMhieZuBskXTLx353NDs9stnM2G5zZ7Pdks-GZzP5wMmufyez3fzJwJrPdk1ny5mR2Wv-K-wyCSbYJJjkTzBY_OxPM163CM8E8E8zfkGA-dUswiXuSYHpd5gL7BBP_IIIZniCY2LHfnGDiFxJM_OYM6DTBxGT-NgQTv5Rg4mME8-3hPU0wMbF_OoKJf2-CifH8pyKY-FcmmBh7vxrBxL8qwcS2_3sRzNv6B0ktUNXvPTt6k4T5MO9r6-wBGpVnm8zWWbNMqtpZZtnlqwzTTVzc5csqLc471b_0SlXN9Hb0rJLPtZKtbm08XyPSVFescBazlCn2lY6Vm0N_szMYHx83gaV8z_tZM--EQQcz3_BLM5PdJL2BXjNea9IbdTHD-x5LdjzWPXvs2WNfwGGGpz027uJ3wPJ682k6Hf_1j9XR2ZTXm3_8VFA3j_n0o8fD54vffrDnCGLNQVtcv5uTP-NoU3bPpchWgGlZ_mleZKpAhAxszQsukDmB1ccQRwIOVJmmaRk96FptJnRvBOKiIqMrhvq0LPm_zkhQUcr2Btgb2H3i9RcsY5JHxom9fjX0zfRP9DeMMaUSQRTCHhjn6acHhKBPt5eI2HBTZjp7Xx-uP8E0mrF2TXXRzjmyfuVPOxabFqj2NOwObNARlyrjCnQqF8y8QVUlWutoK9famhe0EhBPdMO1yHmlzFWN3oSb-dpJ5nZh7LER9n3XhvjtOb145MShE9Ke4iplo_f0jhm55jUsi5AOD3mBNEQTfaC3fHbOc5hIXdcrZDo6ceZaHxSvvuqj5dbWmWtvGHpebzmKCHOHNHLmtm0nkDQGOAxcFjvUxREl_rCX0jlL85E-NklIxh6QEQH3ljfp8ZGeezskLnbJ0CEDf2hHfkyDmPjhPLZ9y7UZBLN0oPUYCLnoyZFRaV7AYnDtlOcq31TSPOeLjLFReUqzRwu1FHJ0uQRP-ALrp_8_gLVnNBgZC_4DGVoqBw">