<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/105341>105341</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[Coverage] false counter for branch coverage underflows when there's data race
</td>
</tr>
<tr>
<th>Labels</th>
<td>
tools:llvm-cov
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
whentojump
</td>
</tr>
</table>
<pre>
Compiler explorer [link](https://godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:c%2B%2B,selection:(endColumn:1,endLineNumber:30,positionColumn:1,positionLineNumber:30,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:'%23include+%3Cstdio.h%3E%0A%23include+%3Cstdlib.h%3E%0A%23include+%3Cpthread.h%3E%0A%0A%23define+NUM_THREADS+10000%0A%0Aint+x%3B%0Aint+y%3B%0A%0Avoid*+f(void*+thread_id)+%7B%0A++++x%2B%2B%3B%0A++++for+(int+i+%3D+0%3B+i+%3C+100%3B+i+%2B%2B)%0A++++++++if+(x+%25+10000)%0A++++++++++++%2B%2By%3B%0A++++pthread_exit(NULL)%3B%0A%7D%0A%0Aint+main()+%7B%0A++++pthread_t+threads%5BNUM_THREADS%5D%3B%0A++++long+t%3B%0A%0A++++for(t+%3D+0%3B+t+%3C+NUM_THREADS%3B+t%2B%2B)%0A++++++++pthread_create(%26threads%5Bt%5D,+NULL,+f,+(void*)t)%3B%0A%0A++++for(t+%3D+0%3B+t+%3C+NUM_THREADS%3B+t%2B%2B)+%0A++++++++pthread_join(threads%5Bt%5D,+NULL)%3B+++%0A%0A++++return+0%3B%0A%7D%0A'),l:'5',n:'1',o:'C%2B%2B+source+%231',t:'0')),k:33.333333333333336,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:clang_trunk,filters:(b:'0',binary:'1',binaryObject:'1',commentOnly:'0',debugCalls:'1',demangle:'0',directives:'0',execute:'1',intel:'1',libraryCode:'0',trim:'1',verboseDemangling:'0'),flagsViewOpen:'1',fontScale:14,fontUsePx:'0',j:1,lang:c%2B%2B,libs:!(),options:'-fprofile-instr-generate+-fcoverage-mapping+-fprofile-update%3Dsingle',overrides:!(),selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:1),l:'5',n:'0',o:'+x86-64+clang+(trunk)+(Editor+%231)',t:'0')),k:33.333333333333336,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:tool,i:(args:'--show-branches%3Dcount',argsPanelShown:'0',compilerName:'x86-64+clang+(trunk)',editorid:1,fontScale:14,fontUsePx:'0',j:1,monacoEditorHasBeenAutoOpened:'1',monacoEditorOpen:'1',monacoStdin:'1',stdin:'',stdinPanelShown:'1',toolId:llvm-covtrunk,wrap:'1'),l:'5',n:'0',o:'llvm-cov+(clang-only)+x86-64+clang+(trunk)+(Editor+%231,+Compiler+%231)',t:'0')),k:33.33333333333333,l:'4',n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4). It's possible to get the following results:
```c
13| 986k| if (x % 10000)
------------------
| Branch (13:13): [True: 986k, False: 18.4E]
------------------
14| 986k| ++y;
```
The cause is:
1. Concurrent counter updates `mov` -- `add` -- `mov` interleave with each other
2. The counter for "then" clause could be greater than the counter for "if" clause: $C_\text{then} > C_\text{if}$
3. $C_\text{else} = C_\text{if} - C_\text{then} < 0$, resulting in `0xffffffffffffff..` thus `18.4E`
I understand we can apply flag `-fprofile-update=atomic`. But otherwise, in the report we should probably report the negative value as is, which is also gcov's practice:
```c
997744: 13: if (x % 10000)
branch 0 taken 997755 (fallthrough)
branch 1 taken -11
997755: 14: ++y;
```
or report 0, which is [`lcov`'s practice](https://github.com/linux-test-project/lcov/blob/d465f73117ac3b66e9f6d172346ae18fcfaf0f69/lib/lcovutil.pm#L3590-L3593).
cc @evodius96
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMGF2Pm7j21zgvViIwEMhDHgbS0VbqbVe37X2tDBzAHcdGtkky__7KNiQhSaftaldahEh8fD58vg9QrVkrALYoyVGyW9DBdFJtjx0II78P-35Ryvp1W8h9zzgoDKeeSwUKoyTnTLygZIdI1hnTaxQ9IfKMyHMr61Jys5KqdYCodVshIhki2Y8XHYqeKlnDu5oZqRApmNvNGsZB0D24VRoikiJSNFKYzxXlFhrGI-Crhj9PHi3waN_tNiIFp8LKqhBJSD4-Cg0cKsOk8HJA1IXkw16MNCDqD0zAx2FfgkLRUxQgUvRSM0syw5yA9-hnEZ8NVWZGNN-akbrte4JHeBu7IQdVjeaxukVMVHyoATlVo0KbmslVZ_-_QyQJnn6AxFn5M6zedApofYM24tbQMGFRP379z7cvf_z33dPuMyJ5GARBcEFlwiCSnyyD_ArwegG4x0GyGpEnRPIGkeyy8gf4Zpcbf6p0osrP9-nazxe2F4TGBliOSOaFs1G_HSJ5MFKcgYXX4QZ8fmzumF_frPFyTiNVcjHI24TzexL3-lid0S3f4MQMItnHrx8-eP4Xi6a7WxfsKRMu835sx4mvORteI5IkcwcntgY8OhWXorWEN56980NmHpnfXJl_Lm_a_lUfTFpUCqgBp3JC1tf6mFELL8sar_CBV3jvncNvY27t-k_pc2_ORyp9l86Hb-syHfgSTQ9OrsAMSlwd-CZsUl9ruC8ziS-vYlaTpV8V15rkY3HygGjENNdFeuM5v9iaGa2i2bW-iIxnIoOZSL-wLSh4wL143Gl8S7v0mTMkeqpsv_hm1CBebGth3IDyDS4rZ_JLJqh6nVnBgz6V36Eys41K7vcgzCfBX2c8aiiHtqCc6xl6DXsqWg5zXKZs0ziAnoHhBNVg5h2SCQN8BuGsVFS9FrKeMzWK7WeIB1Cl1LDzJ2CivTVow2mr_8fg-KkH8bf3Zc5KfeUuK1D2tlOOSi-bXkk7FSyZ0EYtWxCgXGbny6aSB1C0heWe9j1zBeiCP_S1w0uinWbOuD6KDqAUq-FW6m8OCOFvzQf3M8A_PR6Eb6TwbT7lp2y9XMeI5C4XfBkcE8JXp2ya086ZvfnXJLeRkl8Sm6p2ipyl7uRxWSoqqg60C4RKDrYdWhkW8U8qgH_u5HF-lqk4fDwPom8byGWlMxCrRwf9ZmrspaCV9Eb-g-ocQDwNRtqMg3qWc9eYdwnpNz-bms3h-gK5AtxqP9VrKfl7K5Tzw35ZycNUGo-K9teYvxhfExtvNWfApbR10cXWXwg92-yKc0X_yxH5dwTklQnIT5k8Ij6A0r7mxIhsVvi9jU6Ne6k1KzlgI3ELBpsOcCM5l0cmWqxAD9y4MA92KJie68DflV9jjMMIpQXGeJOtX-w_1mA7nmJEEnweTEfk5d017TgeuUsjSx5GNmgjSxo92XfDL2qwYe6lkAI_U64dIMxW8Tv71vhTETiM5yf1c8orivIb5a41_tIBruigAbNbY4QrXEhRDUqBMNilPSjsW4LGaB3s5QGtA7xc2gWt68ti3LEtVXGgB8BHZjoMtOqwNB0oL4GssJM_sm6kwogQ04FAhOCKu3NVcuA1LgG3bhxV2HRUOG_e0NlXh4nKmZXExTeUFAZOBqW5Y5vuMIre4Ws4a5Ad2mLszxStbgnBusIR7u4J8RI_FlLgABFbtcZQs0HHhDVOcGpm12plbWW6wRnVO3zupPd4EDUobaio8dE6TGDa9_wV28HCUt217GhHjdyzCq2DFc4H481-ZBrskZg3oIJeKmM56s5ZuVeypCV_nXYskoCW2gkKHygfAFNtI4UU-NixqsNMY8q1xK2rTjbtFK0M86_Xb2fWZpOmcWw95bLM_brrxynmGxHGATb0BYRjkSQWu6Gcm07Joe3usMMRexmGM-FJMgqPfbj8QrpINZkmmNkAJTlaB7xycT-3w6MvPsx0Q7mq5B6RZ87EcFoa0GbZK-mmYPLsOJHnkssSkec6XidNGoVhSquoXK9h06zrMCVRvKYQZk3V0CZo1hvHrRzJB8P4qt8jEn2Ikk2wtE9bcVbX-lQVRnEAB1mzQW_Wi3ob1ZtoQxewDVMSh1mSrcNFt6VZRYMkius6IElWJ1FTJmVIgMQpxCmlC7YlAYmDjAQkiMIgXFVpClUKEAdNva6jjRWzp4yvbC9bSdUumNYDbEPLNlxwWgLX7rMaIbZ96qvuiQhByW6htg5QDq1GccCZNvrCzTDD3We5YhxoUbLDjS2jszoxxsQ09frEarg8anzswKWFAufAmhqKFa1gMSi-fcuB_DD9XHnQaacReR4VPGzJ_wMAAP__R0GQYw">