================ @@ -1096,6 +1098,47 @@ class StopTrackingCallback final : public SymbolVisitor { return true; } }; + +/// EscapeTrackedCallback - A SymbolVisitor that marks allocated symbols as +/// escaped. +/// +/// This visitor is used to suppress false positive leak reports when smart +/// pointers are nested in temporary objects passed by value to functions. When +/// the analyzer can't see the destructor calls for temporary objects, it may +/// incorrectly report leaks for memory that will be properly freed by the smart +/// pointer destructors. +/// +/// The visitor traverses reachable symbols from a given set of memory regions +/// (typically smart pointer field regions) and marks any allocated symbols as +/// escaped. Escaped symbols are not reported as leaks by checkDeadSymbols. +class EscapeTrackedCallback final : public SymbolVisitor { + ProgramStateRef State; + + explicit EscapeTrackedCallback(ProgramStateRef S) : State(std::move(S)) {} + +public: + /// Escape tracked regions reachable from the given roots. + static ProgramStateRef + EscapeTrackedRegionsReachableFrom(ArrayRef<const MemRegion *> Roots, + ProgramStateRef State) { + EscapeTrackedCallback Visitor(State); + for (const MemRegion *R : Roots) { + State->scanReachableSymbols(loc::MemRegionVal(R), Visitor); + } + return Visitor.getState(); + } + + ProgramStateRef getState() const { return State; } ---------------- steakhal wrote:
I suppose we no longer need this. https://github.com/llvm/llvm-project/pull/152751 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits