r336590 - [libclang] evalute compound statement cursors before trying to evaluate
Vlad Tsyrklevich via cfe-commits
cfe-commits at lists.llvm.org
Mon Jul 9 20:18:33 PDT 2018
The ASan bot is failing with a LeakSanitizer failure that appears related
to one of your libclang changes:
http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap/builds/6282/steps/check-clang%20asan/logs/stdio
Direct leak of 24 byte(s) in 1 object(s) allocated from:
#0 0x52c638 in operator new(unsigned long)
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/projects/compiler-rt/lib/asan/asan_new_delete.cc:106
#1 0x7fd236783b89 in make_unique<ExprEvalResult>
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/include/llvm/ADT/STLExtras.h:1057:29
#2 0x7fd236783b89 in evaluateExpr
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:3755
#3 0x7fd236783b89 in clang_Cursor_Evaluate
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:3917
#4 0x54e743 in operator()
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/unittests/libclang/LibclangTest.cpp:487:39
#5 0x54e743 in
LibclangParseTest_EvaluateChildExpression_Test::TestBody()::$_0::operator()(CXCursor,
CXCursor, void*) const::'lambda'(CXCursor, CXCursor,
void*)::__invoke(CXCursor, CXCursor, void*)
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/unittests/libclang/LibclangTest.cpp:482
#6 0x7fd23677de00 in
clang::cxcursor::CursorVisitor::RunVisitorWorkList(llvm::SmallVector<clang::cxcursor::VisitorJob,
10u>&) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:3019:17
#7 0x7fd23675c3a8 in
clang::cxcursor::CursorVisitor::Visit(clang::Stmt const*)
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:3164:17
#8 0x7fd236755d2f in
clang::cxcursor::CursorVisitor::VisitChildren(CXCursor)
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp
#9 0x7fd236754e5d in
clang::cxcursor::CursorVisitor::Visit(CXCursor, bool)
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:225:16
#10 0x7fd23676487c in
clang::cxcursor::CursorVisitor::VisitFunctionDecl(clang::FunctionDecl*)
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:889:9
#11 0x7fd236759e24 in
clang::declvisitor::Base<clang::declvisitor::make_ptr,
clang::cxcursor::CursorVisitor, bool>::Visit(clang::Decl*)
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/include/clang/AST/DeclVisitor.h
#12 0x7fd236755c17 in
clang::cxcursor::CursorVisitor::VisitChildren(CXCursor)
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:506:34
#13 0x7fd23678a558 in clang_visitChildren
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:4352:20
#14 0x54e024 in operator()
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/unittests/libclang/LibclangTest.cpp:480:11
#15 0x54e024 in
LibclangParseTest_EvaluateChildExpression_Test::TestBody()::$_0::__invoke(CXCursor,
CXCursor, void*)
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/unittests/libclang/LibclangTest.cpp:476
#16 0x7fd236754d49 in
clang::cxcursor::CursorVisitor::Visit(CXCursor, bool)
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:217:11
#17 0x7fd23675cb87 in
clang::cxcursor::CursorVisitor::handleDeclForVisitation(clang::Decl
const*) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:674:7
#18 0x7fd23675cefe in
clang::cxcursor::CursorVisitor::VisitDeclContext(clang::DeclContext*)
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:635:30
#19 0x7fd236756399 in
clang::cxcursor::CursorVisitor::VisitChildren(CXCursor)
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:540:20
#20 0x7fd23678a558 in clang_visitChildren
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:4352:20
#21 0x537fa1 in
LibclangParseTest_EvaluateChildExpression_Test::TestBody()
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/unittests/libclang/LibclangTest.cpp:474:3
#22 0x5cae31 in testing::Test::Run()
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/utils/unittest/googletest/src/gtest.cc
#23 0x5cd068 in testing::TestInfo::Run()
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/utils/unittest/googletest/src/gtest.cc:2656:11
#24 0x5ce430 in testing::TestCase::Run()
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/utils/unittest/googletest/src/gtest.cc:2774:28
#25 0x5ec1d4 in testing::internal::UnitTestImpl::RunAllTests()
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/utils/unittest/googletest/src/gtest.cc:4649:43
#26 0x5eb380 in testing::UnitTest::Run()
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/utils/unittest/googletest/src/gtest.cc
#27 0x5b3983 in RUN_ALL_TESTS
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/utils/unittest/googletest/include/gtest/gtest.h:2233:46
#28 0x5b3983 in main
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/utils/unittest/UnitTestMain/TestMain.cpp:51
#29 0x7fd232efd2e0 in __libc_start_main
(/lib/x86_64-linux-gnu/libc.so.6+0x202e0)
Indirect leak of 4 byte(s) in 1 object(s) allocated from:
#0 0x52c808 in operator new[](unsigned long)
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/projects/compiler-rt/lib/asan/asan_new_delete.cc:109
#1 0x7fd2367844dd in evaluateExpr
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:3825:34
#2 0x7fd2367844dd in clang_Cursor_Evaluate
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:3917
#3 0x54e743 in operator()
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/unittests/libclang/LibclangTest.cpp:487:39
#4 0x54e743 in
LibclangParseTest_EvaluateChildExpression_Test::TestBody()::$_0::operator()(CXCursor,
CXCursor, void*) const::'lambda'(CXCursor, CXCursor,
void*)::__invoke(CXCursor, CXCursor, void*)
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/unittests/libclang/LibclangTest.cpp:482
#5 0x7fd23677de00 in
clang::cxcursor::CursorVisitor::RunVisitorWorkList(llvm::SmallVector<clang::cxcursor::VisitorJob,
10u>&) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:3019:17
#6 0x7fd23675c3a8 in
clang::cxcursor::CursorVisitor::Visit(clang::Stmt const*)
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:3164:17
#7 0x7fd236755d2f in
clang::cxcursor::CursorVisitor::VisitChildren(CXCursor)
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp
#8 0x7fd236754e5d in
clang::cxcursor::CursorVisitor::Visit(CXCursor, bool)
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:225:16
#9 0x7fd23676487c in
clang::cxcursor::CursorVisitor::VisitFunctionDecl(clang::FunctionDecl*)
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:889:9
#10 0x7fd236759e24 in
clang::declvisitor::Base<clang::declvisitor::make_ptr,
clang::cxcursor::CursorVisitor, bool>::Visit(clang::Decl*)
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/include/clang/AST/DeclVisitor.h
#11 0x7fd236755c17 in
clang::cxcursor::CursorVisitor::VisitChildren(CXCursor)
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:506:34
#12 0x7fd23678a558 in clang_visitChildren
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:4352:20
#13 0x54e024 in operator()
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/unittests/libclang/LibclangTest.cpp:480:11
#14 0x54e024 in
LibclangParseTest_EvaluateChildExpression_Test::TestBody()::$_0::__invoke(CXCursor,
CXCursor, void*)
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/unittests/libclang/LibclangTest.cpp:476
#15 0x7fd236754d49 in
clang::cxcursor::CursorVisitor::Visit(CXCursor, bool)
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:217:11
#16 0x7fd23675cb87 in
clang::cxcursor::CursorVisitor::handleDeclForVisitation(clang::Decl
const*) /b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:674:7
#17 0x7fd23675cefe in
clang::cxcursor::CursorVisitor::VisitDeclContext(clang::DeclContext*)
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:635:30
#18 0x7fd236756399 in
clang::cxcursor::CursorVisitor::VisitChildren(CXCursor)
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:540:20
#19 0x7fd23678a558 in clang_visitChildren
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:4352:20
#20 0x537fa1 in
LibclangParseTest_EvaluateChildExpression_Test::TestBody()
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/unittests/libclang/LibclangTest.cpp:474:3
#21 0x5cae31 in testing::Test::Run()
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/utils/unittest/googletest/src/gtest.cc
#22 0x5cd068 in testing::TestInfo::Run()
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/utils/unittest/googletest/src/gtest.cc:2656:11
#23 0x5ce430 in testing::TestCase::Run()
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/utils/unittest/googletest/src/gtest.cc:2774:28
#24 0x5ec1d4 in testing::internal::UnitTestImpl::RunAllTests()
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/utils/unittest/googletest/src/gtest.cc:4649:43
#25 0x5eb380 in testing::UnitTest::Run()
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/utils/unittest/googletest/src/gtest.cc
#26 0x5b3983 in RUN_ALL_TESTS
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/utils/unittest/googletest/include/gtest/gtest.h:2233:46
#27 0x5b3983 in main
/b/sanitizer-x86_64-linux-bootstrap/build/llvm/utils/unittest/UnitTestMain/TestMain.cpp:51
#28 0x7fd232efd2e0 in __libc_start_main
(/lib/x86_64-linux-gnu/libc.so.6+0x202e0)
On Mon, Jul 9, 2018 at 12:46 PM Alex Lorenz via cfe-commits <
cfe-commits at lists.llvm.org> wrote:
> Author: arphaman
> Date: Mon Jul 9 12:41:28 2018
> New Revision: 336590
>
> URL: http://llvm.org/viewvc/llvm-project?rev=336590&view=rev
> Log:
> [libclang] evalute compound statement cursors before trying to evaluate
> the cursor like a declaration
>
> This change fixes a bug in libclang in which it tries to evaluate a
> statement
> cursor as a declaration cursor, because that statement still has a pointer
> to
> the declaration parent.
>
> rdar://38888477
>
> Differential Revision: https://reviews.llvm.org/D49051
>
> Modified:
> cfe/trunk/tools/libclang/CIndex.cpp
> cfe/trunk/unittests/libclang/LibclangTest.cpp
>
> Modified: cfe/trunk/tools/libclang/CIndex.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=336590&r1=336589&r2=336590&view=diff
>
> ==============================================================================
> --- cfe/trunk/tools/libclang/CIndex.cpp (original)
> +++ cfe/trunk/tools/libclang/CIndex.cpp Mon Jul 9 12:41:28 2018
> @@ -3890,6 +3890,19 @@ static const ExprEvalResult* evaluateExp
> }
>
> CXEvalResult clang_Cursor_Evaluate(CXCursor C) {
> + if (clang_getCursorKind(C) == CXCursor_CompoundStmt) {
> + const CompoundStmt *compoundStmt =
> cast<CompoundStmt>(getCursorStmt(C));
> + Expr *expr = nullptr;
> + for (auto *bodyIterator : compoundStmt->body()) {
> + if ((expr = dyn_cast<Expr>(bodyIterator))) {
> + break;
> + }
> + }
> + if (expr)
> + return const_cast<CXEvalResult>(
> + reinterpret_cast<const void *>(evaluateExpr(expr, C)));
> + }
> +
> const Decl *D = getCursorDecl(C);
> if (D) {
> const Expr *expr = nullptr;
> @@ -3903,19 +3916,6 @@ CXEvalResult clang_Cursor_Evaluate(CXCur
> evaluateExpr(const_cast<Expr *>(expr), C)));
> return nullptr;
> }
> -
> - const CompoundStmt *compoundStmt =
> dyn_cast_or_null<CompoundStmt>(getCursorStmt(C));
> - if (compoundStmt) {
> - Expr *expr = nullptr;
> - for (auto *bodyIterator : compoundStmt->body()) {
> - if ((expr = dyn_cast<Expr>(bodyIterator))) {
> - break;
> - }
> - }
> - if (expr)
> - return const_cast<CXEvalResult>(
> - reinterpret_cast<const void *>(evaluateExpr(expr, C)));
> - }
> return nullptr;
> }
>
>
> Modified: cfe/trunk/unittests/libclang/LibclangTest.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/libclang/LibclangTest.cpp?rev=336590&r1=336589&r2=336590&view=diff
>
> ==============================================================================
> --- cfe/trunk/unittests/libclang/LibclangTest.cpp (original)
> +++ cfe/trunk/unittests/libclang/LibclangTest.cpp Mon Jul 9 12:41:28 2018
> @@ -461,6 +461,47 @@ TEST_F(LibclangParseTest, AllSkippedRang
> clang_disposeSourceRangeList(Ranges);
> }
>
> +TEST_F(LibclangParseTest, EvaluateChildExpression) {
> + std::string Main = "main.m";
> + WriteFile(Main, "#define kFOO @\"foo\"\n"
> + "void foobar(void) {\n"
> + " {kFOO;}\n"
> + "}\n");
> + ClangTU = clang_parseTranslationUnit(Index, Main.c_str(), nullptr, 0,
> nullptr,
> + 0, TUFlags);
> +
> + CXCursor C = clang_getTranslationUnitCursor(ClangTU);
> + clang_visitChildren(
> + C,
> + [](CXCursor cursor, CXCursor parent,
> + CXClientData client_data) -> CXChildVisitResult {
> + if (clang_getCursorKind(cursor) == CXCursor_FunctionDecl) {
> + int numberedStmt = 0;
> + clang_visitChildren(
> + cursor,
> + [](CXCursor cursor, CXCursor parent,
> + CXClientData client_data) -> CXChildVisitResult {
> + int &numberedStmt = *((int *)client_data);
> + if (clang_getCursorKind(cursor) == CXCursor_CompoundStmt)
> {
> + if (numberedStmt) {
> + CXEvalResult RE = clang_Cursor_Evaluate(cursor);
> + EXPECT_NE(RE, nullptr);
> + EXPECT_EQ(clang_EvalResult_getKind(RE),
> + CXEval_ObjCStrLiteral);
> + return CXChildVisit_Break;
> + }
> + numberedStmt++;
> + }
> + return CXChildVisit_Recurse;
> + },
> + &numberedStmt);
> + EXPECT_EQ(numberedStmt, 1);
> + }
> + return CXChildVisit_Continue;
> + },
> + nullptr);
> +}
> +
> class LibclangReparseTest : public LibclangParseTest {
> public:
> void DisplayDiagnostics() {
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180709/c7b070a8/attachment-0001.html>
More information about the cfe-commits
mailing list