================ @@ -369,24 +393,48 @@ void StackAddrEscapeChecker::checkEndFunction(const ReturnStmt *RS, const auto *ReferrerStackSpace = ReferrerMemSpace->getAs<StackSpaceRegion>(); + if (!ReferrerStackSpace) return false; - if (ReferredMemSpace->getStackFrame() == PoppedFrame && - ReferrerStackSpace->getStackFrame()->isParentOf(PoppedFrame)) { + if (const auto *ReferredFrame = ReferredMemSpace->getStackFrame(); + ReferredFrame != PoppedFrame) { + return false; + } + + if (ReferrerStackSpace->getStackFrame()->isParentOf(PoppedFrame)) { + V.emplace_back(Referrer, Referred); + return true; + } + if (isa<StackArgumentsSpaceRegion>(ReferrerMemSpace) && + ReferrerStackSpace->getStackFrame() == PoppedFrame && TopFrame) { + // Output parameter of a top-level function V.emplace_back(Referrer, Referred); return true; } return false; } + void updateInvalidatedRegions(const MemRegion *Region) { + if (const auto *SymReg = Region->getAs<SymbolicRegion>()) { + SymbolRef Symbol = SymReg->getSymbol(); + if (const auto *DerS = dyn_cast<SymbolDerived>(Symbol); + DerS && isa_and_nonnull<SymbolConjured>(DerS->getParentSymbol())) { + InvalidatedRegions.insert(Symbol->getOriginRegion()->getBaseRegion()); + } + } + } ---------------- necto wrote:
Renamed as `ExcludedRegions` in 9075f2e1687d Is it clear with the new name that the checker does not do any invalidation? https://github.com/llvm/llvm-project/pull/105648 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits