[llvm] r188221 - [FileCheck] Fix a bug that cause FileCheck to misidentify check-prefix

Rui Ueyama ruiu at google.com
Mon Aug 12 16:06:00 PDT 2013


Author: ruiu
Date: Mon Aug 12 18:05:59 2013
New Revision: 188221

URL: http://llvm.org/viewvc/llvm-project?rev=188221&view=rev
Log:
[FileCheck] Fix a bug that cause FileCheck to misidentify check-prefix

FileCheck should check to make sure the prefix was found, and not a word
containing it (e.g -check-prefix=BASEREL shouldn't match NOBASEREL).

Patch by Ron Ofir.

Added:
    llvm/trunk/test/FileCheck/check-prefixes.txt
    llvm/trunk/test/FileCheck/validate-check-prefix.txt
Modified:
    llvm/trunk/utils/FileCheck/FileCheck.cpp

Added: llvm/trunk/test/FileCheck/check-prefixes.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/FileCheck/check-prefixes.txt?rev=188221&view=auto
==============================================================================
--- llvm/trunk/test/FileCheck/check-prefixes.txt (added)
+++ llvm/trunk/test/FileCheck/check-prefixes.txt Mon Aug 12 18:05:59 2013
@@ -0,0 +1,9 @@
+// RUN: FileCheck -check-prefix=ANOTHER-PREFIX -input-file %s %s
+// RUN: not FileCheck -check-prefix=PREFIX -input-file %s %s 2>&1 | FileCheck -check-prefix=CHECK-NONEXISTANT-PREFIX %s
+
+foobar
+; ANOTHER-PREFIX: foobar
+
+; We use regex to match the colon so that FileCheck won't think it is a check
+; prefix.
+; CHECK-NONEXISTANT-PREFIX: error: no check strings found with prefix 'PREFIX{{:}}'

Added: llvm/trunk/test/FileCheck/validate-check-prefix.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/FileCheck/validate-check-prefix.txt?rev=188221&view=auto
==============================================================================
--- llvm/trunk/test/FileCheck/validate-check-prefix.txt (added)
+++ llvm/trunk/test/FileCheck/validate-check-prefix.txt Mon Aug 12 18:05:59 2013
@@ -0,0 +1,7 @@
+// RUN: not FileCheck -check-prefix=A! -input-file %s %s 2>&1 | FileCheck -check-prefix=BAD_PREFIX %s
+// RUN: FileCheck -check-prefix=A1a-B_c -input-file %s %s
+
+foobar
+; A1a-B_c: foobar
+
+; BAD_PREFIX: Supplied check-prefix is invalid! Prefixes must start with a letter and contain only alphanumeric characters, hyphens and underscores

Modified: llvm/trunk/utils/FileCheck/FileCheck.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/FileCheck/FileCheck.cpp?rev=188221&r1=188220&r2=188221&view=diff
==============================================================================
--- llvm/trunk/utils/FileCheck/FileCheck.cpp (original)
+++ llvm/trunk/utils/FileCheck/FileCheck.cpp Mon Aug 12 18:05:59 2013
@@ -704,15 +704,26 @@ static bool ReadCheckFile(SourceMgr &SM,
 
     LineNumber += Buffer.substr(0, PrefixLoc).count('\n');
 
-    Buffer = Buffer.substr(PrefixLoc);
+    // Keep the charcter before our prefix so we can validate that we have
+    // found our prefix, and account for cases when PrefixLoc is 0.
+    Buffer = Buffer.substr(std::min(PrefixLoc-1, PrefixLoc));
 
-    const char *CheckPrefixStart = Buffer.data();
+    const char *CheckPrefixStart = Buffer.data() + (PrefixLoc == 0 ? 0 : 1);
 
     // When we find a check prefix, keep track of whether we find CHECK: or
     // CHECK-NEXT:
     bool IsCheckNext = false, IsCheckNot = false, IsCheckDag = false,
          IsCheckLabel = false;
 
+    // Make sure we have actually found our prefix, and not a word containing
+    // our prefix.
+    if (PrefixLoc != 0 && (isalnum(Buffer[0]) ||
+                           Buffer[0] == '-'   ||
+                           Buffer[0] == '_')) {
+      Buffer = Buffer.substr(CheckPrefix.size());
+      continue;
+    }
+
     // Verify that the : is present after the prefix.
     if (Buffer[CheckPrefix.size()] == ':') {
       Buffer = Buffer.substr(CheckPrefix.size()+1);
@@ -1026,11 +1037,24 @@ size_t CheckString::CheckDag(const Sourc
   return LastPos;
 }
 
+bool ValidateCheckPrefix() {
+  // The check prefix must contain only alphanumeric, hyphens and underscores.
+  Regex prefixValidator("^[a-zA-Z0-9_-]*$");
+  return prefixValidator.match(CheckPrefix);
+}
+
 int main(int argc, char **argv) {
   sys::PrintStackTraceOnErrorSignal();
   PrettyStackTraceProgram X(argc, argv);
   cl::ParseCommandLineOptions(argc, argv);
 
+  if (!ValidateCheckPrefix()) {
+    errs() << "Supplied check-prefix is invalid! Prefixes must start with a "
+              "letter and contain only alphanumeric characters, hyphens and "
+              "underscores\n";
+    return 2;
+  }
+
   SourceMgr SM;
 
   // Read the expected strings from the check file.





More information about the llvm-commits mailing list