[clang] Fix a bug that allowed some overflowing octal escape sequences
authorSergei Barannikov <barannikov88@gmail.com>
Wed, 15 Feb 2023 14:04:37 +0000 (17:04 +0300)
committerSergei Barannikov <barannikov88@gmail.com>
Thu, 16 Feb 2023 12:19:24 +0000 (15:19 +0300)
Reviewed By: cor3ntin

Differential Revision: https://reviews.llvm.org/D144100

clang/lib/Lex/LiteralSupport.cpp
clang/test/Lexer/char-escapes-delimited.c

index 421a853..38b68bd 100644 (file)
@@ -263,7 +263,8 @@ static unsigned ProcessCharEscape(const char *ThisTokBegin,
         ThisTokBuf++;
         continue;
       }
-      if (ResultChar & 0x020000000)
+      // Check if one of the top three bits is set before shifting them out.
+      if (ResultChar & 0xE0000000)
         Overflow = true;
 
       ResultChar <<= 3;
index 8e7094b..3b1deff 100644 (file)
@@ -58,6 +58,8 @@ void octal(void) {
 #if __WCHAR_MAX__ > 0xFFFF
   unsigned d = L'\o{37777777777}'; // ext-warning {{extension}} cxx2b-warning {{C++2b}}
   unsigned e = L'\o{40000000000}'; // expected-error {{octal escape sequence out of range}}
+  unsigned f = L'\o{100000000000}'; // expected-error {{octal escape sequence out of range}}
+  unsigned g = L'\o{200000000000}'; // expected-error {{octal escape sequence out of range}}
 #else
   unsigned d = L'\o{177777}'; // ext-warning {{extension}} cxx2b-warning {{C++2b}}
   unsigned e = L'\o{200000}'; // expected-error {{octal escape sequence out of range}}