<div dir="ltr">I don't know when this was added on cppreference but <br><br>> <span style="color:rgb(0,0,0);font-family:dejavusans,"dejavu sans",arial,sans-serif;font-size:12.8px">The behavior is undefined if after </span><code style="color:rgb(0,0,0);font-size:12.8px;font-family:dejavusansmono,"dejavu sans mono",courier,monospace">free()</code><span style="color:rgb(0,0,0);font-family:dejavusans,"dejavu sans",arial,sans-serif;font-size:12.8px"> returns, an access is made through the pointer </span><code style="color:rgb(0,0,0);font-size:12.8px;font-family:dejavusansmono,"dejavu sans mono",courier,monospace">ptr</code><span style="color:rgb(0,0,0);font-family:dejavusans,"dejavu sans",arial,sans-serif;font-size:12.8px"> (unless another allocation function happened to result in a pointer value equal to </span><code style="color:rgb(0,0,0);font-size:12.8px;font-family:dejavusansmono,"dejavu sans mono",courier,monospace">ptr</code><span style="color:rgb(0,0,0);font-family:dejavusans,"dejavu sans",arial,sans-serif;font-size:12.8px">)<br><br>This seems to suggest that there is no UB... However, I couldn't find the corresponding line or relevant part on latest C std, </span><font color="#000000" face="dejavusans, dejavu sans, arial, sans-serif"><span style="font-size:12.8px"><a href="http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf">http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf</a></span></font><div><font color="#000000" face="dejavusans, dejavu sans, arial, sans-serif"><span style="font-size:12.8px"><br></span></font></div><div><font color="#000000" face="dejavusans, dejavu sans, arial, sans-serif"><span style="font-size:12.8px">Regards,</span></font></div><div><font color="#000000" face="dejavusans, dejavu sans, arial, sans-serif"><span style="font-size:12.8px">Kevin</span></font></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Apr 11, 2017 at 4:27 PM, Sanjoy Das <span dir="ltr"><<a href="mailto:sanjoy@playingwithpointers.com" target="_blank">sanjoy@playingwithpointers.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Kevin,<br>
<span class=""><br>
On April 11, 2017 at 4:14:14 PM, Flamedoge (<a href="mailto:code.kchoi@gmail.com">code.kchoi@gmail.com</a>) wrote:<br>
> So only "non-freed" malloc pointers are No-Alias which makes it<br>
> flow-sensitive. There is no reason why malloc couldn't return previously<br>
> freed location.<br>
<br>
</span>Yes.<br>
<br>
Talking to Nick Lewycky on IRC, I figured out a shorter way of saying<br>
what I wanted to say.  We know that programs like this are UB in C:<br>
<br>
p0 = malloc();<br>
free(p0);<br>
p1 = malloc();<br>
if (p0 == p1) {<br>
  int v = *p0; // Semantically free'ed but bitwise equal to an allocated value<br>
}<br>
<br>
and we relied on them having UB when marking malloc's return value as noalias.<br>
<br>
However, we can end up in cases like the above by applying<br>
loop-unswitch + GVN to well defined C programs.<br>
<span class="HOEnZb"><font color="#888888"><br>
-- Sanjoy<br>
</font></span></blockquote></div><br></div>