Bug#724550: clang-3.3: crash when parsing (invalid) c++ source

Julian Blake Kongslie jblake at duckytech.com
Wed Sep 25 00:02:03 UTC 2013


Package: clang-3.3
Version: 1:3.3-9
Severity: normal

Dear Maintainer,

I was writing a class where I wanted to do something similar to this:

	class Foo {
		class Bar {
			Foo::Qux get_qux();
		};
		class Qux {
		};
	};

And clang (rightly) complains that get_qux can't be declared at that
position because there's no type named Foo:Qux yet.

So I figured, in my tired and incoherent state, let's just try adding
the class keyword so clang knows it's an incomplete type:

	class Foo {
		class Bar {
			class Foo::Qux get_qux();
		};
		class Qux {
		};
	};

This, as it happens, crashes clang. It probably shouldn't do that, even
though it's not valid C++. Interestingly, I still get the correct error
message out of clang before it crashes.

Here's the complete output from clang as it crashes:
foo.cpp:3:14: error: no class named 'Qux' in 'Foo'
                class Foo::Qux get_qux();
                      ~~~~~^
0  libLLVM-3.3.so.1 0x00007f6154856652 llvm::sys::PrintStackTrace(_IO_FILE*) + 34
1  libLLVM-3.3.so.1 0x00007f61548564b9
2  libpthread.so.0  0x00007f615382f210
3  clang            0x0000000000c09ad0
4  clang            0x0000000000c0cfde clang::Sema::GetTypeForDeclarator(clang::Declarator&, clang::Scope*) + 190
5  clang            0x00000000009fabff clang::Sema::HandleDeclarator(clang::Scope*, clang::Declarator&, llvm::MutableArrayRef<clang::TemplateParameterList*>) + 831
6  clang            0x0000000000a440dd clang::Sema::ActOnCXXMemberDeclarator(clang::Scope*, clang::AccessSpecifier, clang::Declarator&, llvm::MutableArrayRef<clang::TemplateParameterList*>, clang::Expr*, clang::VirtSpecifiers const&, clang::InClassInitStyle) + 861
7  clang            0x00000000008f54cb clang::Parser::ParseCXXClassMemberDeclaration(clang::AccessSpecifier, clang::AttributeList*, clang::Parser::ParsedTemplateInfo const&, clang::ParsingDeclRAIIObject*) + 5467
8  clang            0x00000000008f6ad9 clang::Parser::ParseCXXMemberSpecification(clang::SourceLocation, clang::SourceLocation, clang::Parser::ParsedAttributesWithRange&, unsigned int, clang::Decl*) + 1961
9  clang            0x00000000008f8415 clang::Parser::ParseClassSpecifier(clang::tok::TokenKind, clang::SourceLocation, clang::DeclSpec&, clang::Parser::ParsedTemplateInfo const&, clang::AccessSpecifier, bool, clang::Parser::DeclSpecContext, clang::Parser::ParsedAttributesWithRange&) + 3685
10 clang            0x00000000008e57bf clang::Parser::ParseDeclarationSpecifiers(clang::DeclSpec&, clang::Parser::ParsedTemplateInfo const&, clang::AccessSpecifier, clang::Parser::DeclSpecContext, clang::Parser::LateParsedAttrList*) + 4047
11 clang            0x00000000008f446b clang::Parser::ParseCXXClassMemberDeclaration(clang::AccessSpecifier, clang::AttributeList*, clang::Parser::ParsedTemplateInfo const&, clang::ParsingDeclRAIIObject*) + 1275
12 clang            0x00000000008f6ad9 clang::Parser::ParseCXXMemberSpecification(clang::SourceLocation, clang::SourceLocation, clang::Parser::ParsedAttributesWithRange&, unsigned int, clang::Decl*) + 1961
13 clang            0x00000000008f8415 clang::Parser::ParseClassSpecifier(clang::tok::TokenKind, clang::SourceLocation, clang::DeclSpec&, clang::Parser::ParsedTemplateInfo const&, clang::AccessSpecifier, bool, clang::Parser::DeclSpecContext, clang::Parser::ParsedAttributesWithRange&) + 3685
14 clang            0x00000000008e57bf clang::Parser::ParseDeclarationSpecifiers(clang::DeclSpec&, clang::Parser::ParsedTemplateInfo const&, clang::AccessSpecifier, clang::Parser::DeclSpecContext, clang::Parser::LateParsedAttrList*) + 4047
15 clang            0x00000000008cfa74 clang::Parser::ParseDeclOrFunctionDefInternal(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec&, clang::AccessSpecifier) + 84
16 clang            0x00000000008d02ee clang::Parser::ParseDeclarationOrFunctionDefinition(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec*, clang::AccessSpecifier) + 926
17 clang            0x00000000008d38a9 clang::Parser::ParseExternalDeclaration(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec*) + 249
18 clang            0x00000000008d3ed2 clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&) + 194
19 clang            0x00000000008cc440 clang::ParseAST(clang::Sema&, bool, bool) + 352
20 clang            0x000000000063d129 clang::FrontendAction::Execute() + 169
21 clang            0x000000000061eb22 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) + 290
22 clang            0x000000000060a997 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) + 1575
23 clang            0x0000000000605db8 cc1_main(char const**, char const**, char const*, void*) + 1160
24 clang            0x0000000000604847 main + 7847
25 libc.so.6        0x00007f6152872995 __libc_start_main + 245
26 clang            0x0000000000604e05
Stack dump:
0.	Program arguments: /usr/bin/clang -cc1 -triple x86_64-pc-linux-gnu -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -main-file-name foo.cpp -mrelocation-model static -mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu x86-64 -target-linker-version 2.23.52.20130828 -resource-dir /usr/bin/../lib/clang/3.3 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/x86_64-linux-gnu -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/backward -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/x86_64-linux-gnu/c++/4.8 -internal-isystem /usr/local/include -internal-isystem /usr/bin/../lib/clang/3.3/include -internal-isystem /usr/include/clang/3.3/include/ -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /usr/include/x86_64-linux-g!
 nu -internal-externc-isystem /usr/include -fdeprecated-macro -fdebug-compilation-dir /home/jblake -ferror-limit 19 -fmessage-length 159 -mstackrealign -fobjc-runtime=gcc -fobjc-default-synthesize-properties -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -backend-option -vectorize-loops -o /tmp/foo-cVZXYa.o -x c++ foo.cpp 
1.	foo.cpp:3:27: current parser token ';'
2.	foo.cpp:1:1: parsing struct/union/class body 'Foo'
3.	foo.cpp:2:2: parsing struct/union/class body 'Bar'
clang: error: unable to execute command: Segmentation fault
clang: error: clang frontend command failed due to signal (use -v to see invocation)
Debian clang version 3.3-9 (branches/release_33) (based on LLVM 3.3)
Target: x86_64-pc-linux-gnu
Thread model: posix
clang: note: diagnostic msg: PLEASE submit a bug report to http://bugs.debian.org/ 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/foo-1Vw0aR.cpp
clang: note: diagnostic msg: /tmp/foo-1Vw0aR.sh
clang: note: diagnostic msg: 

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

I've attached the relevant files (foo.cpp, /tmp/foo-1Vw0aR.cpp,
/tmp/foo-1Vw0aR.sh) to this report. The command I ran was simply:
	clang++ foo.cpp

Please let me know if there's anything further I can do to assist.

Thanks for your time,

-Jules

-- System Information:
Debian Release: jessie/sid
  APT prefers stable-updates
  APT policy: (500, 'stable-updates'), (500, 'proposed-updates'), (500, 'oldstable-updates'), (500, 'oldstable-proposed-updates'), (500, 'unstable'), (500, 'testing'), (500, 'stable'), (500, 'oldstable'), (1, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 3.2.0-4-rt-amd64 (SMP w/4 CPU cores; PREEMPT)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages clang-3.3 depends on:
ii  libc6                    2.17-93
ii  libclang-common-3.3-dev  1:3.3-9
ii  libclang1-3.3            1:3.3-9
ii  libffi6                  3.0.13-4
ii  libgcc-4.8-dev           4.8.1-10
ii  libgcc1                  1:4.8.1-10
ii  libllvm3.3               1:3.3-9
ii  libobjc-4.8-dev          4.8.1-10
ii  libstdc++-4.8-dev        4.8.1-10
ii  libstdc++6               4.8.1-10

Versions of packages clang-3.3 recommends:
ii  llvm-3.3-dev  1:3.3-9
ii  python        2.7.5-5

clang-3.3 suggests no packages.

-- no debconf information
-------------- next part --------------
A non-text attachment was scrubbed...
Name: foo.cpp
Type: text/x-c++
Size: 77 bytes
Desc: not available
URL: <http://lists.alioth.debian.org/pipermail/pkg-llvm-team/attachments/20130924/626c9f78/attachment.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: foo-1Vw0aR.cpp
Type: text/x-c++
Size: 93 bytes
Desc: not available
URL: <http://lists.alioth.debian.org/pipermail/pkg-llvm-team/attachments/20130924/626c9f78/attachment-0001.bin>
-------------- next part --------------
/usr/bin/clang -cc1 -triple x86_64-pc-linux-gnu -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -main-file-name foo.cpp -mrelocation-model static -mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu x86-64 -target-linker-version 2.23.52.20130828 -fdeprecated-macro -ferror-limit 19 -fmessage-length 159 -mstackrealign -fobjc-runtime=gcc -fobjc-default-synthesize-properties -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -backend-option -vectorize-loops -x c++ foo-1Vw0aR.cpp


More information about the Pkg-llvm-team mailing list