================
@@ -355,14 +355,30 @@ class RetainPtrCtorAdoptChecker
void visitBinaryOperator(const BinaryOperator *BO) const {
if (!BO->isAssignmentOp())
return;
- if (!isa<ObjCIvarRefExpr>(BO->getLHS()))
- return;
+ auto *LHS = BO->getLHS();
auto *RHS = BO->getRHS()->IgnoreParenCasts();
- const Expr *Inner = nullptr;
- if (isAllocInit(RHS, &Inner)) {
- CreateOrCopyFnCall.insert(RHS);
- if (Inner)
- CreateOrCopyFnCall.insert(Inner);
+ if (isa<ObjCIvarRefExpr>(LHS)) {
+ const Expr *Inner = nullptr;
+ if (isAllocInit(RHS, &Inner)) {
+ CreateOrCopyFnCall.insert(RHS);
+ if (Inner)
+ CreateOrCopyFnCall.insert(Inner);
+ }
+ return;
+ } else if (auto *UO = dyn_cast<UnaryOperator>(LHS)) {
+ auto OpCode = UO->getOpcode();
+ if (OpCode == UO_Deref) {
+ if (auto *DerefTarget = UO->getSubExpr()) {
+ DerefTarget = DerefTarget->IgnoreParenCasts();
+ auto *DRE = dyn_cast<DeclRefExpr>(DerefTarget);
+ if (auto *Decl = DRE->getDecl()) {
----------------
steakhal wrote:
So here we use dyn_cast, that suggest to me that we don't know if the cast
succeeds or not.
If we knew, we would use `cast` instead. Consequently, `DRE` might be null
here, that we unconditionally dereference subsequently.
We should either use `cast` or check `DRE` against null before dereferencing -
probably the latter IMO.
https://github.com/llvm/llvm-project/pull/161633
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits