[clang] d5be155 - [clang-format] Don't crash on malformed preprocessor conditions
via cfe-commits
cfe-commits at lists.llvm.org
Sat Oct 29 19:22:39 PDT 2022
Author: sstwcw
Date: 2022-10-30T02:18:58Z
New Revision: d5be1550f1406844501ab87a3e92622927a203e0
URL: https://github.com/llvm/llvm-project/commit/d5be1550f1406844501ab87a3e92622927a203e0
DIFF: https://github.com/llvm/llvm-project/commit/d5be1550f1406844501ab87a3e92622927a203e0.diff
LOG: [clang-format] Don't crash on malformed preprocessor conditions
Previously the program would crash on this input:
```
#else
#if X
```
The problem was that in `parsePPElse`, `PPBranchLevel` would be
incremented when the first `#else` gets parsed, but `PPLevelBranchCount`
and `PPLevelBranchIndex` would not be updated together.
I found the problem when working on D135740.
Differential Revision: https://reviews.llvm.org/D135972
Added:
Modified:
clang/lib/Format/UnwrappedLineParser.cpp
clang/unittests/Format/FormatTest.cpp
Removed:
################################################################################
diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp
index 25d9018fa1093..0372b89397db9 100644
--- a/clang/lib/Format/UnwrappedLineParser.cpp
+++ b/clang/lib/Format/UnwrappedLineParser.cpp
@@ -1215,9 +1215,12 @@ void UnwrappedLineParser::parsePPElse() {
// If a potential include guard has an #else, it's not an include guard.
if (IncludeGuard == IG_Defined && PPBranchLevel == 0)
IncludeGuard = IG_Rejected;
+ // Don't crash when there is an #else without an #if.
+ assert(PPBranchLevel >= -1);
+ if (PPBranchLevel == -1)
+ conditionalCompilationStart(/*Unreachable=*/true);
conditionalCompilationAlternative();
- if (PPBranchLevel > -1)
- --PPBranchLevel;
+ --PPBranchLevel;
parsePPUnknown();
++PPBranchLevel;
}
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index 69bd39590589f..e2eced46c3b4b 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -5193,6 +5193,34 @@ TEST_F(FormatTest, MacroDefinitionsWithIncompleteCode) {
verifyNoCrash("a={0,1\n#if a\n#else\n;\n#endif\n}");
verifyNoCrash("#if a\na(\n#else\n#endif\n) a {a,b,c,d,f,g};");
verifyNoCrash("#ifdef A\n a(\n #else\n #endif\n) = []() { \n)}");
+ verifyNoCrash("#else\n"
+ "#else\n"
+ "#endif\n"
+ "#endif");
+ verifyNoCrash("#else\n"
+ "#if X\n"
+ "#endif\n"
+ "#endif");
+ verifyNoCrash("#else\n"
+ "#endif\n"
+ "#if X\n"
+ "#endif");
+ verifyNoCrash("#if X\n"
+ "#else\n"
+ "#else\n"
+ "#endif\n"
+ "#endif");
+ verifyNoCrash("#if X\n"
+ "#elif Y\n"
+ "#elif Y\n"
+ "#endif\n"
+ "#endif");
+ verifyNoCrash("#endif\n"
+ "#endif");
+ verifyNoCrash("#endif\n"
+ "#else");
+ verifyNoCrash("#endif\n"
+ "#elif Y");
}
TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) {
More information about the cfe-commits
mailing list