[cfe-dev] [Analyzer] Tips on how to fix PR22954 ? (false positive memory leak warning)

Anton Yartsev anton.yartsev at gmail.com
Fri Jul 17 16:15:38 PDT 2015


> Thanks Anton for looking at the issue, modelling "memcpy" seems like 
> the right solution, are you saying that code written to model 
> "assignment" could be reused to model "memcpy" ?
Just an idea, the memcpy action looks similar to assignment at first glance.
Here is a comment from CString checker relevant to the topic:
     // Invalidate the destination (regular invalidation without 
pointer-escaping
     // the address of the top-level region).
     // FIXME: Even if we can't perfectly model the copy, we should see 
if we
     // can use LazyCompoundVals to copy the source values into the 
destination.
     // This would probably remove any existing bindings past the end of the
     // copied region, but that's still an improvement over blank 
invalidation.


>
> The patch you provided definitely fixes the issue thanks, on the other 
> hand if I understand correctly, it seems to me it can lead to new 
> false positives, as the analyzer would wrongly assume that 'a.data''s 
> content remains unchanged after the memcpy call ?
>
> I am thinking it might be possible to modify the region store 
> invalidation worker to restrict the invalidation in the case of arrays 
> by adding a new flag like you did, for example TK_InvalidateArrayOnly ?
Here an issue is related to the struct, not array. However arrays are 
also in the risk group.
I thought of something like TK_DoNotInvalidateSuperRegion. Worker's 
AddToWorkList() automatically adds superregion to worklist:
   bool AddToWorkList(const MemRegion *R) {
     const MemRegion *BaseR = R->getBaseRegion();
     return AddToWorkList(WorkListElement(BaseR), getCluster(BaseR));
   }
With TK_DoNotInvalidateSuperRegion we could selectively localize 
invalidation to a particular subregion, not the whole superregion. This 
could work both for classes and arrays. Perhaps additional coding in 
invalidateRegionsWorker::VisitCluster() is required.
What do you think?


>
> Thanks for your help,
>
> Pierre Gousseau
> SN Systems - Sony Computer Entertainment Group
>
>
> On 16 July 2015 at 20:59, Anton Yartsev <anton.yartsev at gmail.com 
> <mailto:anton.yartsev at gmail.com>> wrote:
>
>     Perhaps the ideal solution is to model "memcpy" properly (similar
>     to assignment?). As you correctly noticed currently we just
>     invalidate the destination buffer in the CString checker and the
>     invalidation worker invalidates the whole struct (do not exactly
>     know the reason for this).
>     While experimented wrote a patch (attached) that fixes the issue
>     by adding a trait for the struct region that prevents the region
>     from being invalidated. The solution does not cause regressions in
>     the clang testsuite. Do not know if the solution is acceptable as
>     a short term fix. Please review!
>
>>     Ping !
>>     Adding analyzer experts to cc.
>>
>>     Regards,
>>
>>     Pierre Gousseau
>>     SN Systems - Sony Computer Entertainment
>>
>>     On 2 July 2015 at 09:06, Pierre Gousseau
>>     <pierregousseau14 at gmail.com <mailto:pierregousseau14 at gmail.com>>
>>     wrote:
>>
>>         Dear All,
>>
>>         I have been looking into PR22954 which has been kindly raised
>>         by krzystof at https://llvm.org/bugs/show_bug.cgi?id=22954
>>         and being new to this area of Clang I would appreciate any
>>         tips on how to fix it.
>>
>>         To me the root of the issue seems to originate from the
>>         CString checker as it performs invalidation of the
>>         destination buffer.
>>         Given the snippet below:
>>         -----------------
>>         struct aa { char *s; char data[32];};
>>         ...
>>         a.s = malloc(nbytes);
>>         memcpy(a.data, source, len);
>>         ...
>>         -----------------
>>         As the CString checker handles the memcpy call, it requests
>>         the invalidation of the 'a.data' region. But the invalidation
>>         worker seems to consider that the whole memory region of 'a'
>>         has to be invalidated. The Malloc checker is not made aware
>>         of this causing the false positive.
>>
>>         It seems a short term fix could be to detect this specific
>>         case and have the CString checker notify the Malloc checker
>>         that it should stop tracking 'a.s'.
>>         However this solution would reduce the number of genuine
>>         defects detected.
>>
>>         So I would be grateful if someone could give some hints on
>>         how to provide the right solution.
>>
>>         Regards,
>>
>>         Pierre Gousseau
>>         SN Systems - Sony Computer Entertainment
>>
>>
>
>
>     -- 
>     Anton
>
>


-- 
Anton

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20150718/2f8c18f0/attachment.html>


More information about the cfe-dev mailing list