r336590 - [libclang] evalute compound statement cursors before trying to evaluate

Evgenii Stepanov via cfe-commits cfe-commits at lists.llvm.org
Tue Jul 10 12:53:17 PDT 2018


Reverting...

On Mon, Jul 9, 2018 at 8:18 PM, Vlad Tsyrklevich <vlad at tsyrklevich.net> wrote:
> 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


More information about the cfe-commits mailing list