<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/143379>143379</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[X86_64] Incorrect value of local variable after longjmp with optimizatio
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
hutuhutong
</td>
</tr>
</table>
<pre>
Summary
When compiling the following C code with optimization level -O1, the local variable x exhibits unexpected behavior. In principle, under optimization levels -O1, -O2, and -O3, Clang should treat the allocation and modification of the variable x in a consistent manner. However, when the statement printf("Address of x: %p\n", (void*)&x); is included, a different result is observed at -O1, indicating inconsistent optimization behavior. This suggests that Clang handles the optimization of the printf call involving the address of x in a non-uniform way.
Details
========test.c========
#include <stdio.h>
#include <setjmp.h>
#include <stdlib.h>
void test_gamma() {
int x=0;
jmp_buf env;
if (setjmp(env)) {
printf("Jumped here\n");
} else {
x = 42;
longjmp(env, 1);
}
printf("Value of x: %d Address of x: %p\n", x, (void*)&x);
}
void test_gamma1() {
int x=0;
jmp_buf env;
if (setjmp(env)) {
printf("Jumped here\n");
} else {
x = 42;
longjmp(env, 1);
}
int a = x*1;
printf("Value of x: %d %d\n", x, a);
}
int main() {
test_gamma();
test_gamma1();
return 0;
}
========output========
$ clang -O0 test.c -o test
$ ./test
Jumped here
Value of x: 42 Address of x: 0x7ffc7979655c
Jumped here
Value of x: 42 42
$ clang -O1 test.c -o test
$ ./test
Jumped here
Value of x: 42 Address of x: 0x7ffd6dc09afc
Jumped here
Value of x: 0 0
$ clang -O2 test.c -o test
$ ./test
Jumped here
Value of x: 0 Address of x: 0x7ffceb8ec25c
Jumped here
Value of x: 0 0
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJykVk2P8jYQ_jXmMgIlTgLkkAMLRX172UOrtreVE08Srxw78kdg--srh7CwsPtSdSMLf8zXM8-MkZm1olGIBcmeSLabMe9abYrWO996p1UzKzV_K373XcfMG4k2JNr81aKCSne9kEI14FqEWkupD2G3hUpzhINwLejeiU78w5zQCiQOKGH-HBO6HW2krpiEgRnBSolwBDy2ohTOgld47LFyyKHElg1CmwX8UNAboSrRSwwuvOJoPglhzzHmzzRMTHGYPydhuZVMNWBb7SUHZ5C5EQiTAcroISh3motaTAe6HlWuUAoFDCqtrLAOlYOOKYVmAb_qAw5oQpxDICiYWcccdkErQHc1oWtC6YZzg9YG30eSbIDQrCfZVhE6AiZ0PWjBCd0QmhO6PIYpeQJhQahKeo58zAu4qGs0wbtB66ULGrq0aAbkwNyZB6H4mI1qgv0F-AfqLjz_0QoL1jcNWmfBtcxNvLVMcYl2TOyD7cTRKUWomJQg1KDlcO4OdpXwiT-l1dwrUWvTwYG9LU6NdRo7dExIO-2T3afDoXWL6itpMKTJxBaQZGsdF3rRkuSXexG6167_Qua4FOW7bByhNhDCvzSs69hY0hzI6olEGwAAoVwo6y4iyfnotetfSl8DquFyKOpQ6VN0QtdBFsr97uq6Y37zXY8cWjT43ij5xRVZ7QClxSsU4TsCSXaQ0klRatVcxdpCfOtkWl1H_pNJj9edygHgQQMff9LFgcMx0D2T8f-j8hGP0_cNOm94nL7_TGfIgo0ujoRu4knlAcnh55ZSdk-hGP-AhPpI3W13XlDdsX0RGXTeKIhuInx1xbR3vXc_vYApVOMfx_w5gtN9hbkeV5N4Qeh-2l6XJNp8JCSln_RcdFzVdbXKV_kyy6rHHlI65XMFK_4urE9B8SWvopzVj0BFEN1Dot-CFH1JFJZrrOhDok6YZrxIeJ7kbIZFvErzdJUmcT5rizVStq7riOZRsszThGG8rJdZXbNVhDSuZqKgEc2iZZTHSZTF-WKZ10ukK7rmOS2rjJM0wo4JuZBy6BbaNDNhrcciTpNklc8kK1Ha8TFCqcIDjNJwCbLdzBTBaF76xpI0ksI6e3HjhJPjK-bv9fJlmZJsBz9UpY3BysFwTvLmzcFqh-Z8k-_eLDNvZNE611uSbAjdE7pvhGt9uah0R-g-xJ6meW_0K1aO0P2I2BK6n1IaCvpvAAAA__8Uhc_l">