https://github.com/yronglin updated https://github.com/llvm/llvm-project/pull/149982
>From d7f00bde68176aab93d4da50a12aea00c29d5276 Mon Sep 17 00:00:00 2001 From: yronglin <yronglin...@gmail.com> Date: Tue, 22 Jul 2025 17:18:36 +0800 Subject: [PATCH 1/4] [clang] Check empty macro name in #pragma push_macro("") or #pragma pop_macro("") Signed-off-by: yronglin <yronglin...@gmail.com> --- clang/docs/ReleaseNotes.rst | 2 ++ clang/lib/Lex/Pragma.cpp | 4 ++++ clang/test/Preprocessor/pragma-pushpop-macro.c | 3 +++ 3 files changed, 9 insertions(+) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 81483c12c8fe9..461902701bc48 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -814,6 +814,8 @@ Bug Fixes in This Version - Fixed a failed assertion with an operator call expression which comes from a macro expansion when performing analysis for nullability attributes. (#GH138371) - Fixed a concept equivalent checking crash due to untransformed constraint expressions. (#GH146614) +- Fix a crash when marco name is empty in ``#pragma push_macro("")`` or + ``#pragma pop_macro("")``. (GH149762). Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Lex/Pragma.cpp b/clang/lib/Lex/Pragma.cpp index 01c85e6ad95d5..7f1190c4dcce6 100644 --- a/clang/lib/Lex/Pragma.cpp +++ b/clang/lib/Lex/Pragma.cpp @@ -604,6 +604,10 @@ IdentifierInfo *Preprocessor::ParsePragmaPushOrPopMacro(Token &Tok) { assert(StrVal[0] == '"' && StrVal[StrVal.size()-1] == '"' && "Invalid string token!"); + // FIXME: Should we emit a warning? + if (StrVal.size() <= 2) + return nullptr; + // Create a Token from the string. Token MacroTok; MacroTok.startToken(); diff --git a/clang/test/Preprocessor/pragma-pushpop-macro.c b/clang/test/Preprocessor/pragma-pushpop-macro.c index 0aee074c55c77..238e3ed5eddb3 100644 --- a/clang/test/Preprocessor/pragma-pushpop-macro.c +++ b/clang/test/Preprocessor/pragma-pushpop-macro.c @@ -56,3 +56,6 @@ int P; // CHECK: int pmy2 = 4 // CHECK: int Q; // CHECK: int P; + +#pragma push_macro("") +#pragma pop_macro("") >From b94ebcfdbb208e2bbd17d2e7002cf012b1086e31 Mon Sep 17 00:00:00 2001 From: yronglin <yronglin...@gmail.com> Date: Tue, 22 Jul 2025 20:36:50 +0800 Subject: [PATCH 2/4] Add diagnostic Signed-off-by: yronglin <yronglin...@gmail.com> --- clang/include/clang/Basic/DiagnosticLexKinds.td | 3 +++ clang/lib/Lex/Pragma.cpp | 12 +++++++++--- clang/test/Preprocessor/pragma-pushpop-macro-diag.c | 4 ++++ 3 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 clang/test/Preprocessor/pragma-pushpop-macro-diag.c diff --git a/clang/include/clang/Basic/DiagnosticLexKinds.td b/clang/include/clang/Basic/DiagnosticLexKinds.td index 723f5d48b4f5f..73d5e51da1fd7 100644 --- a/clang/include/clang/Basic/DiagnosticLexKinds.td +++ b/clang/include/clang/Basic/DiagnosticLexKinds.td @@ -694,6 +694,9 @@ def err_pragma_push_pop_macro_malformed : Error< def warn_pragma_pop_macro_no_push : Warning< "pragma pop_macro could not pop '%0', no matching push_macro">, InGroup<IgnoredPragmas>; +def warn_pargma_push_pop_macro_empty_string : Warning< + "#pragma %select{push_macro|pop_macro}0 expected an non-empty string">, + InGroup<IgnoredPragmas>; def warn_pragma_message : Warning<"%0">, InGroup<PoundPragmaMessage>, DefaultWarnNoWerror; def err_pragma_message : Error<"%0">; diff --git a/clang/lib/Lex/Pragma.cpp b/clang/lib/Lex/Pragma.cpp index 7f1190c4dcce6..bba3c89bed38f 100644 --- a/clang/lib/Lex/Pragma.cpp +++ b/clang/lib/Lex/Pragma.cpp @@ -591,7 +591,8 @@ IdentifierInfo *Preprocessor::ParsePragmaPushOrPopMacro(Token &Tok) { } // Remember the macro string. - std::string StrVal = getSpelling(Tok); + Token StrTok = Tok; + std::string StrVal = getSpelling(StrTok); // Read the ')'. Lex(Tok); @@ -604,9 +605,14 @@ IdentifierInfo *Preprocessor::ParsePragmaPushOrPopMacro(Token &Tok) { assert(StrVal[0] == '"' && StrVal[StrVal.size()-1] == '"' && "Invalid string token!"); - // FIXME: Should we emit a warning? - if (StrVal.size() <= 2) + if (StrVal.size() <= 2) { + Diag(StrTok.getLocation(), diag::warn_pargma_push_pop_macro_empty_string) + << SourceRange( + StrTok.getLocation(), + StrTok.getLocation().getLocWithOffset(StrTok.getLength())) + << PragmaTok.getIdentifierInfo()->isStr("pop_macro"); return nullptr; + } // Create a Token from the string. Token MacroTok; diff --git a/clang/test/Preprocessor/pragma-pushpop-macro-diag.c b/clang/test/Preprocessor/pragma-pushpop-macro-diag.c new file mode 100644 index 0000000000000..9878b96938216 --- /dev/null +++ b/clang/test/Preprocessor/pragma-pushpop-macro-diag.c @@ -0,0 +1,4 @@ +// RUN: %clang_cc1 -fms-extensions %s -fsyntax-only -verify + +#pragma push_macro("") // expected-warning {{#pragma push_macro expected an non-empty string}} +#pragma pop_macro("") // expected-warning {{#pragma pop_macro expected an non-empty string}} >From 8b2e82dbfce13a413ac8c741c82a845810f19c5e Mon Sep 17 00:00:00 2001 From: yronglin <yronglin...@gmail.com> Date: Tue, 22 Jul 2025 21:29:26 +0800 Subject: [PATCH 3/4] Address review comments Signed-off-by: yronglin <yronglin...@gmail.com> --- clang/include/clang/Basic/DiagnosticLexKinds.td | 2 +- clang/test/Preprocessor/pragma-pushpop-macro-diag.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticLexKinds.td b/clang/include/clang/Basic/DiagnosticLexKinds.td index 73d5e51da1fd7..60f13b0b5d258 100644 --- a/clang/include/clang/Basic/DiagnosticLexKinds.td +++ b/clang/include/clang/Basic/DiagnosticLexKinds.td @@ -695,7 +695,7 @@ def warn_pragma_pop_macro_no_push : Warning< "pragma pop_macro could not pop '%0', no matching push_macro">, InGroup<IgnoredPragmas>; def warn_pargma_push_pop_macro_empty_string : Warning< - "#pragma %select{push_macro|pop_macro}0 expected an non-empty string">, + "#pragma %select{push_macro|pop_macro}0 expected a non-empty string">, InGroup<IgnoredPragmas>; def warn_pragma_message : Warning<"%0">, InGroup<PoundPragmaMessage>, DefaultWarnNoWerror; diff --git a/clang/test/Preprocessor/pragma-pushpop-macro-diag.c b/clang/test/Preprocessor/pragma-pushpop-macro-diag.c index 9878b96938216..e4bc8a563f6d6 100644 --- a/clang/test/Preprocessor/pragma-pushpop-macro-diag.c +++ b/clang/test/Preprocessor/pragma-pushpop-macro-diag.c @@ -1,4 +1,4 @@ // RUN: %clang_cc1 -fms-extensions %s -fsyntax-only -verify -#pragma push_macro("") // expected-warning {{#pragma push_macro expected an non-empty string}} -#pragma pop_macro("") // expected-warning {{#pragma pop_macro expected an non-empty string}} +#pragma push_macro("") // expected-warning {{#pragma push_macro expected a non-empty string}} +#pragma pop_macro("") // expected-warning {{#pragma pop_macro expected a non-empty string}} >From a794166415ee14099e8289f003137d36b8fad9c5 Mon Sep 17 00:00:00 2001 From: yronglin <yronglin...@gmail.com> Date: Tue, 22 Jul 2025 22:36:28 +0800 Subject: [PATCH 4/4] Add ' for pragma introducer Signed-off-by: yronglin <yronglin...@gmail.com> --- clang/include/clang/Basic/DiagnosticLexKinds.td | 2 +- clang/test/Preprocessor/pragma-pushpop-macro-diag.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticLexKinds.td b/clang/include/clang/Basic/DiagnosticLexKinds.td index 60f13b0b5d258..c7fe6e1db6d1f 100644 --- a/clang/include/clang/Basic/DiagnosticLexKinds.td +++ b/clang/include/clang/Basic/DiagnosticLexKinds.td @@ -695,7 +695,7 @@ def warn_pragma_pop_macro_no_push : Warning< "pragma pop_macro could not pop '%0', no matching push_macro">, InGroup<IgnoredPragmas>; def warn_pargma_push_pop_macro_empty_string : Warning< - "#pragma %select{push_macro|pop_macro}0 expected a non-empty string">, + "'#pragma %select{push_macro|pop_macro}0' expected a non-empty string">, InGroup<IgnoredPragmas>; def warn_pragma_message : Warning<"%0">, InGroup<PoundPragmaMessage>, DefaultWarnNoWerror; diff --git a/clang/test/Preprocessor/pragma-pushpop-macro-diag.c b/clang/test/Preprocessor/pragma-pushpop-macro-diag.c index e4bc8a563f6d6..293cb828d832e 100644 --- a/clang/test/Preprocessor/pragma-pushpop-macro-diag.c +++ b/clang/test/Preprocessor/pragma-pushpop-macro-diag.c @@ -1,4 +1,4 @@ // RUN: %clang_cc1 -fms-extensions %s -fsyntax-only -verify -#pragma push_macro("") // expected-warning {{#pragma push_macro expected a non-empty string}} -#pragma pop_macro("") // expected-warning {{#pragma pop_macro expected a non-empty string}} +#pragma push_macro("") // expected-warning {{'#pragma push_macro' expected a non-empty string}} +#pragma pop_macro("") // expected-warning {{'#pragma pop_macro' expected a non-empty string}} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits