[LLVMbugs] [Bug 23021] New: Segmentation fault with illegally captured variable

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Wed Mar 25 11:18:34 PDT 2015


https://llvm.org/bugs/show_bug.cgi?id=23021

            Bug ID: 23021
           Summary: Segmentation fault with illegally captured variable
           Product: clang
           Version: 3.6
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: C++11
          Assignee: unassignedclangbugs at nondot.org
          Reporter: pipping at exherbo.org
                CC: dgregor at apple.com, llvmbugs at cs.uiuc.edu
    Classification: Unclassified

When clang is fed this rather short piece of invalid code, it dies:

% cat file.cc
template <int dimension>
class A;

int main ()
{
  const int dim = 3;
  {
    auto contraction = []() {
      auto computeStrain = [](A<dim>& strain) {  };
    };
  }
}

% clang++ -std=c++11 -c file.cc
file.cc:9:33: error: variable 'dim' cannot be implicitly captured in a lambda
with no capture-default specified
      auto computeStrain = [](A<dim>& strain) {  };
                                ^
file.cc:6:13: note: 'dim' declared here
  const int dim = 3;
            ^
#0 0x2a59452 llvm::sys::PrintStackTrace(_IO_FILE*) (BINDIR/clang+0x2a59452)
#1 0x2a57fb3 (BINDIR/clang+0x2a57fb3)
#2 0x2ac85702d0a0 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0xf0a0)
#3 0xdab036 clang::Sema::tryCaptureVariable(clang::VarDecl*,
clang::SourceLocation, clang::Sema::TryCaptureKind, clang::SourceLocation,
bool, clang::QualType&, clang::QualType&, unsigned int const*)
(BINDIR/clang+0xdab036)
#4 0xdbe2d6 clang::Sema::CleanupVarDeclMarking() (BINDIR/clang+0xdbe2d6)
#5 0xdbe6dd clang::Sema::PopExpressionEvaluationContext()
(BINDIR/clang+0xdbe6dd)
#6 0xbe6416
clang::Parser::ParseTemplateArgumentList(llvm::SmallVector<clang::ParsedTemplateArgument,
16u>&) (BINDIR/clang+0xbe6416)
#7 0xbe65b2
clang::Parser::ParseTemplateIdAfterTemplateName(clang::OpaquePtr<clang::TemplateName>,
clang::SourceLocation, clang::CXXScopeSpec const&, bool,
clang::SourceLocation&, llvm::SmallVector<clang::ParsedTemplateArgument, 16u>&,
clang::SourceLocation&) (BINDIR/clang+0xbe65b2)
#8 0xbe6707
clang::Parser::AnnotateTemplateIdToken(clang::OpaquePtr<clang::TemplateName>,
clang::TemplateNameKind, clang::CXXScopeSpec&, clang::SourceLocation,
clang::UnqualifiedId&, bool) (BINDIR/clang+0xbe6707)
#9 0xbbd7a1 clang::Parser::ParseOptionalCXXScopeSpecifier(clang::CXXScopeSpec&,
clang::OpaquePtr<clang::QualType>, bool, bool*, bool, clang::IdentifierInfo**)
(BINDIR/clang+0xbbd7a1)
#10 0xb84ade clang::Parser::TryAnnotateCXXScopeToken(bool)
(BINDIR/clang+0xb84ade)
#11 0xb91a20 clang::Parser::ParseDeclarationSpecifiers(clang::DeclSpec&,
clang::Parser::ParsedTemplateInfo const&, clang::AccessSpecifier,
clang::Parser::DeclSpecContext, clang::Parser::LateParsedAttrList*)
(BINDIR/clang+0xb91a20)
#12 0xb981bb clang::Parser::ParseParameterDeclarationClause(clang::Declarator&,
clang::ParsedAttributes&,
llvm::SmallVectorImpl<clang::DeclaratorChunk::ParamInfo>&,
clang::SourceLocation&) (BINDIR/clang+0xb981bb)
#13 0xbb977d
clang::Parser::ParseLambdaExpressionAfterIntroducer(clang::LambdaIntroducer&)
(BINDIR/clang+0xbb977d)
#14 0xbbaaff clang::Parser::ParseLambdaExpression() (BINDIR/clang+0xbbaaff)
#15 0xbaee4a clang::Parser::ParseCastExpression(bool, bool, bool&,
clang::Parser::TypeCastState) (BINDIR/clang+0xbaee4a)
#16 0xbb00fd clang::Parser::ParseCastExpression(bool, bool,
clang::Parser::TypeCastState) (BINDIR/clang+0xbb00fd)
#17 0xbb122f
clang::Parser::ParseAssignmentExpression(clang::Parser::TypeCastState)
(BINDIR/clang+0xbb122f)
#18 0xb88172 (BINDIR/clang+0xb88172)
#19 0xb8d733
clang::Parser::ParseDeclarationAfterDeclaratorAndAttributes(clang::Declarator&,
clang::Parser::ParsedTemplateInfo const&, clang::Parser::ForRangeInit*)
(BINDIR/clang+0xb8d733)
#20 0xb99905 clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&, unsigned
int, clang::SourceLocation*, clang::Parser::ForRangeInit*)
(BINDIR/clang+0xb99905)
#21 0xb9d459 clang::Parser::ParseSimpleDeclaration(unsigned int,
clang::SourceLocation&, clang::Parser::ParsedAttributesWithRange&, bool,
clang::Parser::ForRangeInit*) (BINDIR/clang+0xb9d459)
#22 0xb9d605 clang::Parser::ParseDeclaration(unsigned int,
clang::SourceLocation&, clang::Parser::ParsedAttributesWithRange&)
(BINDIR/clang+0xb9d605)
#23 0xbda126
clang::Parser::ParseStatementOrDeclarationAfterAttributes(llvm::SmallVector<clang::Stmt*,
32u>&, bool, clang::SourceLocation*, clang::Parser::ParsedAttributesWithRange&)
(BINDIR/clang+0xbda126)
#24 0xbdab1c
clang::Parser::ParseStatementOrDeclaration(llvm::SmallVector<clang::Stmt*,
32u>&, bool, clang::SourceLocation*) (BINDIR/clang+0xbdab1c)
#25 0xbd8d3a clang::Parser::ParseCompoundStatementBody(bool)
(BINDIR/clang+0xbd8d3a)
#26 0xbb9012
clang::Parser::ParseLambdaExpressionAfterIntroducer(clang::LambdaIntroducer&)
(BINDIR/clang+0xbb9012)
#27 0xbbaaff clang::Parser::ParseLambdaExpression() (BINDIR/clang+0xbbaaff)
#28 0xbaee4a clang::Parser::ParseCastExpression(bool, bool, bool&,
clang::Parser::TypeCastState) (BINDIR/clang+0xbaee4a)
#29 0xbb00fd clang::Parser::ParseCastExpression(bool, bool,
clang::Parser::TypeCastState) (BINDIR/clang+0xbb00fd)
#30 0xbb122f
clang::Parser::ParseAssignmentExpression(clang::Parser::TypeCastState)
(BINDIR/clang+0xbb122f)
#31 0xb88172 (BINDIR/clang+0xb88172)
#32 0xb8d733
clang::Parser::ParseDeclarationAfterDeclaratorAndAttributes(clang::Declarator&,
clang::Parser::ParsedTemplateInfo const&, clang::Parser::ForRangeInit*)
(BINDIR/clang+0xb8d733)
#33 0xb99905 clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&, unsigned
int, clang::SourceLocation*, clang::Parser::ForRangeInit*)
(BINDIR/clang+0xb99905)
#34 0xb9d459 clang::Parser::ParseSimpleDeclaration(unsigned int,
clang::SourceLocation&, clang::Parser::ParsedAttributesWithRange&, bool,
clang::Parser::ForRangeInit*) (BINDIR/clang+0xb9d459)
#35 0xb9d605 clang::Parser::ParseDeclaration(unsigned int,
clang::SourceLocation&, clang::Parser::ParsedAttributesWithRange&)
(BINDIR/clang+0xb9d605)
#36 0xbda126
clang::Parser::ParseStatementOrDeclarationAfterAttributes(llvm::SmallVector<clang::Stmt*,
32u>&, bool, clang::SourceLocation*, clang::Parser::ParsedAttributesWithRange&)
(BINDIR/clang+0xbda126)
#37 0xbdab1c
clang::Parser::ParseStatementOrDeclaration(llvm::SmallVector<clang::Stmt*,
32u>&, bool, clang::SourceLocation*) (BINDIR/clang+0xbdab1c)
#38 0xbd8d3a clang::Parser::ParseCompoundStatementBody(bool)
(BINDIR/clang+0xbd8d3a)
#39 0xbd90fd clang::Parser::ParseCompoundStatement(bool, unsigned int)
(BINDIR/clang+0xbd90fd)
#40 0xbd9152 clang::Parser::ParseCompoundStatement(bool)
(BINDIR/clang+0xbd9152)
#41 0xbda553
clang::Parser::ParseStatementOrDeclarationAfterAttributes(llvm::SmallVector<clang::Stmt*,
32u>&, bool, clang::SourceLocation*, clang::Parser::ParsedAttributesWithRange&)
(BINDIR/clang+0xbda553)
#42 0xbdab1c
clang::Parser::ParseStatementOrDeclaration(llvm::SmallVector<clang::Stmt*,
32u>&, bool, clang::SourceLocation*) (BINDIR/clang+0xbdab1c)
#43 0xbd8d3a clang::Parser::ParseCompoundStatementBody(bool)
(BINDIR/clang+0xbd8d3a)
#44 0xbddb53 clang::Parser::ParseFunctionStatementBody(clang::Decl*,
clang::Parser::ParseScope&) (BINDIR/clang+0xbddb53)
#45 0xb837e7 clang::Parser::ParseFunctionDefinition(clang::ParsingDeclarator&,
clang::Parser::ParsedTemplateInfo const&, clang::Parser::LateParsedAttrList*)
(BINDIR/clang+0xb837e7)
#46 0xb99f2a clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&, unsigned
int, clang::SourceLocation*, clang::Parser::ForRangeInit*)
(BINDIR/clang+0xb99f2a)
#47 0xb811b0
clang::Parser::ParseDeclOrFunctionDefInternal(clang::Parser::ParsedAttributesWithRange&,
clang::ParsingDeclSpec&, clang::AccessSpecifier) (BINDIR/clang+0xb811b0)
#48 0xb81452
clang::Parser::ParseDeclarationOrFunctionDefinition(clang::Parser::ParsedAttributesWithRange&,
clang::ParsingDeclSpec*, clang::AccessSpecifier) (BINDIR/clang+0xb81452)
#49 0xb83c68
clang::Parser::ParseExternalDeclaration(clang::Parser::ParsedAttributesWithRange&,
clang::ParsingDeclSpec*) (BINDIR/clang+0xb83c68)
#50 0xb8452c
clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&)
(BINDIR/clang+0xb8452c)
#51 0xb7dfca clang::ParseAST(clang::Sema&, bool, bool) (BINDIR/clang+0xb7dfca)
#52 0x991fce clang::CodeGenAction::ExecuteAction() (BINDIR/clang+0x991fce)
#53 0x7af0f6 clang::FrontendAction::Execute() (BINDIR/clang+0x7af0f6)
#54 0x78d98e clang::CompilerInstance::ExecuteAction(clang::FrontendAction&)
(BINDIR/clang+0x78d98e)
#55 0x76f6bc clang::ExecuteCompilerInvocation(clang::CompilerInstance*)
(BINDIR/clang+0x76f6bc)
#56 0x767d18 cc1_main(llvm::ArrayRef<char const*>, char const*, void*)
(BINDIR/clang+0x767d18)
#57 0x7534c1 main (BINDIR/clang+0x7534c1)
#58 0x2ac85802fead __libc_start_main
/build/eglibc-ZhUScE/eglibc-2.13/csu/libc-start.c:276:0
#59 0x766b1d _start (BINDIR/clang+0x766b1d)
Stack dump:
0.    Program arguments: BINDIR/clang -cc1 -triple x86_64-unknown-linux-gnu
-emit-obj -mrelax-all -disable-free -main-file-name file.cc -mrelocation-model
static -mthread-model posix -mdisable-fp-elim -fmath-errno -masm-verbose
-mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu x86-64
-target-linker-version 2.22 -dwarf-column-info -coverage-file TMPDIR/file.cc
-resource-dir BINDIR/../lib/clang/3.6.0 -internal-isystem
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7 -internal-isystem
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/x86_64-linux-gnu
-internal-isystem
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/backward
-internal-isystem /usr/local/include -internal-isystem
BINDIR/../lib/clang/3.6.0/include -internal-externc-isystem
/usr/include/x86_64-linux-gnu -internal-externc-isystem /include
-internal-externc-isystem /usr/include -std=c++11 -fdeprecated-macro
-fdebug-compilation-dir TMPDIR -ferror-limit 19 -fmessage-length 181
-mstackrealign -fobjc-runtime=gcc -fcxx-exceptions -fexceptions
-fdiagnostics-show-option -fcolor-diagnostics -o file.o -x c++ file.cc 
1.    file.cc:9:36: current parser token '>'
2.    file.cc:5:1: parsing function body 'main'
3.    file.cc:5:1: in compound statement ('{}')
4.    file.cc:7:3: in compound statement ('{}')
5.    file.cc:8:24: lambda expression parsing
6.    file.cc:8:29: in compound statement ('{}')
7.    file.cc:9:28: lambda expression parsing
clang: error: unable to execute command: Segmentation fault
clang: error: clang frontend command failed due to signal (use -v to see
invocation)
clang version 3.6.0 (tags/RELEASE_360/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
clang: note: diagnostic msg: PLEASE submit a bug report to
http://llvm.org/bugs/ and include the crash backtrace, preprocessed source, and
associated run script.
clang: note: diagnostic msg: 
********************

PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang: note: diagnostic msg: /tmp/file-989c89.cpp
clang: note: diagnostic msg: /tmp/file-989c89.sh
clang: note: diagnostic msg: 

********************

The file /tmp/file-989c89.sh contains

 "BINDIR/clang" "-cc1" "-triple" "x86_64-unknown-linux-gnu" "-emit-obj"
"-mrelax-all" "-disable-free" "-main-file-name" "file.cc" "-mrelocation-model"
"static" "-mthread-model" "posix" "-mdisable-fp-elim" "-fmath-errno"
"-masm-verbose" "-mconstructor-aliases" "-munwind-tables" "-fuse-init-array"
"-target-cpu" "x86-64" "-target-linker-version" "2.22" "-dwarf-column-info"
"-std=c++11" "-fdeprecated-macro" "-ferror-limit" "19" "-fmessage-length" "181"
"-mstackrealign" "-fobjc-runtime=gcc" "-fcxx-exceptions" "-fexceptions"
"-fdiagnostics-show-option" "-fcolor-diagnostics" "-x" "c++" "file-989c89.cpp"

In the above, I've replaced the actual path to clang with the string BINDIR and
my current working directory with TMPDIR.

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20150325/03870e8a/attachment.html>


More information about the llvm-bugs mailing list