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

Daniil Kovalev via llvm-commits llvm-commits at lists.llvm.org
Sat Mar 2 01:46:46 PST 2024


https://github.com/kovdan01 created https://github.com/llvm/llvm-project/pull/83667

Reland #82595 with fixes of build failures related to colored output.
See https://lab.llvm.org/buildbot/#/builders/139/builds/60549
Force `-color=0` to avoid colored output if autodetect does not work properly.
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.

>From 9a1f4db3f9ccc92c7ad340c04bcabd55a9b1ac3d Mon Sep 17 00:00:00 2001
From: Daniil Kovalev <dkovalev at accesssoftek.com>
Date: Thu, 22 Feb 2024 10:33:55 +0300
Subject: [PATCH 1/5] [FileCheck] Fix parsing empty global and pseudo variable
 names

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.
---
 llvm/lib/FileCheck/FileCheck.cpp | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/llvm/lib/FileCheck/FileCheck.cpp b/llvm/lib/FileCheck/FileCheck.cpp
index 6d3a2b9cf46f7c..bb1855f599a1a3 100644
--- a/llvm/lib/FileCheck/FileCheck.cpp
+++ b/llvm/lib/FileCheck/FileCheck.cpp
@@ -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,
+                                StringRef("empty ") +
+                                    (IsPseudo ? "pseudo " : "global ") +
+                                    "variable name");
+
   if (!isValidVarNameStart(Str[I++]))
     return ErrorDiagnostic::get(SM, Str, "invalid variable name");
 

>From efd7bd8734ee517bf3e7f94bb04fed857c4c0fce Mon Sep 17 00:00:00 2001
From: Daniil Kovalev <dkovalev at accesssoftek.com>
Date: Thu, 22 Feb 2024 14:22:25 +0300
Subject: [PATCH 2/5] Add test cases

---
 llvm/test/FileCheck/empty-variable-name.txt | 32 +++++++++++++++++++++
 1 file changed, 32 insertions(+)
 create mode 100644 llvm/test/FileCheck/empty-variable-name.txt

diff --git a/llvm/test/FileCheck/empty-variable-name.txt b/llvm/test/FileCheck/empty-variable-name.txt
new file mode 100644
index 00000000000000..d4c32e0b167d4c
--- /dev/null
+++ b/llvm/test/FileCheck/empty-variable-name.txt
@@ -0,0 +1,32 @@
+a
+
+; RUN: 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: 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:20: error: empty pseudo variable name
+; CHECK-ERROR-PSEUDO-NEXT:; CHECK-PSEUDO: b{{\[\[@\]\]}}
+; CHECK-ERROR-PSEUDO-NEXT:                   ^
+
+c
+
+; RUN: 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:20: error: empty global variable name
+; CHECK-ERROR-GLOBAL-NEXT:; CHECK-GLOBAL: c{{\[\[\$\]\]}}
+; CHECK-ERROR-GLOBAL-NEXT:                   ^

>From 6974c787759218651f04a67c6e4bc5de76d80999 Mon Sep 17 00:00:00 2001
From: Daniil Kovalev <dkovalev at accesssoftek.com>
Date: Thu, 29 Feb 2024 01:09:49 +0300
Subject: [PATCH 3/5] Address review comments

---
 llvm/lib/FileCheck/FileCheck.cpp            |  2 +-
 llvm/test/FileCheck/empty-variable-name.txt | 10 +++++-----
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/llvm/lib/FileCheck/FileCheck.cpp b/llvm/lib/FileCheck/FileCheck.cpp
index bb1855f599a1a3..8f80a69c4abd3a 100644
--- a/llvm/lib/FileCheck/FileCheck.cpp
+++ b/llvm/lib/FileCheck/FileCheck.cpp
@@ -298,7 +298,7 @@ Pattern::parseVariable(StringRef &Str, const SourceMgr &SM) {
     ++I;
 
   if (I == Str.size())
-    return ErrorDiagnostic::get(SM, Str,
+    return ErrorDiagnostic::get(SM, Str.slice(I, StringRef::npos),
                                 StringRef("empty ") +
                                     (IsPseudo ? "pseudo " : "global ") +
                                     "variable name");
diff --git a/llvm/test/FileCheck/empty-variable-name.txt b/llvm/test/FileCheck/empty-variable-name.txt
index d4c32e0b167d4c..07f757e8b20614 100644
--- a/llvm/test/FileCheck/empty-variable-name.txt
+++ b/llvm/test/FileCheck/empty-variable-name.txt
@@ -7,7 +7,7 @@ a
 ; CHECK:        a[[]]
 ; CHECK-ERROR:[[DIR]]/empty-variable-name.txt:7:13: error: empty variable name
 ; CHECK-ERROR-NEXT:; CHECK: a{{\[\[\]\]}}
-; CHECK-ERROR-NEXT:            ^
+;      CHECK-ERROR-NEXT:            ^
 
 b
 
@@ -16,9 +16,9 @@ b
 ; RUN:   --match-full-lines --strict-whitespace %s
 
 ; CHECK-PSEUDO: b[[@]]
-; CHECK-ERROR-PSEUDO:[[DIR]]/empty-variable-name.txt:18:20: error: empty pseudo variable name
+; 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:                   ^
+;      CHECK-ERROR-PSEUDO-NEXT:                    ^
 
 c
 
@@ -27,6 +27,6 @@ c
 ; RUN:   --match-full-lines --strict-whitespace %s
 
 ; CHECK-GLOBAL: c[[$]]
-; CHECK-ERROR-GLOBAL:[[DIR]]/empty-variable-name.txt:29:20: error: empty global variable name
+; 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:                   ^
+;       CHECK-ERROR-GLOBAL-NEXT:                    ^

>From dedcf3485d114d5e06ab78f7a02e75d0905c641f Mon Sep 17 00:00:00 2001
From: Daniil Kovalev <dkovalev at accesssoftek.com>
Date: Thu, 29 Feb 2024 01:10:54 +0300
Subject: [PATCH 4/5] Allow backslashes as path separators; should fix tests on
 Windows

---
 llvm/test/FileCheck/empty-variable-name.txt | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/llvm/test/FileCheck/empty-variable-name.txt b/llvm/test/FileCheck/empty-variable-name.txt
index 07f757e8b20614..29c6317e6bb17e 100644
--- a/llvm/test/FileCheck/empty-variable-name.txt
+++ b/llvm/test/FileCheck/empty-variable-name.txt
@@ -5,7 +5,7 @@ a
 ; RUN:   --match-full-lines --strict-whitespace %s
 
 ; CHECK:        a[[]]
-; CHECK-ERROR:[[DIR]]/empty-variable-name.txt:7:13: error: empty variable name
+; CHECK-ERROR:[[DIR]]{{/|\\}}empty-variable-name.txt:7:13: error: empty variable name
 ; CHECK-ERROR-NEXT:; CHECK: a{{\[\[\]\]}}
 ;      CHECK-ERROR-NEXT:            ^
 
@@ -16,7 +16,7 @@ b
 ; 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:[[DIR]]{{/|\\}}empty-variable-name.txt:18:21: error: empty pseudo variable name
 ; CHECK-ERROR-PSEUDO-NEXT:; CHECK-PSEUDO: b{{\[\[@\]\]}}
 ;      CHECK-ERROR-PSEUDO-NEXT:                    ^
 
@@ -27,6 +27,6 @@ c
 ; 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:[[DIR]]{{/|\\}}empty-variable-name.txt:29:21: error: empty global variable name
 ; CHECK-ERROR-GLOBAL-NEXT:; CHECK-GLOBAL: c{{\[\[\$\]\]}}
 ;       CHECK-ERROR-GLOBAL-NEXT:                    ^

>From 90dec318373be4aab5c149541497edc7c7421eb8 Mon Sep 17 00:00:00 2001
From: Daniil Kovalev <dkovalev at accesssoftek.com>
Date: Sat, 2 Mar 2024 12:17:25 +0300
Subject: [PATCH 5/5] Force no color output in test

See build failure https://lab.llvm.org/buildbot/#/builders/139/builds/60549
---
 llvm/test/FileCheck/empty-variable-name.txt | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/llvm/test/FileCheck/empty-variable-name.txt b/llvm/test/FileCheck/empty-variable-name.txt
index 29c6317e6bb17e..44cdd2c0e677ba 100644
--- a/llvm/test/FileCheck/empty-variable-name.txt
+++ b/llvm/test/FileCheck/empty-variable-name.txt
@@ -1,6 +1,6 @@
 a
 
-; RUN: not FileCheck -input-file %s %s 2>&1 | \
+; RUN: not FileCheck -color=0 -input-file %s %s 2>&1 | \
 ; RUN:   FileCheck -check-prefix CHECK-ERROR -DDIR=%S \
 ; RUN:   --match-full-lines --strict-whitespace %s
 
@@ -11,7 +11,7 @@ a
 
 b
 
-; RUN: not FileCheck -input-file %s -check-prefix CHECK-PSEUDO %s 2>&1 | \
+; RUN: not FileCheck -color=0 -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
 
@@ -22,7 +22,7 @@ b
 
 c
 
-; RUN: not FileCheck -input-file %s -check-prefix CHECK-GLOBAL %s 2>&1 | \
+; RUN: not FileCheck -color=0 -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
 



More information about the llvm-commits mailing list