From d9a84efe44db2f4d983e49bc7370fc8cef449214 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Mon, 12 Aug 2013 23:05:59 +0000 Subject: [PATCH] [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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188221 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/FileCheck/check-prefixes.txt | 9 ++++++++ test/FileCheck/validate-check-prefix.txt | 7 ++++++ utils/FileCheck/FileCheck.cpp | 28 ++++++++++++++++++++++-- 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 test/FileCheck/check-prefixes.txt create mode 100644 test/FileCheck/validate-check-prefix.txt diff --git a/test/FileCheck/check-prefixes.txt b/test/FileCheck/check-prefixes.txt new file mode 100644 index 00000000000..a8af29d60b3 --- /dev/null +++ b/test/FileCheck/check-prefixes.txt @@ -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{{:}}' diff --git a/test/FileCheck/validate-check-prefix.txt b/test/FileCheck/validate-check-prefix.txt new file mode 100644 index 00000000000..fe219a319cd --- /dev/null +++ b/test/FileCheck/validate-check-prefix.txt @@ -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 diff --git a/utils/FileCheck/FileCheck.cpp b/utils/FileCheck/FileCheck.cpp index 8d5af589092..82e80574d27 100644 --- a/utils/FileCheck/FileCheck.cpp +++ b/utils/FileCheck/FileCheck.cpp @@ -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 SourceMgr &SM, StringRef Buffer, 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.