-
Notifications
You must be signed in to change notification settings - Fork 15.4k
[Clang] prevent crash on invalid nested name specifiers with a single colon #169246
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
@llvm/pr-subscribers-clang Author: Oleksandr T. (a-tarasyuk) ChangesFixes #167905 This patch addresses an issue where invalid nested name specifier sequences containing a single colon ( llvm-project/clang/lib/Parse/ParseExprCXX.cpp Lines 404 to 418 in c543615
For malformed inputs like llvm-project/clang/lib/Parse/ParseTentative.cpp Lines 1739 to 1740 in 996213c
the classifier returns llvm-project/clang/lib/Parse/ParseTentative.cpp Lines 1750 to 1752 in 996213c
and consumes the invalid scope annotation, eventually reaching Full diff: https://github.com/llvm/llvm-project/pull/169246.diff 3 Files Affected:
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 63930f43c25e3..5b481dc9ae249 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -719,6 +719,8 @@ Crash and bug fixes
``[[assume(expr)]]`` attribute was enclosed in parentheses. (#GH151529)
- Fixed a crash when parsing ``#embed`` parameters with unmatched closing brackets. (#GH152829)
- Fixed a crash when compiling ``__real__`` or ``__imag__`` unary operator on scalar value with type promotion. (#GH160583)
+- Fixed a crash when parsing invalid nested name specifier sequences
+ containing a single colon. (#GH167905)
Improvements
^^^^^^^^^^^^
diff --git a/clang/lib/Parse/ParseTentative.cpp b/clang/lib/Parse/ParseTentative.cpp
index 82f2294ff5bb7..75a582e70b244 100644
--- a/clang/lib/Parse/ParseTentative.cpp
+++ b/clang/lib/Parse/ParseTentative.cpp
@@ -1063,7 +1063,8 @@ Parser::isCXXDeclarationSpecifier(ImplicitTypenameContext AllowImplicitTypename,
return TPResult::False;
}
- if (Next.isNot(tok::coloncolon) && Next.isNot(tok::less)) {
+ if (Next.isNot(tok::coloncolon) && Next.isNot(tok::less) &&
+ Next.isNot(tok::colon)) {
// Determine whether this is a valid expression. If not, we will hit
// a parse error one way or another. In that case, tell the caller that
// this is ambiguous. Typo-correct to type and expression keywords and
diff --git a/clang/test/Parser/cxx-nested-name-spec.cpp b/clang/test/Parser/cxx-nested-name-spec.cpp
new file mode 100644
index 0000000000000..3a551a4f2221f
--- /dev/null
+++ b/clang/test/Parser/cxx-nested-name-spec.cpp
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+namespace a { b c ( a:c::
+// expected-error@-1 {{unknown type name 'b'}}
+// expected-error@-2 {{unexpected ':' in nested name specifier; did you mean '::'?}}
+// expected-error@-3 {{no member named 'c' in namespace 'a'}}
+// expected-error@-4 {{expected ';' after top level declarator}}
+// expected-note@-5 {{to match this '{'}}
+// expected-error@+1 {{expected unqualified-id}} \
+// expected-error@+1 {{expected '}'}}
|
|
@AaronBallman, whenever you have time, could you please review these changes? Thanks |
AaronBallman
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I had a suggestion but feel free to land without taking it because the changes do LG.
AaronBallman
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, thank you!
Fixes #167905
This patch addresses an issue where invalid nested name specifier sequences containing a single colon (
a:c::) could be treated during recovery as valid scope specifiers, which in turn led to a crashllvm-project/clang/lib/Parse/ParseExprCXX.cpp
Lines 404 to 418 in c543615
For malformed inputs like
a:c::, the single colon recovery incorrectly triggers and produces anannot_cxxscope. When tentative parsing later runsllvm-project/clang/lib/Parse/ParseTentative.cpp
Lines 1739 to 1740 in 996213c
the classifier returns
Ambiguous, which doesn't stop parsing. The parser then enters thellvm-project/clang/lib/Parse/ParseTentative.cpp
Lines 1750 to 1752 in 996213c
and consumes the invalid scope annotation, eventually reaching
EOFand crashing.