<div dir="ltr">From <a href="https://www.quora.com/Is-memcpy-0-0-0-undefined-behaviour-in-C">https://www.quora.com/Is-memcpy-0-0-0-undefined-behaviour-in-C</a><br><div><br></div><div><span style="color:rgb(51,51,51);font-family:q_serif,Georgia,Times,"Times New Roman",serif;font-size:14px">Yes, the C standard explicitly addresses this in §7.24.1/2, which applies to memcpy and all other functions from string.h</span><br style="margin-top:0px;color:rgb(51,51,51);font-family:q_serif,Georgia,Times,"Times New Roman",serif;font-size:14px"><br style="color:rgb(51,51,51);font-family:q_serif,Georgia,Times,"Times New Roman",serif;font-size:14px"><blockquote style="padding-left:1em;color:rgb(102,102,102);border-left:2px solid rgb(221,221,221);margin:0px;font-family:q_serif,Georgia,Times,"Times New Roman",serif;font-size:14px">Where an argument declared as size_t n specifies the length of the array for a<br>function, n can have the value zero on a call to that function. Unless explicitly stated otherwise in the description of a particular function in this subclause, pointer arguments on such a call shall still have valid values, as described in 7.1.4. On such a call, a function that locates a character finds no occurrence, a function that compares two character sequences returns zero, and a function that copies characters copies zero characters<br></blockquote><br style="color:rgb(51,51,51);font-family:q_serif,Georgia,Times,"Times New Roman",serif;font-size:14px"><span style="color:rgb(51,51,51);font-family:q_serif,Georgia,Times,"Times New Roman",serif;font-size:14px">The description of memcpy in §7.24.1.2 does not "explicitly state otherwise", and §7.1.4 defines invalid pointer as</span><br style="color:rgb(51,51,51);font-family:q_serif,Georgia,Times,"Times New Roman",serif;font-size:14px"><br style="color:rgb(51,51,51);font-family:q_serif,Georgia,Times,"Times New Roman",serif;font-size:14px"><blockquote style="padding-left:1em;color:rgb(102,102,102);border-left:2px solid rgb(221,221,221);margin:0px;font-family:q_serif,Georgia,Times,"Times New Roman",serif;font-size:14px">a pointer outside the address space of the program, or a null pointer, or a pointer to non-modifiable storage when the corresponding parameter is not const-qualified<br></blockquote><br style="color:rgb(51,51,51);font-family:q_serif,Georgia,Times,"Times New Roman",serif;font-size:14px"><span style="color:rgb(51,51,51);font-family:q_serif,Georgia,Times,"Times New Roman",serif;font-size:14px">So, the pointer arguments of memcpy </span><b style="margin-bottom:0px;color:rgb(51,51,51);font-family:q_serif,Georgia,Times,"Times New Roman",serif;font-size:14px">shall</b><span style="color:rgb(51,51,51);font-family:q_serif,Georgia,Times,"Times New Roman",serif;font-size:14px"> (a violation of a shall clause is UB, per §4/2) have valid values, even though the function will copy zero characters.</span><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jul 21, 2017 at 7:05 AM, Ralf Jung via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi all,<br>
<br>
when I call the llvm.memcpy/memmove/memset.* intrinsics, typically I<br>
have to pass in valid (non-dangling, non-NULL pointers) of the given<br>
alignment.  However, to what extent to these rules apply when the count<br>
is 0?  Concretely (for any variant of the three aforementioned<br>
intrinsics): Is it UB to call them on a dangling pointer when count is<br>
0?  On a pointer of less than the given alignment?<br>
<br>
The actual operation will of course not do anything, but I am worried<br>
about some analysis seeing a pointer being used as an argument to one of<br>
these intrinsics, and then assuming the pointer is valid and aligned<br>
without proving that the count is > 0.<br>
<br>
E.g., Rust's HashMap indirectly calls memset(0x0, 0, 0, ..., false).<br>
Vec calls memcpy(..., 0x1, 0, 4, false).  Is that a problem?<br>
<br>
Kind regards,<br>
Ralf<br>
<br>
PS: I'm not on the list, so please keep me in Cc.<br>
______________________________<wbr>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
</blockquote></div><br></div>