Re: [PATCH] D21895: CFGBuilder: Fix crash when visiting a range-based for over a dependent type
This revision was automatically updated to reflect the committed changes. Closed by commit rL274834: CFGBuilder: Fix crash when visiting a range-based for over a dependent type (authored by alexfh). Changed prior to commit: http://reviews.llvm.org/D21895?vs=62374&id=63194#toc Repository: rL LLVM http://reviews.llvm.org/D21895 Files: cfe/trunk/lib/Analysis/CFG.cpp cfe/trunk/unittests/Analysis/CFGTest.cpp cfe/trunk/unittests/Analysis/CMakeLists.txt cfe/trunk/unittests/CMakeLists.txt Index: cfe/trunk/lib/Analysis/CFG.cpp === --- cfe/trunk/lib/Analysis/CFG.cpp +++ cfe/trunk/lib/Analysis/CFG.cpp @@ -3457,6 +3457,8 @@ // continue statements. Block = nullptr; Succ = addStmt(S->getInc()); +if (badCFG) + return nullptr; ContinueJumpTarget = JumpTarget(Succ, ContinueScopePos); // The starting block for the loop increment is the block that should Index: cfe/trunk/unittests/Analysis/CFGTest.cpp === --- cfe/trunk/unittests/Analysis/CFGTest.cpp +++ cfe/trunk/unittests/Analysis/CFGTest.cpp @@ -0,0 +1,58 @@ +//===- unittests/Analysis/CFGTest.cpp - CFG tests -===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===--===// + +#include "clang/ASTMatchers/ASTMatchFinder.h" +#include "clang/Analysis/CFG.h" +#include "clang/Tooling/Tooling.h" +#include "gtest/gtest.h" +#include +#include + +namespace clang { +namespace analysis { +namespace { + +// Constructing a CFG for a range-based for over a dependent type fails (but +// should not crash). +TEST(CFG, RangeBasedForOverDependentType) { + const char *Code = "class Foo;\n" + "template \n" + "void f(const T &Range) {\n" + " for (const Foo *TheFoo : Range) {\n" + " }\n" + "}\n"; + + class CFGCallback : public ast_matchers::MatchFinder::MatchCallback { + public: +bool SawFunctionBody = false; + +void run(const ast_matchers::MatchFinder::MatchResult &Result) override { + const auto *Func = Result.Nodes.getNodeAs("func"); + Stmt *Body = Func->getBody(); + if (!Body) +return; + SawFunctionBody = true; + std::unique_ptr cfg = + CFG::buildCFG(nullptr, Body, Result.Context, CFG::BuildOptions()); + EXPECT_EQ(nullptr, cfg); +} + } Callback; + + ast_matchers::MatchFinder Finder; + Finder.addMatcher(ast_matchers::functionDecl().bind("func"), &Callback); + std::unique_ptr Factory( + tooling::newFrontendActionFactory(&Finder)); + std::vector Args = {"-std=c++11"}; + ASSERT_TRUE(tooling::runToolOnCodeWithArgs(Factory->create(), Code, Args)); + EXPECT_TRUE(Callback.SawFunctionBody); +} + +} // namespace +} // namespace analysis +} // namespace clang Index: cfe/trunk/unittests/Analysis/CMakeLists.txt === --- cfe/trunk/unittests/Analysis/CMakeLists.txt +++ cfe/trunk/unittests/Analysis/CMakeLists.txt @@ -0,0 +1,13 @@ +set(LLVM_LINK_COMPONENTS + Support + ) + +add_clang_unittest(CFGTests + CFGTest.cpp + ) + +target_link_libraries(CFGTests + clangAnalysis + clangASTMatchers + clangTooling + ) Index: cfe/trunk/unittests/CMakeLists.txt === --- cfe/trunk/unittests/CMakeLists.txt +++ cfe/trunk/unittests/CMakeLists.txt @@ -13,6 +13,7 @@ add_subdirectory(Lex) add_subdirectory(Driver) if(CLANG_ENABLE_STATIC_ANALYZER) + add_subdirectory(Analysis) add_subdirectory(StaticAnalyzer) add_subdirectory(Frontend) endif() ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D21895: CFGBuilder: Fix crash when visiting a range-based for over a dependent type
klimek accepted this revision. klimek added a comment. This revision is now accepted and ready to land. lg http://reviews.llvm.org/D21895 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D21895: CFGBuilder: Fix crash when visiting a range-based for over a dependent type
mboehme marked an inline comment as done. mboehme added a comment. http://reviews.llvm.org/D21895 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D21895: CFGBuilder: Fix crash when visiting a range-based for over a dependent type
mboehme updated this revision to Diff 62374. http://reviews.llvm.org/D21895 Files: lib/Analysis/CFG.cpp unittests/Analysis/CFGTest.cpp unittests/Analysis/CMakeLists.txt unittests/CMakeLists.txt Index: unittests/CMakeLists.txt === --- unittests/CMakeLists.txt +++ unittests/CMakeLists.txt @@ -13,6 +13,7 @@ add_subdirectory(Lex) add_subdirectory(Driver) if(CLANG_ENABLE_STATIC_ANALYZER) + add_subdirectory(Analysis) add_subdirectory(StaticAnalyzer) add_subdirectory(Frontend) endif() Index: unittests/Analysis/CMakeLists.txt === --- /dev/null +++ unittests/Analysis/CMakeLists.txt @@ -0,0 +1,13 @@ +set(LLVM_LINK_COMPONENTS + Support + ) + +add_clang_unittest(CFGTests + CFGTest.cpp + ) + +target_link_libraries(CFGTests + clangAnalysis + clangASTMatchers + clangTooling + ) Index: unittests/Analysis/CFGTest.cpp === --- /dev/null +++ unittests/Analysis/CFGTest.cpp @@ -0,0 +1,58 @@ +//===- unittests/Analysis/CFGTest.cpp - CFG tests -===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===--===// + +#include "clang/ASTMatchers/ASTMatchFinder.h" +#include "clang/Analysis/CFG.h" +#include "clang/Tooling/Tooling.h" +#include "gtest/gtest.h" +#include +#include + +namespace clang { +namespace analysis { +namespace { + +// Constructing a CFG for a range-based for over a dependent type fails (but +// should not crash). +TEST(CFG, RangeBasedForOverDependentType) { + const char *Code = "class Foo;\n" + "template \n" + "void f(const T &Range) {\n" + " for (const Foo *TheFoo : Range) {\n" + " }\n" + "}\n"; + + class CFGCallback : public ast_matchers::MatchFinder::MatchCallback { + public: +bool SawFunctionBody = false; + +void run(const ast_matchers::MatchFinder::MatchResult &Result) override { + const auto *Func = Result.Nodes.getNodeAs("func"); + Stmt *Body = Func->getBody(); + if (!Body) +return; + SawFunctionBody = true; + std::unique_ptr cfg = + CFG::buildCFG(nullptr, Body, Result.Context, CFG::BuildOptions()); + EXPECT_EQ(nullptr, cfg); +} + } Callback; + + ast_matchers::MatchFinder Finder; + Finder.addMatcher(ast_matchers::functionDecl().bind("func"), &Callback); + std::unique_ptr Factory( + tooling::newFrontendActionFactory(&Finder)); + std::vector Args = {"-std=c++11"}; + ASSERT_TRUE(tooling::runToolOnCodeWithArgs(Factory->create(), Code, Args)); + EXPECT_TRUE(Callback.SawFunctionBody); +} + +} // namespace +} // namespace analysis +} // namespace clang Index: lib/Analysis/CFG.cpp === --- lib/Analysis/CFG.cpp +++ lib/Analysis/CFG.cpp @@ -3457,6 +3457,8 @@ // continue statements. Block = nullptr; Succ = addStmt(S->getInc()); +if (badCFG) + return nullptr; ContinueJumpTarget = JumpTarget(Succ, ContinueScopePos); // The starting block for the loop increment is the block that should ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D21895: CFGBuilder: Fix crash when visiting a range-based for over a dependent type
klimek added inline comments. Comment at: unittests/Analysis/CFGTest.cpp:49 @@ +48,3 @@ + std::vector Args = {"-std=c++11"}; + ASSERT_TRUE(tooling::runToolOnCodeWithArgs(Factory->create(), Code, Args)); +} I think we want to assert that we at least found func once with a body. http://reviews.llvm.org/D21895 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D21895: CFGBuilder: Fix crash when visiting a range-based for over a dependent type
mboehme created this revision. mboehme added a reviewer: klimek. mboehme added a subscriber: cfe-commits. CFG generation is expected to fail in this case, but it should not crash. Also added a test that reproduces the crash. http://reviews.llvm.org/D21895 Files: lib/Analysis/CFG.cpp unittests/Analysis/CFGTest.cpp unittests/Analysis/CMakeLists.txt unittests/CMakeLists.txt Index: unittests/CMakeLists.txt === --- unittests/CMakeLists.txt +++ unittests/CMakeLists.txt @@ -13,6 +13,7 @@ add_subdirectory(Lex) add_subdirectory(Driver) if(CLANG_ENABLE_STATIC_ANALYZER) + add_subdirectory(Analysis) add_subdirectory(StaticAnalyzer) add_subdirectory(Frontend) endif() Index: unittests/Analysis/CMakeLists.txt === --- /dev/null +++ unittests/Analysis/CMakeLists.txt @@ -0,0 +1,13 @@ +set(LLVM_LINK_COMPONENTS + Support + ) + +add_clang_unittest(CFGTests + CFGTest.cpp + ) + +target_link_libraries(CFGTests + clangAnalysis + clangASTMatchers + clangTooling + ) Index: unittests/Analysis/CFGTest.cpp === --- /dev/null +++ unittests/Analysis/CFGTest.cpp @@ -0,0 +1,54 @@ +//===- unittests/Analysis/CFGTest.cpp - CFG tests -===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===--===// + +#include "clang/ASTMatchers/ASTMatchFinder.h" +#include "clang/Analysis/CFG.h" +#include "clang/Tooling/Tooling.h" +#include "gtest/gtest.h" +#include +#include + +namespace clang { +namespace analysis { +namespace { + +// Constructing a CFG for a range-based for over a dependent type fails (but +// should not crash). +TEST(CFG, RangeBasedForOverDependentType) { + const char *Code = "class Foo;\n" + "template \n" + "void f(const T &Range) {\n" + " for (const Foo *TheFoo : Range) {\n" + " }\n" + "}\n"; + + class CFGCallback : public ast_matchers::MatchFinder::MatchCallback { + public: +void run(const ast_matchers::MatchFinder::MatchResult &Result) override { + const auto *Func = Result.Nodes.getNodeAs("func"); + Stmt *Body = Func->getBody(); + if (!Body) +return; + std::unique_ptr cfg = + CFG::buildCFG(nullptr, Body, Result.Context, CFG::BuildOptions()); + EXPECT_EQ(nullptr, cfg); +} + } Callback; + + ast_matchers::MatchFinder Finder; + Finder.addMatcher(ast_matchers::functionDecl().bind("func"), &Callback); + std::unique_ptr Factory( + tooling::newFrontendActionFactory(&Finder)); + std::vector Args = {"-std=c++11"}; + ASSERT_TRUE(tooling::runToolOnCodeWithArgs(Factory->create(), Code, Args)); +} + +} // namespace +} // namespace analysis +} // namespace clang Index: lib/Analysis/CFG.cpp === --- lib/Analysis/CFG.cpp +++ lib/Analysis/CFG.cpp @@ -3457,6 +3457,8 @@ // continue statements. Block = nullptr; Succ = addStmt(S->getInc()); +if (badCFG) + return nullptr; ContinueJumpTarget = JumpTarget(Succ, ContinueScopePos); // The starting block for the loop increment is the block that should ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits