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

    <tr>
        <th>Summary</th>
        <td>
            Incorrect pointer assignment operation in binaries compiled with -O0 and -O1
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

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

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

<pre>
    The test case matches that in #107443, with Godbolt links provided [here](https://godbolt.org/z/4M7hqPncb). At line 27, the long pointer should be set to NULL after the assignment, rather than setting g_values[7] to 0.

For the -O3 binary, the situation is debatable because the pointer local_ptr might be optimized away. Therefore, we are focusing on cases where local_ptr is clearly present in the binary.


We can reproduce this issue in LLVM versions 18.1.8, 17.0.6, and 16.0.3. 
```
clang -g -O0 -o 434_O0.out 434.c
clang -g -O1 -o 434_O1.out 434.c


(lldb) file 434_O0.out
(lldb) b 29
(lldb) r
[...]
* thread #1, name = '434_O0.out', stop reason = breakpoint 2.1
    frame #0: 0x00005555555551c2 434_O0.out`get_union_value at 434.c:29:12
   26    *local_ptr = 0;                  // Reset the value at index 7
   27    *g_ptr_wrapper = &local_ptr;     // Update reference
   28   
-> 29            return g_union_vals[6];          // Return the last union value
 30     }
   31   
   32   int main(void) {
(lldb) p *local_ptr
(long) 0
(lldb) p g_ptr_wrapper
(long ***volatile) 0x0000555555558098
(lldb) p *g_ptr_wrapper
(long **) 0x00007fffffffd890
(lldb) p **g_ptr_wrapper
(long *) 0x0000555555558068
(lldb) p ***g_ptr_wrapper
(long) 0
(lldb) p g_values[7]
(long) 0


(lldb) file 434_O1.out
(lldb) b 34
(lldb) r
[...]
(lldb) p *local_ptr
(long) 0
(lldb) s
* thread #1, name = '434_O1.out', stop reason = step in
    frame #0: 0x000055555555517e 434_O1.out`main at 434.c:34:5
   31   
   32   int main(void) {
   33       get_union_value();
-> 34         printf("Hello, world!\n");
   35       return 0;
   36   }
 37     
(lldb) p g_ptr_wrapper
(long ***volatile) 0x0000555555558098
(lldb) p *g_ptr_wrapper
(long **) 0x00007fffffffd8c0
(lldb) p **g_ptr_wrapper
(long *) 0x0000555555558068
(lldb) p ***g_ptr_wrapper
(long) 0
(lldb) p g_values[7]
(long) 0

```


</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzcVk2P4zYS_TX0pWCBIiVLOvhgT693F-jZXgQzybFBUSWJGZpUSMo9Pb8-oOTP7ulMI7kEEQzZMl-9ekVWlUp4rzqDuCb5luR3CzGG3ro1NuPe2rCobfO8_tQjBPQBpPAIexFkjx5CLwIoA4TxlBZZxgn7AE8q9PBv29RWB9DKfPEwOHtQDTZA8m2PDkl-R1jZhzB4wjeE7QjbdbNFYl1H2O4bYbvsY9H_9n8ja8KqBDYTGQIropPQI2hrOhisMgEd-N6OuoEawWOAYOF_n-_vQbRxLYLnIPdoQjR3IvTTgjARH5TpoHs8CD2iJ_m2IPld5KAJoXeEbub7zs5UywcOtTLCPZ-UeBVGEZQ1oDw0WIsgao1QoxSjxwly0qmtFPpxCA72qutDFGyHoPbqGzYgnsRzAp_iFrXW4bSbCMIhtFaOPqq0ZjoCD08RdUWnPEiNwulnGBx6NNPJRNez1ptQ5vsvCFIYcDg424wyClUelPcjRtv7-58_wgGdV9Z4SMskTcooKS0SmqziL2EaSFcJTXgCR-IVPX6mR6mF6WDZwfKBwtJCxrPHB5rYMcSfiXyFSs-o9CXq5s5KrZuYGNAqjVe8r9ZrYNWrP93xn3ybJEnMxiNgA6F3KJopo2OERuwRCL8DwoorJ3MS-mAHcCi8NROmdii-TAcNLElnTgCA1k0sjFPCN0C_UkppfrpSya7lr2iH4XE0ypo5H0GcdoFvWEX4JmVnZrYCILQCwjaXRIhKKOFbeHXNhQY_4VQiPcLZgTINfoXiQlycibtI-vjkxDCgO27F6uzt5OdI_XloREBw2KJDI_FCWE6E8_OS8H8BqyYPAOAwjM5Ad4k61uAqHst1FGf1E3pqAMIHmIzmSI7eOJ19FXdn9zy9ch-f2fQcT2ovlCGsPFjVxMwgxfZVtgw3G3xZtqaLy_Q7Bje7dmMRuebPwWoRlMaJ4yYpSlqV31fxDt4TWdHOV1NW31M4w3_E91rZ6g1lP-J7e6du2u6bNj-q_vSN6ufZu6v_zx-4f38DSf-ggfiAAyjz3s5R3IS-ojGVr9sFzwjf5H-lCCKKw6lQX3QmwkoSO9L2qqp5NqMHp0xoJwT7D2ptp3eZdbohLCX5B0MYuzaOjnJ40RHozfLqRVXz4iqcv2_xyX9O8d2-2-f7olnzpuKVWOA6LVierxgtikW_LlqeyZrJIi1pK0ROOWLDq6qUrWwp4kKtGWUZrWiellmRF0lD27qVIpV5iUVTcpJR3AulE60P-zgXLqbRZD2NmtVCixq1Pw2tbh1Ry3rsPMmoVj74i11QQeP6v0Za51CG8zB2GQrBDuiOI5yZJyaFHqTdD0pjMw-1cYiJI8_yIV2MTq9fDLAq9GOdSLsnbBddH7-Wg7O_ogyE7Sb9nrDdMYTDmv0eAAD__1IrP3E">