r206644 - Don't read CompilerInstance fields that don't exist in ASTUnit

Evgeniy Stepanov eugeni.stepanov at gmail.com
Tue Apr 22 00:13:27 PDT 2014


Hi,

This is crashing on ASan bootstrap bot with what looks like NULL dereference.

http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap/builds/3112/steps/check-clang%20asan/logs/stdio

Crashing test: Clang :: Index/pch-with-errors.c

$ ASAN_SYMBOLIZER_PATH=../llvm_build0/bin/llvm-symbolizer
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm_build_asan/./bin/c-index-test
-write-pch /home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm_build_asan/tools/clang/test/Index/Output/pch-with-errors.c.tmp.pch
foobar.c
ASAN:SIGSEGV
=================================================================
==12621==ERROR: AddressSanitizer: SEGV on unknown address
0x0000000006b0 (pc 0x7f7c8294870d sp 0x7f7c7e817980 bp 0x7f7c7e817ad0
T2)
    #0 0x7f7c8294870c in CXDiagnosticSetImpl
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndexDiagnostic.h:31
    #1 0x7f7c8294870c in CXDiagnosticImpl
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndexDiagnostic.h:100
    #2 0x7f7c8294870c in getASTContext
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndexDiagnostic.h:119
    #3 0x7f7c8294870c in
clang::cxindex::printDiagsToStderr(clang::ASTUnit*)
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:6719
    #4 0x7f7c82925b4b in clang_parseTranslationUnit_Impl(void*)
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:2795
    #5 0x7f7c841a170b in llvm::CrashRecoveryContext::RunSafely(void
(*)(void*), void*)
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/lib/Support/CrashRecoveryContext.cpp:316
    #6 0x7f7c841a1ac0 in RunSafelyOnThread_Dispatch(void*)
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/lib/Support/CrashRecoveryContext.cpp:347
    #7 0x7f7c84239d4f in ExecuteOnThread_Dispatch(void*)
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/lib/Support/Threading.cpp:75
    #8 0x7f7c81c27181 in start_thread
(/lib/x86_64-linux-gnu/libpthread.so.0+0x8181)
    #9 0x7f7c81131b5c in clone (/lib/x86_64-linux-gnu/libc.so.6+0xfab5c)

AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndexDiagnostic.h:31
CXDiagnosticSetImpl
Thread T2 created by T1 here:
    #0 0x42a2fe in __interceptor_pthread_create
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/projects/compiler-rt/lib/asan/asan_interceptors.cc:176
    #1 0x7f7c84239c6c in llvm::llvm_execute_on_thread(void (*)(void*),
void*, unsigned int)
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/lib/Support/Threading.cpp:96
    #2 0x7f7c841a1985 in
llvm::CrashRecoveryContext::RunSafelyOnThread(void (*)(void*), void*,
unsigned int) /home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/lib/Support/CrashRecoveryContext.cpp:352
    #3 0x7f7c82923d55 in RunSafely
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:6688
    #4 0x7f7c82923d55 in clang_parseTranslationUnit2
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/libclang/CIndex.cpp:2845
    #5 0x4b45b3 in write_pch_file
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/c-index-test/c-index-test.c:3685
    #6 0x4b6fd4 in cindextest_main
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/c-index-test/c-index-test.c:4052
    #7 0x4b9f57 in thread_runner
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/c-index-test/c-index-test.c:4075
    #8 0x7f7c84239d4f in ExecuteOnThread_Dispatch(void*)
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/lib/Support/Threading.cpp:75
    #9 0x7f7c81c27181 in start_thread
(/lib/x86_64-linux-gnu/libpthread.so.0+0x8181)

Thread T1 created by T0 here:
    #0 0x42a2fe in __interceptor_pthread_create
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/projects/compiler-rt/lib/asan/asan_interceptors.cc:176
    #1 0x7f7c84239c6c in llvm::llvm_execute_on_thread(void (*)(void*),
void*, unsigned int)
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/lib/Support/Threading.cpp:96
    #2 0x4ba0a0 in main
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/c-index-test/c-index-test.c:4093
    #3 0x7f7c81058ed4 in __libc_start_main
(/lib/x86_64-linux-gnu/libc.so.6+0x21ed4)

On Sat, Apr 19, 2014 at 12:39 AM, Ben Langmuir <blangmuir at apple.com> wrote:
> Author: benlangmuir
> Date: Fri Apr 18 15:39:48 2014
> New Revision: 206644
>
> URL: http://llvm.org/viewvc/llvm-project?rev=206644&view=rev
> Log:
> Don't read CompilerInstance fields that don't exist in ASTUnit
>
> When transferring data from a CompilerInstance in an error path we need
> to consider cases where the various fields are uninitialized.
>
> Modified:
>     cfe/trunk/lib/Frontend/ASTUnit.cpp
>
> Modified: cfe/trunk/lib/Frontend/ASTUnit.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/ASTUnit.cpp?rev=206644&r1=206643&r2=206644&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/ASTUnit.cpp (original)
> +++ cfe/trunk/lib/Frontend/ASTUnit.cpp Fri Apr 18 15:39:48 2014
> @@ -1717,11 +1717,14 @@ void ASTUnit::transferASTDataFromCompile
>    // Steal the created target, context, and preprocessor.
>    TheSema.reset(CI.takeSema());
>    Consumer.reset(CI.takeASTConsumer());
> -  Ctx = &CI.getASTContext();
> -  PP = &CI.getPreprocessor();
> +  if (CI.hasASTContext())
> +    Ctx = &CI.getASTContext();
> +  if (CI.hasPreprocessor())
> +    PP = &CI.getPreprocessor();
>    CI.setSourceManager(0);
>    CI.setFileManager(0);
> -  Target = &CI.getTarget();
> +  if (CI.hasTarget())
> +    Target = &CI.getTarget();
>    Reader = CI.getModuleManager();
>    HadModuleLoaderFatalFailure = CI.hadModuleLoaderFatalFailure();
>  }
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list