[PATCH][Review request] unix.Malloc checker improvement: +handling new/delete, +memory.MismatchedFree, +memory.MismatchedDelete, +improved display names for allocators/deallocators
Anton Yartsev
anton.yartsev at gmail.com
Tue Mar 12 08:56:36 PDT 2013
On 12.03.2013 2:24, Jordan Rose wrote:
> Looking over this one last time...
>
>> - os << "Argument to free() is offset by "
>> + os << "Argument to ";
>> + if (!printAllocDeallocName(os, C, DeallocExpr))
>> + os << "deallocator";
>> + os << " is offset by "
>> << offsetBytes
>> << " "
>> << ((abs(offsetBytes) > 1) ? "bytes" : "byte")
>> - << " from the start of memory allocated by malloc()";
>> + << " from the start of ";
>> + if (AllocExpr) {
>> + SmallString<100> TempBuf;
>> + llvm::raw_svector_ostream TempOs(TempBuf);
>> + if (printAllocDeallocName(TempOs, C, AllocExpr))
>> + os << "memory allocated by " << TempOs.str();
>> + else
>> + os << "allocated memory";
>> + } else
>> + printExpectedAllocName(os, C, DeallocExpr);
>> +
>
> The way you've set it up, AllocExpr will never be NULL (which is good,
> because otherwise you'd get "...from the start of malloc()" rather
> than "from the start of memory allocated by malloc()").
Strange logic. Fixed.
>
>
>> + at interface Wrapper : NSData
>> +- (id)initWithBytesNoCopy:(void *)bytes length:(NSUInteger)len;
>> + at end
>
> As I discovered with the rest of the ObjC patch, this isn't a great
> test case because the analyzer doesn't consider it a system method.
> However, I don't see you use it anywhere in the file anyway, so you
> can probably just remove it.
>
>
>> +void testNew11(NSUInteger dataLength) {
>> + int *data = new int;
>> + NSData *nsdata = [NSData dataWithBytesNoCopy:data
>> length:sizeof(int) freeWhenDone:1]; // expected-warning{{Memory
>> allocated by 'new' should be deallocated by 'delete', not
>> +dataWithBytesNoCopy:length:freeWhenDone:}}
>> +}
>
> Hm, that is rather unwieldy, but what bothers me more is that
> +dataWithBytesNoCopy:length:freeWhenDone: /doesn't/ free the memory;
> it just takes ownership of it. I guess it's okay to leave that as a
> FIXME for now, but in the long run we should say something like
> "+dataWithBytesNoCopy:length:freeWhenDone: cannot take ownership of
> memory allocated by 'new'." (In the "hold" cases, most likely the user
> wasn't intending to free
>
> But, this doesn't have to block the patch; you/we can fix it post-commit.
>
>
>> + delete x; // FIXME: Shoud detect pointer escape and keep silent.
>> checkPointerEscape() is not currently invoked for delete.
>
> Pedantic note: the real issue here is that we don't model delete at
> all (see ExprEngine::VisitCXXDeleteExpr). The correct model won't
> explicitly invoke checkPointerEscape, but it will construct a
> CallEvent for the deletion operator and then try to evaluate that
> call—or at least invalidate the arguments like VisitCXXNewExpr does
> for placement args—which will cause the argument region to get
> invalidated and checkPointerEscape to be triggered.
>
> Jordan
Updated patch attached.
--
Anton
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130312/6e83f6c4/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: MallocChecker_v11.patch
Type: text/x-diff
Size: 53775 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130312/6e83f6c4/attachment.patch>
More information about the cfe-commits
mailing list