Fix crash in invalid scope subscript access
When accessing a missing scope member through the string subscript
syntax (scope["member"]) the error check didn't actually return
resulting in a NULL dereference. This fixes that and adds tests.
It also fixes some of the parse tree unit tests which weren't correctly
resetting their error values.
Bug: 209
Change-Id: Ida1415b63ce1bca1d479c732126d5336eec13fc9
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/10860
Reviewed-by: Brett Wilson <brettw@chromium.org>
Commit-Queue: Brett Wilson <brettw@chromium.org>
diff --git a/src/gn/parse_tree.cc b/src/gn/parse_tree.cc
index 74bc2af..9ab28b5 100644
--- a/src/gn/parse_tree.cc
+++ b/src/gn/parse_tree.cc
@@ -393,6 +393,7 @@
*err =
Err(subscript_.get(), "No value named \"" + key_value.string_value() +
"\" in scope \"" + base_.value() + "\"");
+ return Value();
}
return *result;
}
diff --git a/src/gn/parse_tree_unittest.cc b/src/gn/parse_tree_unittest.cc
index e366b54..ed28b54 100644
--- a/src/gn/parse_tree_unittest.cc
+++ b/src/gn/parse_tree_unittest.cc
@@ -34,6 +34,7 @@
Err err;
Value result = accessor.Execute(setup.scope(), &err);
EXPECT_TRUE(err.has_error());
+ err = Err();
EXPECT_EQ(Value::NONE, result.type());
// Define a as a Scope. It should still fail because b isn't defined.
@@ -94,11 +95,18 @@
Value invalid1 = setup.ExecuteExpression("scope[second_element_idx]", &err);
EXPECT_TRUE(err.has_error());
+ err = Err();
EXPECT_EQ(invalid1.type(), Value::NONE);
Value invalid2 = setup.ExecuteExpression("list[bar_key]", &err);
EXPECT_TRUE(err.has_error());
+ err = Err();
EXPECT_EQ(invalid2.type(), Value::NONE);
+
+ Value invalid3 = setup.ExecuteExpression("scope[\"baz\"]", &err);
+ EXPECT_TRUE(err.has_error());
+ err = Err();
+ EXPECT_EQ(invalid3.type(), Value::NONE);
}
TEST(ParseTree, BlockUnusedVars) {