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

    <tr>
        <th>Summary</th>
        <td>
            Thread-safety analysis produces incorrect results for cleanup functions
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          bvanassche
      </td>
    </tr>
</table>

<pre>
    Building the following code with `-Wthread-safety` produces compiler warnings while no warnings should be reported:
```
#include <stdio.h>

struct __attribute__((capability("mutex"))) mutex {
};

static void mutex_lock(struct mutex *m)
 __attribute__((exclusive_lock_function(*m)))
 __attribute__((no_thread_safety_analysis))
{
 puts(__func__);
}

static void mutex_unlock(struct mutex *m)
 __attribute__((unlock_function(*m)))
 __attribute__((no_thread_safety_analysis))
{
 puts(__func__);
}

static void mutex_cleanup(struct mutex **m)
 __attribute__((unlock_function(**m)))
{
    puts(__func__);
 mutex_unlock(*m);
}

int main(void)
{
    struct mutex m = {};
 mutex_lock(&m);
#if 1
    struct mutex *m_ptr __attribute__((cleanup(mutex_cleanup))) = &m;
#else
 mutex_unlock(&m);
#endif
    return 0;
}
```
The following compiler warnings are reported:
```
annotated-cleanup.c:32:19: warning: releasing mutex 'm_ptr' that was not held [-Wthread-safety-analysis]
   32 | struct mutex *m_ptr __attribute__((cleanup(mutex_cleanup))) = &m;
      | ^
annotated-cleanup.c:37:1: warning: mutex 'm' is still held at the end of function [-Wthread-safety-analysis]
   37 | }
      | ^
annotated-cleanup.c:30:5: note: mutex acquired here
   30 | mutex_lock(&m);
      |     ^
2 warnings generated.
```
The program output shows that both the lock and unlock functions are called:
```
mutex_lock
mutex_cleanup
mutex_unlock
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzMVd1u4ygUfhpyc5TIxnWcXPjCnUyfYKS9tDAcx-wS8MKhmb79Cv80bZSuZldaaSskF5Nzvh9_gAhBny1izcpnVp42ItLgfN29CitCkANuOqfe6ueojdL2DDQg9M4Yd00z6RTCVdMAbJ9tf6PBo1DbIHqkN7bPYPRORYkBpLuM2qCHq_BW23OA66ANgnW3N2Fw0SjoEDyOzhMqVjQsa9g-W0bWMF5oK01UCKz4FkhptxtY8T0tZU0gHyVB2woir7tI2LaMHxg_SDGKThtNb9OcXyLhT8Y548d5wPQGWPWcWlUnVjyvPQVpCa9Oq_k3rXHyD8YPC9hSx5tLapQ1j9DxpzQx6Fecats-Wkna2WlxrpvH42rr2tnYdja2FVaYt6DDe9XMGsZIgfFDOwGk6uOiojp9pSXaf65mrvk_qZAGhY3jAxn_Qsm9mIUWwJfM7r1cO3ymrS3BReiEkqjfN__E_AKsOE1hXJP4OXuM7z8g8EL3kD_qk5i0I_mHW-LdtDsT1x0xUUhAKwqagA_lfiaDVul-YeORoreQffLiw37-cXec3J8Swv_daSCsdSQI1XYhv5OsaArOiiY_sqJZ-6R_PRoUIaGs1lSTNYxXQIMguIoA1hEMaBSw8vnuONu-57U8zeIKDqz69p8ZDtNfQmDl96_FVknsndabwqROBwikjZmVCZrOcLQKXA9r9H9NcDXTqU6_Ti9jRVMmTtYR3rgJ-WfUHhUM6HHpnk3dvs75DXF6Tqj8FpUzWvSJwO5Bxkbvzl5cwEUaI6Wr5hrmz945GiZHEiQIq2AO9rs1cwilMOZRBD_QXSfrd13ny0b5ULdRdaGOxVFssM6rYl8deV4eNkPdyyfFJZaiyvdHjp0oRJmpvheZ6vZcVRtd84yXWZ4X-SEvy8Muf5Jq3_Fqn0nZZU8de8rwIrTZGfN62Tl_3ugQItY551V52BjRoQnTZc-5xStMq-kiLE8bX6eibRfPgT1lRgcKtzakyWD942NCYE3I7Z7XVjrvURJ4DNFQgN55WBy5WbqJ3tQD0RiSo_yF8ZezpiF2O-kujL8k1OWxHb37HSUx_jJxDYy_LGJea_5XAAAA___1P7-N">