[PATCH] D52957: [analyzer] Teach CallEvent about C++17 aligned new.

Balázs Benics via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 4 04:51:48 PST 2020


steakhal added a comment.
Herald added subscribers: ASDenysPetrov, martong, Charusso, dkrupp.

I'm not sure if this implementation is correct.

I'm expecting this checker code not to crash:

  const auto *alloc = dyn_cast<CXXAllocatorCall>(&Call);
  if (!alloc)
    return;
  
  const int NumImpArgs = alloc->getNumImplicitArgs();
  errs() << "alloc->getNumImplicitArgs(): " << NumImpArgs << '\n'; // prints 1
  for (int i = 0; i < NumImpArgs; ++i)
    errs() << "> " << alloc->getPlacementArgExpr(i) << '\n'; // crash: assertion violated
  
  const int NumArgs = alloc->getNumArgs();
  errs() << "alloc->getNumArgs(): " << NumArgs << '\n';
  for (int i = NumImpArgs; i < NumArgs; ++i)
    errs() << "> " << alloc->getArgExpr(i) << '\n';

Analyzed code:

  void foo() {
    int *p = new int;
  }

Assertion:

  clang: ../../clang/include/clang/AST/ExprCXX.h:2272: clang::Expr* clang::CXXNewExpr::getPlacementArg(unsigned int): Assertion `(I < getNumPlacementArgs()) && "Index out of range!"' failed.



---

I'm planning to improve the `MallocChecker` using `CallEvent`s directly, instead of using the underlaying `CallExpr` or `CXXNewExpr` objects in `MallocChecker::checkCXXNewOrCXXDelete`.
Am I misusing something? @NoQ


Repository:
  rL LLVM

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

https://reviews.llvm.org/D52957



More information about the llvm-commits mailing list