<div><a href="http://www.kernel.org/doc/man-pages/online/pages/man3/free.3.html">http://www.kernel.org/doc/man-pages/online/pages/man3/free.3.html</a></div><div><br></div><div>It seems Linux has different definition from Mac OS X.</div><div><includetail><div> </div><div> </div><div style="font:Verdana normal 14px;color:#000;"><div style="FONT-SIZE: 12px;FONT-FAMILY: Arial Narrow;padding:2px 0 2px 0;">------------------ Original ------------------</div><div style="FONT-SIZE: 12px;background:#efefef;padding:8px;"><div id="menu_sender"><b>From: </b> "Jordy Rose"<jediknil@belkadan.com>;</div><div><b>Date: </b> Thu, Sep 1, 2011 01:58 PM</div><div><b>To: </b> "Zhongxing Xu"<xuzhongxing@foxmail.com>; <wbr></div><div><b>Cc: </b> "cfe-commits"<cfe-commits@cs.uiuc.edu>; <wbr></div><div><b>Subject: </b> Re: [cfe-commits] r138937 - in /cfe/trunk: lib/StaticAnalyzer/Checkers/MallocChecker.cpp test/Analysis/malloc.c</div></div><div> </div>I'm not sure about this...it's unspecified in the C standard and not true on Mac OS X (at least not in Lion):<br><br>"If size is zero and ptr is not NULL, a new, minimum sized object is allocated and the original object is freed."<br><br>But we definitely don't need both transitions, and UndefinedVal is probably wrong. It's only /dereferencing/ the pointer that's bad.<br><br>Jordy<br><br><br>On Aug 31, 2011, at 21:53, Zhongxing Xu wrote:<br><br>> Author: zhongxingxu<br>> Date: Wed Aug 31 23:53:59 2011<br>> New Revision: 138937<br>> <br>> URL: http://llvm.org/viewvc/llvm-project?rev=138937&view=rev<br>> Log:<br>> If size was equal to 0, either NULL or a pointer suitable to be passed to <br>> free() is returned by realloc(). Most code expect NULL.<br>> <br>> And we only need to transfer one final ProgramState.<br>> <br>> Modified:<br>>    cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp<br>>    cfe/trunk/test/Analysis/malloc.c<br>> <br>> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp<br>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp?rev=138937&r1=138936&r2=138937&view=diff<br>> ==============================================================================<br>> --- cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp (original)<br>> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp Wed Aug 31 23:53:59 2011<br>> @@ -538,11 +538,8 @@<br>>       if (const ProgramState *stateFree = <br>>           FreeMemAux(C, CE, stateSizeZero, 0, false)) {<br>> <br>> -        // Add the state transition to set input pointer argument to be free.<br>> -        C.addTransition(stateFree);<br>> -<br>> -        // Bind the return value to UndefinedVal because it is now free.<br>> -        C.addTransition(stateFree->BindExpr(CE, UndefinedVal(), true));<br>> +        // Bind the return value to NULL because it is now free.<br>> +        C.addTransition(stateFree->BindExpr(CE, svalBuilder.makeNull(), true));<br>>       }<br>>     if (const ProgramState *stateSizeNotZero = stateNotEqual->assume(SizeZero,false))<br>>       if (const ProgramState *stateFree = FreeMemAux(C, CE, stateSizeNotZero,<br>> <br>> Modified: cfe/trunk/test/Analysis/malloc.c<br>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/malloc.c?rev=138937&r1=138936&r2=138937&view=diff<br>> ==============================================================================<br>> --- cfe/trunk/test/Analysis/malloc.c (original)<br>> +++ cfe/trunk/test/Analysis/malloc.c Wed Aug 31 23:53:59 2011<br>> @@ -41,7 +41,7 @@<br>> <br>> void f2_realloc_1() {<br>>   int *p = malloc(12);<br>> -  int *q = realloc(p,0); // expected-warning{{Assigned value is garbage or undefined}}<br>> +  int *q = realloc(p,0); // no-warning<br>> }<br>> <br>> // ownership attributes tests<br>> <br>> <br>> _______________________________________________<br>> cfe-commits mailing list<br>> cfe-commits@cs.uiuc.edu<br>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits<br><br><br></div></includetail></div>