infinite loop (?) in clang when building services/network/socket_factory.cc with local change that adds variable initialized to itself |
|||
Issue description0. 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
,
Aug 19
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?
,
Aug 19
(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;
^~~~~~~~~~~~~~~~~~~~~~~~~
)
,
Aug 19
Standalone repro. Unzip and run: time ~/src/llvm-build-goma/bin/clang -arch x86_64 -Wthread-safety -std=c++14 -c foo.ii
,
Aug 20
Reduced repro:
$ cat foo.ii
struct S {};
void g(const S& ssl_client_socket_context);
void f() {
S& s = s;
g(s);
}
,
Aug 20
Even smaller:
$ cat foo.ii
void g(int);
void f() {
int& s = s;
g(s);
}
,
Aug 20
Filed https://bugs.llvm.org/show_bug.cgi?id=38640 upstream.
,
Sep 7
Fixed in upstream r340636, and rolled in in the clang roll in issue 871418 .
,
Sep 7
keyword hang
,
Sep 7
Thanks! |
|||
►
Sign in to add a comment |
|||
Comment 1 by thakis@chromium.org
, Aug 19Hitting 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