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

    <tr>
        <th>Summary</th>
        <td>
            Can Thread Safety Analysis prevent bugs in critical sections?
        </td>
    </tr>

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

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

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

<pre>
    Hi, I am using [Thread Safety Analysis](https://clang.llvm.org/docs/ThreadSafetyAnalysis.html) to write concurrent programs in C.
This is fine when dealing with only one variable in a critical section, but the problem arises when I want to deal with more than one variable.

For example:
```c
int a GUARDED_BY(mu) = 0;
int b GUARDED_BY(mu) = 0;

// Variables "a" and "b" should be accessed with the same lock.
// But they are not.
void *setThread(void *param) EXCLUDES(mu) {
    mutex_lock(&mu);
    a = 1;
 mutex_unlock(&mu);

    mutex_lock(&mu);
    b = -1;
 mutex_unlock(&mu);
    // ...
}

void *checkThread(void *) EXCLUDES(mu) {
    mutex_lock(&mu);
    if (!((a == 0 && b == 0) || (a == 1 && b == -1))) {
        assert(0); // Bug Found!
    }
 mutex_unlock(&mu);
    // ...
```

Is there any way to use Thread Safety Analysis to prevent such critical section errors?
Also, how about adding an `ACCESSED_WITH` annotation to warn of such critical section errors?

```c
int a GUARDED_BY(mu) = 0;
int b GUARDED_BY(mu) ACCESSED_WITH(a) = 0;

void *setThread(void *param) EXCLUDES(mu) {
 mutex_lock(&mu);
    a = 1;
    mutex_unlock(&mu);

 mutex_lock(&mu);
    b = -1;
    mutex_unlock(&mu); // Warning! Variable b must be accessed within the same lock as variable a.
    // ...
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0Vk2TozYQ_TXypWsoaBvMHDj4MztVOWV2s8lpqoE2KCsklyTG63-fEvhjnMlkdydJFYUx6n79-qm7BTknG81ciHQp0vWEet8aW3RSN30_w0lp6mPxQQpcwQNQB72TugGRLj-2lqmGR9qxP8JCkzo66US6Fpi33u-dmC4EbgVuK0W6iZR67iJjG4Hb2lRO4HZEGAHO_lHrOyXwHryBg5WeoTK66q1l7WFvTWOpcyA1rCIRr0W8-NhKB9LBTmqGQ8saaiYVOB6kb8FodQSjGZ7JSioVB1-CykovK1LguPLS6JBe2XvwLYcopeIOyErHbsR8gANpH0gF9BG6M5bBt6Rv8E-0xvvWWOCv1O0VBzXGlSwer2r8L7UHgp8-LX5Zb9ZPy98F5l0fFBDTNcRiuryald82O90H3eHXEycHApEEIpCuw3MZnl1relVDyUBVxc5xPeYVNHDUMShTfYluAJejREcgy6CNP60-GxlgF479uKcC8_O7PVnqAs_Nb6ufP603j1fi8xNnAICu9_z1KUQUmAvMBpNLVsGChkyT67vRpddvOf0IeDmA3_0AevA6qRJFZ5Xm65ehzxJULVdfXgnzX2gidzAsJcM9HyQa6gEEZgKzMa-xQgb0lZiv4KVl8sryLglRhuuWzrAJzrH1AvN4pAKXwmhga3pdBy5Xfc56vE_Nc6O81PTBhQK0DKSPcKBjaMneMfz9NAqre8vPYXi4vmpf9T2wtcY6Md2O8AvlTJgFrTkAlab3QHUdhglpEFm8WK02j4-b9dPnh48fRBYDaW08DUhhYJHVYHbfF-r_mQa3DDGnt0bEv-3ZdzTspaS_2bPvadh_RD8X12eyWupGYHIZjlBC1zv_ag5KfTsJgdz1EKHoe6bAeW8ndTGt76f3NOEiyeYYp0meJpO2iGc8KzFFimdxxTxHrOs63-1yxixJ8tlEFhgjJohZEqdxmkQJZjGVlNRZVtZxNhOzmDuS6nK8TqRzPRfp_TzGiaKSlRuOdkTNBxgWBWI46W0RfO7KvnFiFivpvLuieOkVFyvSb3XWua2CezhT_1ruodAnvVXF7bdAI33bl1FlOoHbEO30c7e35g-uvMDtwDF8Hww5_BkAAP__NAZ-GA">