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

    <tr>
        <th>Summary</th>
        <td>
            clang trunk at -O2/3 misses a global-buffer-overflow
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          shao-hua-li
      </td>
    </tr>
</table>

<pre>
    For the following code, `clang-trunk -O2 -fsanitize=address` (or `-O3`) misses the global-buffer-overflow, while `clang-trunk -Ox -fsanitize=address` (x=0,1, or s) can detect it.

GCC can detect it at all optimization levels.

The overflow happens at ` a=a+2; i[0]; *a=1`, which overflows variable `c`. I checked the assembly code of `-O2/3`, which did not optimize away these codes. I believe this should be a sanitizer implementation bug.

I have reported a few other sanitizer implementation issues to GCC team (an example: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106558) and they confirmed and fixed these bugs. 
Such issues caused ASAN to miss certain kinds of bugs and may lead to false negatives in practice. ASAN and other sanitizers are extremely popular and have been widely used to find security flaws in many critical software, I believe such issues should be properly handled to avoid missing of bugs.

Compiler explorer: https://godbolt.org/z/nvhM4j9h6

```console
% cat .c
struct {
  short b
}  g, i[8];
int c;
unsigned j;
int o() {
  int *a = &c;
  for (j=-9; j > 0; j = j + 1) {
    a = a + 2;
    i[0];
    *a = 1;
  }
  return *a;
}
int main() { 
  int a = o(); 
  __builtin_printf("a=%d\n", a);
}
% clang-tk -O2 -fsanitize=address a.c && ./a.out
a=1
%
% clang-tk -O1 -fsanitize=address a.c && ./a.out
=================================================================
==1==ERROR: AddressSanitizer: global-buffer-overflow on address 0x55a65d87c668 at pc 0x55a65ccf31d8 bp 0x7fff997c47b0 sp 0x7fff997c47a8
WRITE of size 4 at 0x55a65d87c668 thread T0
    #0 0x55a65ccf31d7 in o /app/a.c:11:8
    #1 0x55a65ccf31d7 in main /app/a.c:16:11
    #2 0x7f11300e8082 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x24082) (BuildId: 1878e6b475720c7c51969e69ab2d276fae6d1dee)
    #3 0x55a65cc1da4d in _start (/app/output.s+0x1da4d)

0x55a65d87c668 is located 56 bytes before global variable 'i' defined in '/app/example.c:3' (0x55a65d87c6a0) of size 16
0x55a65d87c668 is located 24 bytes before global variable 'j' defined in '/app/example.c:5' (0x55a65d87c680) of size 4
0x55a65d87c668 is located 4 bytes after global variable 'c' defined in '/app/example.c:4' (0x55a65d87c660) of size 4
SUMMARY: AddressSanitizer: global-buffer-overflow /app/example.c:11:8 in o
Shadow bytes around the buggy address:
  0x55a65d87c380: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x55a65d87c400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x55a65d87c480: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x55a65d87c500: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x55a65d87c580: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x55a65d87c600: 00 00 00 00 00 00 00 00 00 00 00 00 04[f9]f9 f9
  0x55a65d87c680: 04 f9 f9 f9 00 00 f9 f9 02 f9 f9 f9 00 00 00 00
  0x55a65d87c700: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x55a65d87c780: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x55a65d87c800: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x55a65d87c880: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
==1==ABORTING
%
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzVWEtv4zYQ_jXyhbCh9-Pgg51stgG63SLZougpoCjKZkKLAkXFSX59Z0jJlh1vt4vm0kB2JGo4882TMy5V9bq8UZqYLSe1klLtRbMhTFXcC6-Il_pM0mYzN7pvnsj8a0jmdUcbYcQb96JrWlWadx2QES_MgQ3czb9G8O2FBdmJruOdZb2RqqRyXvZ1zfVcPXNdgygUsd8Kyd8LevknQS-wAhKuAmQAUjuUxmhDKm44M0SYhedfe_7KfX--ujp9SyhcUhLVGrETb9QI1RDJn7nsTjZ-A-QjVrKlbcubDvciDIqovHAdetGaCC9Z-15yjfdeuMJ3gTWC1Y9tD1w68ky1oOWgMnwW5JawLWdPvLKWomCzXSlfrQ-Iqp1JQy-8iU44VqIijTKjDrBxT1-RQ8ft1g4Zl1wKUAuWRUe6replBWuEktG0mohdK_mON8ZZoew3Jya4Bb2Bgeat0gYgUlLzPVEgR3-fCfi9R8crgqY3nO7Qa-AB_kKR0otWZGtM28ENKAbXhrHFpukXSm_gCUC8CSnBvDcAev-AoNhGeNGNqNC0fpokOfqcNtZoaKymFnqHAGGpFi_OmmAL2AumcMrc92C4ARyjfQdEq_vVbwgUY5Uwrg0VDXkSTdWh7XGz5bgD20pOKyStqQS-Dd-Ass_ACTa0mjIjGF84frjjzETARnPQ32iwE3i3VW0vqbak1sIl5w3ZiwpfWmQoCXCQjrNeC_NKakn3VtqONqAxrAlGJelUbfbAHEPj6PFuourR8a1WLdcgYQtypRNCnxWEEuqPmT8ofRIDV2rXQpJqgN9Kpbm-4D9VlUqawX9v8Gmet1_ix2KbTjlhBNsL_NUpCAS3GibgDkMWzD13UAQgT71s7Z4JaqANKQfy7JqQDaqLaZe7tHOvRGMIOzz1TSc2DWj5eEKgIBYxeCb8cRnzlkB0wU165EGgKmqMXuBxPS8wwR-B6hPxx9tr_A7XJDjjSYhjR-3bcMKRTOvFcfEAIJgsg7Ljream181QX9YHWxwV20HsHnUjU-Uc40FzW6WGlw-QXEIa0Ty0GghrSxFiAQOvVF5yBRxDtDV1G8_EWte5wv3944HQBUOrwkUWEBp0oXrj9rtKObK6yDP4WZ6I_f9-TRQJ3L9Pd3df7zDxVs4A92NlwbXLxyuBUjyay39JEpomVZ6xNM3xEGvZuMhYHQVVTsoWVrK6rosiY3FW-qQ7XaG5A_bn3e23T1gqOjx4YuR2xt9sNVbLb_40vCP_VGKGxUwR9F7bWh9C3q0CUHiVn-wLLuzDYH-3NXX7p3tDq0EQRL7Pcz8Pce_DgxQle-gM1eZhYARhfwOr8P2Spw9pPJei6V_mcCi5F2zRqQWE29p_CWPgY7MszNeQPdVthU4I8iznaRlnSRb6LGNJUKQFTwtahlWYpTXlaRVUnGMiTRFGR-2CisaVRWixDbCcihDfbW8WnYVgCQ-M3PeZC-DElwrKKtS_JCXlq4GToORQzcZubNKKhJmADzRIcOJwCwAeD5KHU9uaOEI6gDUVRm23N4ZDkP4IThj_EM7jv4STXICTn8CJf4RmBENrA0fcBSzsX2KJL2BJL2G5_-PLl9XdXz-ZzBdlumSxeTTw3tIKiAeVtOpdh4SH-uZ1rAZ4bA8ROAEbgeFAvO__1HWBUex_FKOPQpR8FKLkPyCydfzTNDp-AlUMHUNdQMtQF6QuLiBLB2QxsRR4ua3DfXi-_j0Vs4-yVfZR3ss_ClH-HxBNEgsmgQ2HvMKRt4FWe_IG5iRIMBiEOgKHbNtKaNHdXIUJaVuoQ-oNuY9lBlEd_47Yf4dDQMCkesjckdgP0KN-hP72E-KnxM8OPd0vnLaAsTYAp3oDiEf2NR2JbjSHcrZFUs03AHFCVI1E94ayp8us6uCUaAdDxHtx4SmRFpvtO1Z1dErkCrHrdo_iklMiGJEGwo7BTOPo6kPb8NmV8XeAkKg4IxJQe4nSlau-A1F6cIESncLKX9q5bEJD6mwkulINDo6A5vDTxgE4O_hba4qTqnoSZw4n9EB02xhNiSof8ZeKU_hleeAE5wW29Vw3VJ6yqvlI9Ct6DWIHjrlzO7BDFNxZh1ykYuWkbI1d6Gr99e7b7W-fz1v2ca6b8WWQpkUILVISzKplVBVRQWdGGMmXtqkn7hceaBmHXzXGn4nodw6-Wa_l8mzaFGbblwumdtibyefx3xzmWzQcPLrRF26SIkiL2XaZ8oTVcZhFUenHPOFlEQcsrFiW5kmZhNlMUpiduyXUWZh4Gr530zNOP8n1TCxDPwyDAHpRaO6SYBGEBTALaR7RikdF7MU-h05SLhAHjsEzvbSQcJqGl1J0pju-pJ0dTbkVB_xpb2DEXUIpUfNtT6H5nFnxSwv_b5pxfMc">