<div>Okay. I am fine with returning a non-null pointer when the size is 0. </div><div><includetail><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> Fri, Sep 2, 2011 10:17 AM</div><div><b>To: </b> "Xu Zhongxing"<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 think that's just defensive programming in case the allocation fails. It's not possible for n to be 0 in this function.<br><br><br>On Sep 1, 2011, at 18:37, Xu Zhongxing wrote:<br><br>> I find some real code assumes the NULL return value. For example, <br>> <br>> SXML_CHAR* strcat_alloc(SXML_CHAR** src1, const SXML_CHAR* src2)<br>> {<br>>     SXML_CHAR* cat;<br>>   int n;<br>> <br>>     if (src1 == NULL || *src1 == src2) return NULL; /* Do not concatenate '*src1' with itself */<br>> <br>>       /* Concatenate a NULL or empty string */<br>>  if (src2 == NULL || *src2 == NULC) return *src1;<br>> <br>>   n = (*src1 == NULL ? 0 : sx_strlen(*src1)) + sx_strlen(src2) + 1;<br>>         cat = (SXML_CHAR*)__realloc(*src1, n*sizeof(SXML_CHAR));<br>>  if (cat == NULL) return NULL;<br>>     if (*src1 == NULL) *cat = NULC;<br>>   *src1 = cat;<br>>      sx_strcat(*src1, src2);<br>> <br>>    return *src1;<br>> }<br>>  <br>> It compares 'cat' with 'NULL'.<br>> <br>> ------------------ Original ------------------<br>> From:  "Jordy Rose"<jediknil@belkadan.com>;<br>> Date:  Fri, Sep 2, 2011 09:31 AM<br>> To:  "Xu Zhongxing"<xuzhongxing@foxmail.com>;<br>> Cc:  "cfe-commits"<cfe-commits@cs.uiuc.edu>;<br>> Subject:  Re: [cfe-commits] r138937 - in /cfe/trunk: lib/StaticAnalyzer/Checkers/MallocChecker.cpp test/Analysis/malloc.c<br>>  <br>> If we want to check the current OS, that's one thing, but I don't think we can make this assumption everywhere. Even the man page you linked leaves open the possibility of being non-null on Linux systems.<br>> <br>> Jordy<br>> <br>> <br>> On Sep 1, 2011, at 18:25, Xu Zhongxing wrote:<br>> <br>> > http://www.kernel.org/doc/man-pages/online/pages/man3/free.3.html<br>> > <br>> > It seems Linux has different definition from Mac OS X.<br>> >  <br>> >  <br>> > ------------------ Original ------------------<br>> > From:  "Jordy Rose"<jediknil@belkadan.com>;<br>> > Date:  Thu, Sep 1, 2011 01:58 PM<br>> > To:  "Zhongxing Xu"<xuzhongxing@foxmail.com>;<br>> > Cc:  "cfe-commits"<cfe-commits@cs.uiuc.edu>;<br>> > Subject:  Re: [cfe-commits] r138937 - in /cfe/trunk: lib/StaticAnalyzer/Checkers/MallocChecker.cpp test/Analysis/malloc.c<br>> >  <br>> > 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>> <br>> <br><br><br></div></includetail></div>