================
@@ -46,330 +44,104 @@ namespace {
struct PendingWarning {
SourceLocation ExpiryLoc; // Where the loan expired.
llvm::PointerUnion<const UseFact *, const OriginEscapesFact *> CausingFact;
- const Expr *MovedExpr;
- const Expr *InvalidatedByExpr;
- bool CausingFactDominatesExpiry;
+ Confidence ConfidenceLevel;
};
-using AnnotationTarget =
- llvm::PointerUnion<const ParmVarDecl *, const CXXMethodDecl *>;
-using EscapingTarget =
- llvm::PointerUnion<const Expr *, const FieldDecl *, const VarDecl *>;
-
class LifetimeChecker {
private:
llvm::DenseMap<LoanID, PendingWarning> FinalWarningsMap;
- llvm::DenseMap<AnnotationTarget, const Expr *> AnnotationWarningsMap;
- llvm::DenseMap<const ParmVarDecl *, EscapingTarget> NoescapeWarningsMap;
const LoanPropagationAnalysis &LoanPropagation;
- const MovedLoansAnalysis &MovedLoans;
const LiveOriginsAnalysis &LiveOrigins;
- FactManager &FactMgr;
- LifetimeSafetySemaHelper *SemaHelper;
- ASTContext &AST;
-
- static SourceLocation
- GetFactLoc(llvm::PointerUnion<const UseFact *, const OriginEscapesFact *> F)
{
- if (const auto *UF = F.dyn_cast<const UseFact *>())
- return UF->getUseExpr()->getExprLoc();
- if (const auto *OEF = F.dyn_cast<const OriginEscapesFact *>()) {
- if (auto *ReturnEsc = dyn_cast<ReturnEscapeFact>(OEF))
- return ReturnEsc->getReturnExpr()->getExprLoc();
- if (auto *FieldEsc = dyn_cast<FieldEscapeFact>(OEF))
- return FieldEsc->getFieldDecl()->getLocation();
- }
- llvm_unreachable("unhandled causing fact in PointerUnion");
- }
+ const FactManager &FactMgr;
+ LifetimeSafetyReporter *Reporter;
public:
LifetimeChecker(const LoanPropagationAnalysis &LoanPropagation,
- const MovedLoansAnalysis &MovedLoans,
- const LiveOriginsAnalysis &LiveOrigins, FactManager &FM,
- AnalysisDeclContext &ADC,
- LifetimeSafetySemaHelper *SemaHelper)
- : LoanPropagation(LoanPropagation), MovedLoans(MovedLoans),
- LiveOrigins(LiveOrigins), FactMgr(FM), SemaHelper(SemaHelper),
- AST(ADC.getASTContext()) {
- for (const CFGBlock *B : *ADC.getAnalysis<PostOrderCFGView>())
+ const LiveOriginsAnalysis &LiveOrigins, const FactManager
&FM,
+ AnalysisDeclContext &ADC, LifetimeSafetyReporter *Reporter)
+ : LoanPropagation(LoanPropagation), LiveOrigins(LiveOrigins),
FactMgr(FM),
+ Reporter(Reporter) {
+ for (const CFGBlock *B : *ADC.getAnalysis<PostOrderCFGView>()) {
for (const Fact *F : FactMgr.getFacts(B))
if (const auto *EF = F->getAs<ExpireFact>())
checkExpiry(EF);
- else if (const auto *IOF = F->getAs<InvalidateOriginFact>())
- checkInvalidation(IOF);
- else if (const auto *OEF = F->getAs<OriginEscapesFact>())
- checkAnnotations(OEF);
- issuePendingWarnings();
- suggestAnnotations();
- reportNoescapeViolations();
- // Annotation inference is currently guarded by a frontend flag. In the
- // future, this might be replaced by a design that differentiates between
- // explicit and inferred findings with separate warning groups.
- if (AST.getLangOpts().EnableLifetimeSafetyInference)
- inferAnnotations();
- }
-
- /// Checks if an escaping origin holds a placeholder loan, indicating a
- /// missing [[clang::lifetimebound]] annotation or a violation of
- /// [[clang::noescape]].
- void checkAnnotations(const OriginEscapesFact *OEF) {
- OriginID EscapedOID = OEF->getEscapedOriginID();
- LoanSet EscapedLoans = LoanPropagation.getLoans(EscapedOID, OEF);
- auto CheckParam = [&](const ParmVarDecl *PVD) {
- // NoEscape param should not escape.
- if (PVD->hasAttr<NoEscapeAttr>()) {
- if (auto *ReturnEsc = dyn_cast<ReturnEscapeFact>(OEF))
- NoescapeWarningsMap.try_emplace(PVD, ReturnEsc->getReturnExpr());
- if (auto *FieldEsc = dyn_cast<FieldEscapeFact>(OEF))
- NoescapeWarningsMap.try_emplace(PVD, FieldEsc->getFieldDecl());
- if (auto *GlobalEsc = dyn_cast<GlobalEscapeFact>(OEF))
- NoescapeWarningsMap.try_emplace(PVD, GlobalEsc->getGlobal());
- return;
- }
- // Suggest lifetimebound for parameter escaping through return.
- if (!PVD->hasAttr<LifetimeBoundAttr>())
- if (auto *ReturnEsc = dyn_cast<ReturnEscapeFact>(OEF))
- AnnotationWarningsMap.try_emplace(PVD, ReturnEsc->getReturnExpr());
- // TODO: Suggest lifetime_capture_by(this) for parameter escaping to a
- // field!
- };
- auto CheckImplicitThis = [&](const CXXMethodDecl *MD) {
- if (!implicitObjectParamIsLifetimeBound(MD))
- if (auto *ReturnEsc = dyn_cast<ReturnEscapeFact>(OEF))
- AnnotationWarningsMap.try_emplace(MD, ReturnEsc->getReturnExpr());
- };
- for (LoanID LID : EscapedLoans) {
- const Loan *L = FactMgr.getLoanMgr().getLoan(LID);
- const AccessPath &AP = L->getAccessPath();
- if (const auto *PVD = AP.getAsPlaceholderParam())
- CheckParam(PVD);
- else if (const auto *MD = AP.getAsPlaceholderThis())
- CheckImplicitThis(MD);
}
----------------
NeKon69 wrote:
I don't think the braces you added here are needed
https://github.com/llvm/llvm-project/pull/171808
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits