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