summaryrefslogtreecommitdiff
path: root/utils/FileCheck
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2013-08-12 23:05:59 +0000
committerRui Ueyama <ruiu@google.com>2013-08-12 23:05:59 +0000
commitd9a84efe44db2f4d983e49bc7370fc8cef449214 (patch)
treea660f92e51db1c5a2da44f523fe66fd5ab4843e3 /utils/FileCheck
parentd3d5e6d8eb8f4bbb26decb582f0730600ed8a53d (diff)
downloadllvm-d9a84efe44db2f4d983e49bc7370fc8cef449214.tar.gz
llvm-d9a84efe44db2f4d983e49bc7370fc8cef449214.tar.bz2
llvm-d9a84efe44db2f4d983e49bc7370fc8cef449214.tar.xz
[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
Diffstat (limited to 'utils/FileCheck')
-rw-r--r--utils/FileCheck/FileCheck.cpp28
1 files changed, 26 insertions, 2 deletions
diff --git a/utils/FileCheck/FileCheck.cpp b/utils/FileCheck/FileCheck.cpp
index 8d5af58909..82e80574d2 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.