[FileCheck] Fix parsing empty global and pseudo variable names (#83667)

Reland #82595 with fixes of build failures related to colored output.
See https://lab.llvm.org/buildbot/#/builders/139/builds/60549
Use `%ProtectFileCheckOutput` to avoid colored output.
Original commit message below.

In `Pattern::parseVariable`, for global variables (those starting with '$')
and for pseudo variables (those starting with '@') the first character is
consumed before actual variable name parsing. If the name is empty, it
leads to out-of-bound access to the corresponding `StringRef`.

This patch adds an if statement against the case described.
This commit is contained in:
Daniil Kovalev 2024-03-05 11:20:16 +03:00 committed by GitHub
parent 0e337c67c8
commit 3105cfe783
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 38 additions and 0 deletions

View File

@ -297,6 +297,12 @@ Pattern::parseVariable(StringRef &Str, const SourceMgr &SM) {
if (Str[0] == '$' || IsPseudo)
++I;
if (I == Str.size())
return ErrorDiagnostic::get(SM, Str.slice(I, StringRef::npos),
StringRef("empty ") +
(IsPseudo ? "pseudo " : "global ") +
"variable name");
if (!isValidVarNameStart(Str[I++]))
return ErrorDiagnostic::get(SM, Str, "invalid variable name");

View File

@ -0,0 +1,32 @@
a
; RUN: %ProtectFileCheckOutput not FileCheck -input-file %s %s 2>&1 | \
; RUN: FileCheck -check-prefix CHECK-ERROR -DDIR=%S \
; RUN: --match-full-lines --strict-whitespace %s
; CHECK: a[[]]
; CHECK-ERROR:[[DIR]]{{/|\\}}empty-variable-name.txt:7:13: error: empty variable name
; CHECK-ERROR-NEXT:; CHECK: a{{\[\[\]\]}}
; CHECK-ERROR-NEXT: ^
b
; RUN: %ProtectFileCheckOutput not FileCheck -input-file %s -check-prefix CHECK-PSEUDO %s 2>&1 | \
; RUN: FileCheck -check-prefix CHECK-ERROR-PSEUDO -DDIR=%S \
; RUN: --match-full-lines --strict-whitespace %s
; CHECK-PSEUDO: b[[@]]
; CHECK-ERROR-PSEUDO:[[DIR]]{{/|\\}}empty-variable-name.txt:18:21: error: empty pseudo variable name
; CHECK-ERROR-PSEUDO-NEXT:; CHECK-PSEUDO: b{{\[\[@\]\]}}
; CHECK-ERROR-PSEUDO-NEXT: ^
c
; RUN: %ProtectFileCheckOutput not FileCheck -input-file %s -check-prefix CHECK-GLOBAL %s 2>&1 | \
; RUN: FileCheck -check-prefix CHECK-ERROR-GLOBAL -DDIR=%S \
; RUN: --match-full-lines --strict-whitespace %s
; CHECK-GLOBAL: c[[$]]
; CHECK-ERROR-GLOBAL:[[DIR]]{{/|\\}}empty-variable-name.txt:29:21: error: empty global variable name
; CHECK-ERROR-GLOBAL-NEXT:; CHECK-GLOBAL: c{{\[\[\$\]\]}}
; CHECK-ERROR-GLOBAL-NEXT: ^