<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Mar 22, 2016 at 5:30 PM, Pete Cooper <span dir="ltr"><<a href="mailto:peter_cooper@apple.com" target="_blank">peter_cooper@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word">Hi all<div><br></div><div>(No idea if I have the correct audience.  Please CC more people as needed).</div><div><br></div><div>I have an UBSan failure in BumpPtrAllocatorImpl.Allocate.</div><div><br></div><div>The problem is that lld requests that we StringRef::copy an empty string.  This passes a length of 0 to a BumpPtrAllocator.  The BumpPtrAllocator happened to not have anything allocated yet so the CurPtr is nullptr, but given that we need 0 space we think we have enough space and return an allocation of size 0 at address nullptr.  This therefore returns nullptr from Allocate, but that method is marked with LLVM_ATTRIBUTE_RETURNS_NONNULL and LLVM_ATTRIBUTE_RETURNS_NOALIAS, both of which aren’t true in this case.</div><div><br></div><div>To put this in code, if I have</div><div><br></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div>BumpPtrAllocator allocator;</div><div>StringRef s;</div><div>s.copy(allocator);</div></blockquote><div><br></div><div>then i’m going to allocate 0 bytes in the allocator and get a StringRef(nullptr, 0).  Its a valid StringRef, but an UBSan failures in the allocator.</div><div><br></div><div>Lang and I looked up malloc behaviour online as this is fairly analogous.  The answer there is that you are allowed to return nullptr, or not, its implementation defined.  So no help there.</div><div><br></div><div>So the question is, how do we want this to behave in our code?</div><div><br></div><div>Some options:</div><div>- Assert that Allocate never gets a size 0 allocation.  So fix StringRef::copy to see this case</div><div>- Remove the attributes from Allocate but continue to return nullptr (or base of the allocator?) in this case</div><div>- Keep the attributes on Allocate and treat size 0 allocations as size 1</div></div></blockquote><div><br></div><div>I believe the last is closer to 'new's behavior - which I think returns a unique non-null address (well, unique amongst current allocations - can be recycled once deleted) if I recall correctly. Can check for wording if that's helpful/desired.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div><br></div><div>Thanks,</div><div>Pete</div><div><br></div></div></blockquote></div><br></div></div>