Skip to content

Commit 5544492

Browse files
authored
[Clang] Fixed a crash when parsing #embed parameters with unmatched closing brackets (#152877)
Fixes #152829 --- This patch addresses the issue where the preprocessor could crash when parsing `#embed` parameters containing unmatched closing brackets ```cpp #embed "file" prefix(]) #embed "file" prefix(}) ```
1 parent d74ae41 commit 5544492

File tree

3 files changed

+15
-1
lines changed

3 files changed

+15
-1
lines changed

clang/docs/ReleaseNotes.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,7 @@ Crash and bug fixes
295295
^^^^^^^^^^^^^^^^^^^
296296
- Fixed a crash in the static analyzer that when the expression in an
297297
``[[assume(expr)]]`` attribute was enclosed in parentheses. (#GH151529)
298+
- Fixed a crash when parsing ``#embed`` parameters with unmatched closing brackets. (#GH152829)
298299

299300
Improvements
300301
^^^^^^^^^^^^

clang/lib/Lex/PPDirectives.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3793,9 +3793,13 @@ Preprocessor::LexEmbedParameters(Token &CurTok, bool ForHasEmbed) {
37933793
[[fallthrough]];
37943794
case tok::r_brace:
37953795
case tok::r_square: {
3796+
if (BracketStack.empty()) {
3797+
ExpectOrDiagAndSkipToEOD(tok::r_paren);
3798+
return false;
3799+
}
37963800
tok::TokenKind Matching =
37973801
GetMatchingCloseBracket(BracketStack.back().first);
3798-
if (BracketStack.empty() || CurTok.getKind() != Matching) {
3802+
if (CurTok.getKind() != Matching) {
37993803
DiagMismatchedBracesAndSkipToEOD(Matching, BracketStack.back());
38003804
return false;
38013805
}

clang/test/Preprocessor/embed_parsing_errors.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@ char buffer[] = {
9494
#embed "embed_parsing_errors.c" prefix() // OK: tokens within parens are optional
9595
#embed "embed_parsing_errors.c" prefix)
9696
// expected-error@-1 {{expected '('}}
97+
#embed "embed_parsing_errors.c" prefix()) // expected-error {{expected identifier}}
98+
#embed "embed_parsing_errors.c" prefix(]) // expected-error {{expected ')'}}
99+
#embed "embed_parsing_errors.c" prefix(}) // expected-error {{expected ')'}}
97100

98101
#embed "embed_parsing_errors.c" suffix
99102
// expected-error@-1 {{expected '('}}
@@ -115,6 +118,9 @@ char buffer[] = {
115118
#embed "embed_parsing_errors.c" suffix() // OK: tokens within parens are optional
116119
#embed "embed_parsing_errors.c" suffix)
117120
// expected-error@-1 {{expected '('}}
121+
#embed "embed_parsing_errors.c" suffix()) // expected-error {{expected identifier}}
122+
#embed "embed_parsing_errors.c" suffix(]) // expected-error {{expected ')'}}
123+
#embed "embed_parsing_errors.c" suffix(}) // expected-error {{expected ')'}}
118124

119125
#embed "embed_parsing_errors.c" if_empty(1/0) // OK: emitted as tokens, not evaluated yet.
120126
#embed "embed_parsing_errors.c" if_empty(([{}])) // OK: delimiters balanced
@@ -128,3 +134,6 @@ char buffer[] = {
128134
#embed "embed_parsing_errors.c" if_empty)
129135
// expected-error@-1 {{expected '('}}
130136
};
137+
#embed "embed_parsing_errors.c" if_empty()) // expected-error {{expected identifier}}
138+
#embed "embed_parsing_errors.c" if_empty(]) // expected-error {{expected ')'}}
139+
#embed "embed_parsing_errors.c" if_empty(}) // expected-error {{expected ')'}}

0 commit comments

Comments
 (0)