[PATCH] D66651: Annotate return values of allocation functions with dereferenceable_or_null

Dávid Bolvanský via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 28 08:59:40 PDT 2019


xbolva00 marked an inline comment as done.
xbolva00 added inline comments.


================
Comment at: llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp:4200
+                          Call.getContext(), Op1C->getZExtValue()));
+  } else if (isCallocLikeFn(&Call, TLI) && Op0C && Op1C) {
+    bool Overflow;
----------------
xbolva00 wrote:
> jdoerfert wrote:
> > xbolva00 wrote:
> > > xbolva00 wrote:
> > > > xbolva00 wrote:
> > > > > xbolva00 wrote:
> > > > > > jdoerfert wrote:
> > > > > > > What if one is NULL but the other not? Will `getWithDereferenceableOrNullBytes(0)` do the right thing?
> > > > > > Maybe isNullValue confused you. isNullValue means just CstInt->getValue() == 0.
> > > > > > 
> > > > > > if Op0C is NULL -> no calloc annotation
> > > > > > if Op1C is NULL -> no calloc annotation
> > > > > > 
> > > > > > if Op0C is '0' -> no annotation; see
> > > > > > if ((Op0C && Op0C->isNullValue()) || (Op1C && Op1C->isNullValue()))
> > > > > >     return;
> > > > > > 
> > > > > > Same for Op1C.
> > > > > I will add a comment like
> > > > > 
> > > > >   // Bail out if the allocation size is zero.
> > > > >   if ((Op0C && Op0C->isNullValue()) || (Op1C && Op1C->isNullValue()))
> > > > >     return;
> > > > Aha, I know what do you mean.
> > > > 
> > > > Hmm, it could work for calloc case - I will look on it.
> > > eh, no :D
> > > 
> > > calloc(1, unknown_var) - We can do nothing in this case ..
> > `calloc(1, 0)` or `calloc(0, 1)` is the question
> No annotation for this cases - why should we? Calloc internally multiplies it
> 
> So calloc(0,1) is logically same as
> 
> p = malloc(0*1);
> memset(p, 0, 0*1)
man calloc
"If nmemb or size is 0, then calloc() returns either NULL, or a unique pointer value that can later  be  successfully passed to free()."

(so same as malloc(0))

We could fold these cases to NULL, but not worth since this rather programmer's mistake than optimization opportunity.



Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D66651/new/

https://reviews.llvm.org/D66651





More information about the llvm-commits mailing list