This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rGa1a63d68a468: [clang][dataflow] Add two repros for non-convergence involving pointers in… (authored by mboehme).
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D158513/new/ https://reviews.llvm.org/D158513 Files: clang/unittests/Analysis/FlowSensitive/TestingSupport.h clang/unittests/Analysis/FlowSensitive/TransferTest.cpp Index: clang/unittests/Analysis/FlowSensitive/TransferTest.cpp =================================================================== --- clang/unittests/Analysis/FlowSensitive/TransferTest.cpp +++ clang/unittests/Analysis/FlowSensitive/TransferTest.cpp @@ -2667,11 +2667,7 @@ void target() {} )"; ASSERT_THAT_ERROR( - checkDataflowWithNoopAnalysis( - Code, - [](const llvm::StringMap<DataflowAnalysisState<NoopLattice>> &Results, - ASTContext &ASTCtx) {}, - {BuiltinOptions()}), + checkDataflowWithNoopAnalysis(Code), llvm::FailedWithMessage("Cannot analyze templated declarations")); } @@ -2683,11 +2679,7 @@ }; )"; ASSERT_THAT_ERROR( - checkDataflowWithNoopAnalysis( - Code, - [](const llvm::StringMap<DataflowAnalysisState<NoopLattice>> &Results, - ASTContext &ASTCtx) {}, - {BuiltinOptions()}), + checkDataflowWithNoopAnalysis(Code), llvm::FailedWithMessage("Cannot analyze templated declarations")); } @@ -3836,6 +3828,52 @@ }); } +TEST(TransferTest, LoopDereferencingChangingPointerConverges) { + std::string Code = R"cc( + bool some_condition(); + + void target(int i1, int i2) { + int *p = &i1; + while (true) { + (void)*p; + if (some_condition()) + p = &i1; + else + p = &i2; + } + } + )cc"; + // FIXME: Implement pointer value widening to make analysis converge. + ASSERT_THAT_ERROR( + checkDataflowWithNoopAnalysis(Code), + llvm::FailedWithMessage("maximum number of iterations reached")); +} + +TEST(TransferTest, LoopDereferencingChangingRecordPointerConverges) { + std::string Code = R"cc( + struct Lookup { + int x; + }; + + bool some_condition(); + + void target(Lookup l1, Lookup l2) { + Lookup *l = &l1; + while (true) { + (void)l->x; + if (some_condition()) + l = &l1; + else + l = &l2; + } + } + )cc"; + // FIXME: Implement pointer value widening to make analysis converge. + ASSERT_THAT_ERROR( + checkDataflowWithNoopAnalysis(Code), + llvm::FailedWithMessage("maximum number of iterations reached")); +} + TEST(TransferTest, DoesNotCrashOnUnionThisExpr) { std::string Code = R"( union Union { Index: clang/unittests/Analysis/FlowSensitive/TestingSupport.h =================================================================== --- clang/unittests/Analysis/FlowSensitive/TestingSupport.h +++ clang/unittests/Analysis/FlowSensitive/TestingSupport.h @@ -402,8 +402,8 @@ std::function< void(const llvm::StringMap<DataflowAnalysisState<NoopLattice>> &, ASTContext &)> - VerifyResults, - DataflowAnalysisOptions Options, + VerifyResults = [](const auto &, auto &) {}, + DataflowAnalysisOptions Options = {BuiltinOptions()}, LangStandard::Kind Std = LangStandard::lang_cxx17, llvm::StringRef TargetFun = "target");
Index: clang/unittests/Analysis/FlowSensitive/TransferTest.cpp =================================================================== --- clang/unittests/Analysis/FlowSensitive/TransferTest.cpp +++ clang/unittests/Analysis/FlowSensitive/TransferTest.cpp @@ -2667,11 +2667,7 @@ void target() {} )"; ASSERT_THAT_ERROR( - checkDataflowWithNoopAnalysis( - Code, - [](const llvm::StringMap<DataflowAnalysisState<NoopLattice>> &Results, - ASTContext &ASTCtx) {}, - {BuiltinOptions()}), + checkDataflowWithNoopAnalysis(Code), llvm::FailedWithMessage("Cannot analyze templated declarations")); } @@ -2683,11 +2679,7 @@ }; )"; ASSERT_THAT_ERROR( - checkDataflowWithNoopAnalysis( - Code, - [](const llvm::StringMap<DataflowAnalysisState<NoopLattice>> &Results, - ASTContext &ASTCtx) {}, - {BuiltinOptions()}), + checkDataflowWithNoopAnalysis(Code), llvm::FailedWithMessage("Cannot analyze templated declarations")); } @@ -3836,6 +3828,52 @@ }); } +TEST(TransferTest, LoopDereferencingChangingPointerConverges) { + std::string Code = R"cc( + bool some_condition(); + + void target(int i1, int i2) { + int *p = &i1; + while (true) { + (void)*p; + if (some_condition()) + p = &i1; + else + p = &i2; + } + } + )cc"; + // FIXME: Implement pointer value widening to make analysis converge. + ASSERT_THAT_ERROR( + checkDataflowWithNoopAnalysis(Code), + llvm::FailedWithMessage("maximum number of iterations reached")); +} + +TEST(TransferTest, LoopDereferencingChangingRecordPointerConverges) { + std::string Code = R"cc( + struct Lookup { + int x; + }; + + bool some_condition(); + + void target(Lookup l1, Lookup l2) { + Lookup *l = &l1; + while (true) { + (void)l->x; + if (some_condition()) + l = &l1; + else + l = &l2; + } + } + )cc"; + // FIXME: Implement pointer value widening to make analysis converge. + ASSERT_THAT_ERROR( + checkDataflowWithNoopAnalysis(Code), + llvm::FailedWithMessage("maximum number of iterations reached")); +} + TEST(TransferTest, DoesNotCrashOnUnionThisExpr) { std::string Code = R"( union Union { Index: clang/unittests/Analysis/FlowSensitive/TestingSupport.h =================================================================== --- clang/unittests/Analysis/FlowSensitive/TestingSupport.h +++ clang/unittests/Analysis/FlowSensitive/TestingSupport.h @@ -402,8 +402,8 @@ std::function< void(const llvm::StringMap<DataflowAnalysisState<NoopLattice>> &, ASTContext &)> - VerifyResults, - DataflowAnalysisOptions Options, + VerifyResults = [](const auto &, auto &) {}, + DataflowAnalysisOptions Options = {BuiltinOptions()}, LangStandard::Kind Std = LangStandard::lang_cxx17, llvm::StringRef TargetFun = "target");
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits