<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/137693>137693</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Address of empty function is not unique
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
fekir
</td>
</tr>
</table>
<pre>
Consider following snippet (https://godbolt.org/z/beGsh8zoj) compiled at least with `-O1`:
~~~~
#include <iostream>
void foo() { __builtin_unreachable(); }
void bar() {}
int main() {
auto ap = size_t(&foo);
auto bp = size_t(&bar);
std::cout
<< ap << "\n"
<< bp << "\n"
<< ap-bp << "\n"
<< (ap == bp ? "true\n" : "false\n");
}
~~~~
the output of this programs look like
~~~~
95027430187360
95027430187360
0
false
~~~~
clang manages to creates two equal numbers (the difference is `0`), that are not equal
I believe this issue is related to https://github.com/llvm/llvm-project/issues/60588 (the oldest one I could find), which was (IMHO wrongly) rejected.
`void foo() { __builtin_unreachable(); }` does not have undefined behavior as long as it is not called, and taking the address of `foo` should thus not trigger undefined behavior.
The argument "The problematic code doesn't need to be executed for UB to take effect" is strangely worded.
The function `int baz(int i){return 1/i;}` also has UB when called as `baz(0)`, but as long as no one calls `baz` with the parameter `0`, there is no UB.
Contrary to most linked bug reports linked to https://github.com/llvm/llvm-project/issues/60588, the problematic function is not called.
As to why one would write something like `foo`; an example would be to write code for a compiler that does not support `__builtin_unreachable`; for example
~~~~
#ifdef PLATFORM_WITH_BUILTIN_UNREACHABLE
void foo() { __builtin_unreachable(); }
#else
void foo() { abort(); }
#endif
// some code that uses foo instead of
// __builtin_unreachable directly to ensure portability
// with different compilers
~~~~
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJykVk1v2zgT_jX0ZdCApmxZPvhgu_XbAP14USTYY0CJI4kNRar8iJsc8tsXQ9lxuw12gRZIIHo4n888M5IMQXcWccOWO7Z8O5Mp9s5vWrzXflY79bjZOxu0Qg-tM8Ydte0gWD2OGIGJqo9xDKzYMnFg4tA5VTsTr5zvmDg8MXGo8X-hr57cVybW0Lhh1AYVyAgGZYhw1LEHVvI3n-es5OSH09_z8_MznUShbWOSQmDFXrsQPcqBFe8mrQenFbTOMVGRd7bawd1dnbSJ2t4l61E2vawNTves2AFbvT3b1dJf7CY541ttIwxS2x-u-BZkig7kCKx4C0E_4V3M92WOTY5flOpflXKgkxLphaiozmLbuBSBJKzYs2I_BcgnJgRb7i09Ltf1v1_L8c1_aDBRTTVQhln3QIrRJzwpAyu2JGqlCWfZJfeM0bkzfBt7BJfimCK4FmKvA4zedV4OAYxz92D0PcJP_VwvuVgtCj6vVkXJXxPQ_xT9x1CMbxsjbQeDtLLDANFB41FGOh4d4LckDdg01OgD1Um5Kd226NE2CDoQxzgxTKyZ2EPsZQTpEayLk_VLIMa311Cj0fiAU1U6hJR9eDQyoqLo_6C9jn2qrxo3MHEw5uH8eDN69xWbyMQhOwlMHEq-rKpzjs4oDBGcRbiGxiWjoNVWnbI89rrp4ShzSdcf33-Go3e2M49ETY_kGdXVKe2S_944lByUw5CR6OUDQrIKW21RQY29fNDOg6SO2o6eOhISpNxIY1BRntIqiPKeNgMVJZXyGAKxgpWcEio5hD5XF_s0WUevuw79K9FOBd2QJ9-lAS0tGkG_R-9qg4OMuoHGKcyZWyZWESxOjakR8Ds2ifrUOg-3O5JGeY-AbZt7IaiCEL20HZpHODqvJhgpRJtsE7WzlDotg1o-MVHRSRNoq53HmLyFOfWUBmOCUJrgoJeB4h17tCd0CDFW8slJJh9RcA91ij-Cal2mANm86Jd8Wo6E6Ci9HDCiv9CYOIwep2bA7e6E2t7Z6KV_pKIHFyIYbe8J3NSBx9H5GM6iP2fxKYuf2vKC308sOWW3zZN77B9zucfMiKPXESG4AWNPDJq2xpk3xFJpAb_LYTRnkxqzm2yYaUCNlue3i5-m-4XUIY1UN_l8fRymKOTjFOaXd1CrsIX_f9jeHD5_-Xj31_XN-7vd7fWHm-tPd7efvrzb7t9vdx_e_cEbiYkCp6X3igdZOx9fs7BKt6fpzw3MKE6IZAhSwEC-QNsQUao8kS_KryYGSntsoskEQhuSRyD0ZK2Njo8X68zN84qNL9iHC3AztSnUuljLGW7mq8WyKlclL2f9Rq3KdqHWXM2LRsq2LXi1Xi2x4Yuqmq-rZqY3goslX4hqvp4XoryqFnIt11gqUfDlWkm24DhIba6InvSxMcvE3MyLVbkuZkbWaML5i8ZvMonr1AW24EaHGC52UUeDm-1lY-EwxsdfWJys_pZwlrzZ_P7MnLJ72Ii_AwAA___ZWPoa">