aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Neto <dneto@google.com>2019-08-26 14:15:44 -0400
committerDavid Neto <dneto@google.com>2019-08-26 14:41:25 -0400
commit6527fb25482ee16f0ae8c735d1d0c33f7d5f220a (patch)
treed58a7039f474073fcf1bbe32a958c55252f723c5
parent0eb6499adf7a4debb3cdc87f9c469b45f8d65b5a (diff)
downloadeffcee-6527fb25482ee16f0ae8c735d1d0c33f7d5f220a.tar.gz
Fail parsing checks if var def regexp is bad
e.g. bad pattern [[FOO:?]] The question mark is a quantifier that doesn't quantify anything. BUG=137632977
-rw-r--r--effcee/check.cc8
-rw-r--r--effcee/check_test.cc10
2 files changed, 17 insertions, 1 deletions
diff --git a/effcee/check.cc b/effcee/check.cc
index 08f7b7a..c078eff 100644
--- a/effcee/check.cc
+++ b/effcee/check.cc
@@ -188,6 +188,14 @@ std::pair<Result, Check::Parts> PartsForPattern(StringPiece pattern) {
StringPiece expression = var.substr(colon + 1, StringPiece::npos);
parts.emplace_back(
make_unique<Check::Part>(Type::VarDef, var, name, expression));
+ if (parts.back()->NumCapturingGroups() < 0) {
+ return std::make_pair(
+ Result(
+ Result::Status::BadRule,
+ std::string("invalid regex in variable definition for ") +
+ ToString(name) + ": " + ToString(expression)),
+ Check::Parts());
+ }
}
}
} else {
diff --git a/effcee/check_test.cc b/effcee/check_test.cc
index f7089ef..d5c118a 100644
--- a/effcee/check_test.cc
+++ b/effcee/check_test.cc
@@ -246,13 +246,21 @@ INSTANTIATE_TEST_SUITE_P(AllCheckTypes, ParseChecksTypeFailTest,
"FOO"}),
ValuesIn(AllCheckTypesAsPairs())));
-TEST(ParseChecks, BadRegexpFails) {
+TEST(ParseChecks, BadRegexpMatchTrailingSlashFails) {
const auto parsed = ParseChecks("CHECK: {{\\}}", Options());
EXPECT_THAT(parsed.first.status(), Eq(Status::BadRule));
EXPECT_THAT(parsed.first.message(), HasSubstr("invalid regex: \\"));
EXPECT_THAT(parsed.second, Eq(CheckList({})));
}
+TEST(ParseChecks, BadRegexpVardefUnboundOptionalFails) {
+ const auto parsed = ParseChecks("CHECK: [[VAR:?]]", Options());
+ EXPECT_THAT(parsed.first.status(), Eq(Status::BadRule));
+ EXPECT_THAT(parsed.first.message(),
+ HasSubstr("invalid regex in variable definition for VAR: ?"));
+ EXPECT_THAT(parsed.second, Eq(CheckList({})));
+}
+
TEST(ParseChecks, CheckSameCantBeFirst) {
const auto parsed = ParseChecks("CHECK-SAME: now", Options());
EXPECT_THAT(parsed.first.status(), Eq(Status::BadRule));