New issue
Advanced search Search tips

Issue 875627 link

Starred by 2 users

Issue metadata

Status: Fixed
Owner: ----
Closed: Sep 7
Cc:
Components:
EstimatedDays: ----
NextAction: ----
OS: ----
Pri: 3
Type: Bug

Blocked on:
issue 871418



Sign in to add a comment

infinite loop (?) in clang when building services/network/socket_factory.cc with local change that adds variable initialized to itself

Project Member Reported by thakis@chromium.org, Aug 19

Issue description

0. Run `time ninja -C out/gn ../../services/network/socket_factory.cc^` to make sure all prereqs of the file are built
1. Touch file, run `time ninja -C out/gn ../../services/network/socket_factory.cc^ -v`, note down compile command
2. Patch in https://chromium-review.googlesource.com/c/chromium/src/+/1180701
3. Run command from 1

Expected: Compiles

Actual: Compile doesn't finish


Note that the unmodified file takes ~20s to compile already, so have some patience.

If the more correct

  const net::SSLClientSocketContext& ssl_client_socket_context =
      ssl_client_socket_context_;

is used instead of the self-initialization 

  net::SSLClientSocketContext& ssl_client_socket_context =
      ssl_client_socket_context;

then things work better.


My args.gn (I'm not sure they matter much though):

is_debug = false
is_component_build = true
symbol_level = 1
dcheck_always_on = true
use_goma = true
 
Hitting ctrl-cl in lldb after a minute or so:

(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
  * frame #0: 0x0000000102a299b8 clang`clang::DeclContext::getRedeclContext() + 168
    frame #1: 0x000000010289491d clang`(anonymous namespace)::BuildLockset::checkAccess(clang::Expr const*, clang::threadSafety::AccessKind, clang::threadSafety::ProtectedOperationKind) + 205
    frame #2: 0x0000000102894576 clang`(anonymous namespace)::BuildLockset::VisitCallExpr(clang::CallExpr*) + 806
    frame #3: 0x0000000102886b2c clang`(anonymous namespace)::ThreadSafetyAnalyzer::runAnalysis(clang::AnalysisDeclContext&) + 14204
    frame #4: 0x0000000102883139 clang`clang::threadSafety::runThreadSafetyAnalysis(clang::AnalysisDeclContext&, clang::threadSafety::ThreadSafetyHandler&, clang::threadSafety::BeforeSet**) + 857
    frame #5: 0x00000001021a99a3 clang`clang::sema::AnalysisBasedWarnings::IssueWarnings(clang::sema::AnalysisBasedWarnings::Policy, clang::sema::FunctionScopeInfo*, clang::Decl const*, clang::BlockExpr const*) + 1843
    frame #6: 0x0000000102213ab6 clang`clang::Sema::PopFunctionScopeInfo(clang::sema::AnalysisBasedWarnings::Policy const*, clang::Decl const*, clang::BlockExpr const*) + 118
    frame #7: 0x000000010234c90f clang`clang::Sema::ActOnFinishFunctionBody(clang::Decl*, clang::Stmt*, bool) + 5183
    frame #8: 0x0000000101ffab36 clang`clang::Parser::ParseFunctionStatementBody(clang::Decl*, clang::Parser::ParseScope&) + 278
    frame #9: 0x00000001020138d6 clang`clang::Parser::ParseFunctionDefinition(clang::ParsingDeclarator&, clang::Parser::ParsedTemplateInfo const&, clang::Parser::LateParsedAttrList*) + 2230
    frame #10: 0x0000000101f7c5a6 clang`clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&, clang::DeclaratorContext, clang::SourceLocation*, clang::Parser::ForRangeInit*) + 1846
    frame #11: 0x0000000102012c54 clang`clang::Parser::ParseDeclOrFunctionDefInternal(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec&, clang::AccessSpecifier) + 676
    frame #12: 0x000000010201262e clang`clang::Parser::ParseDeclarationOrFunctionDefinition(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec*, clang::AccessSpecifier) + 414
    frame #13: 0x0000000102010a09 clang`clang::Parser::ParseExternalDeclaration(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec*) + 2777
    frame #14: 0x0000000101f912be clang`clang::Parser::ParseInnerNamespace(std::__1::vector<clang::SourceLocation, std::__1::allocator<clang::SourceLocation> >&, std::__1::vector<clang::IdentifierInfo*, std::__1::allocator<clang::IdentifierInfo*> >&, std::__1::vector<clang::SourceLocation, std::__1::allocator<clang::SourceLocation> >&, unsigned int, clang::SourceLocation&, clang::ParsedAttributes&, clang::BalancedDelimiterTracker&) + 206
    frame #15: 0x0000000101f90bde clang`clang::Parser::ParseNamespace(clang::DeclaratorContext, clang::SourceLocation&, clang::SourceLocation) + 5102
    frame #16: 0x0000000101f77956 clang`clang::Parser::ParseDeclaration(clang::DeclaratorContext, clang::SourceLocation&, clang::Parser::ParsedAttributesWithRange&) + 774
    frame #17: 0x00000001020100ee clang`clang::Parser::ParseExternalDeclaration(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec*) + 446
    frame #18: 0x000000010200f80b clang`clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&) + 603
    frame #19: 0x0000000101f690b5 clang`clang::ParseAST(clang::Sema&, bool, bool) + 469
    frame #20: 0x00000001015952bc clang`clang::FrontendAction::Execute() + 76
    frame #21: 0x000000010154c251 clang`clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) + 1249
    frame #22: 0x00000001015ec7a8 clang`clang::ExecuteCompilerInvocation(clang::CompilerInstance*) + 1736
    frame #23: 0x0000000100006a5c clang`cc1_main(llvm::ArrayRef<char const*>, char const*, void*) + 1324
    frame #24: 0x0000000100004ae9 clang`main + 10745
    frame #25: 0x00007fff930d5235 libdyld.dylib`start + 1
    frame #26: 0x00007fff930d5235 libdyld.dylib`start + 1

Cc: pwnall@chromium.org
Yup, looks like explicitly passing -Wno-thread-safety-analysis (which is where warn_double_lock is in, which makes DefaultPolicy.enableThreadSafetyAnalysis true, which causes threadSafety::runThreadSafetyAnalysis() to be called) makes the hang go away.

We added -Wthread-safety in  issue 805814 . From what I understand, the thread safety annotations can't really be used yet (don't remember details, but I think I read it on some list), so maybe we should disable the warning until it's reliable?
(fwiw, clang prints this diag before hanging:

../../services/network/socket_factory.cc:115:7: error: reference 'ssl_client_socket_context' is not yet bound to a value when used within its own initialization [-Werror,-Wuninitialized]
      ssl_client_socket_context;
      ^~~~~~~~~~~~~~~~~~~~~~~~~
)
Standalone repro. Unzip and run:

 time ~/src/llvm-build-goma/bin/clang -arch x86_64 -Wthread-safety -std=c++14  -c foo.ii  
foo.zip
815 KB Download
Reduced repro:

$ cat foo.ii
struct S {};

void g(const S& ssl_client_socket_context);

void f() {
  S& s = s;
  g(s);
}

Even smaller:

$ cat foo.ii
void g(int);

void f() {
  int& s = s;
  g(s);
}

Blockedon: 871418
Status: Fixed (was: Untriaged)
Fixed in upstream r340636, and rolled in in the clang roll in  issue 871418 .
keyword hang
Thanks!

Sign in to add a comment