diff options
author | Colin Cross <ccross@android.com> | 2017-06-16 18:03:51 (GMT) |
---|---|---|
committer | Colin Cross <ccross@android.com> | 2017-06-16 19:51:26 (GMT) |
commit | 11a934d427502f917dbbf47b088d9abde186c0a7 (patch) | |
tree | 5545135e808072f7f6a453264fb3c4d74c6fb210 /src/build_test.cc | |
parent | 00f69c17951fee353068c3905b4dd4d08322fdd3 (diff) | |
download | Ninja-11a934d427502f917dbbf47b088d9abde186c0a7.zip Ninja-11a934d427502f917dbbf47b088d9abde186c0a7.tar.gz Ninja-11a934d427502f917dbbf47b088d9abde186c0a7.tar.bz2 |
Fix segfault on edge with no inputs
PR #1281 added a deference of most_recent_input without checking
for NULL, which can occur if a build rule has no inputs.
Check it for null before dereferencing, and add a test.
Fixes #1290.
Diffstat (limited to 'src/build_test.cc')
-rw-r--r-- | src/build_test.cc | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/build_test.cc b/src/build_test.cc index 0eb9aaa..623ed14 100644 --- a/src/build_test.cc +++ b/src/build_test.cc @@ -1305,6 +1305,37 @@ TEST_F(BuildWithLogTest, RebuildAfterFailure) { EXPECT_EQ("", err); } +TEST_F(BuildWithLogTest, RebuildWithNoInputs) { + ASSERT_NO_FATAL_FAILURE(AssertParse(&state_, +"rule touch\n" +" command = touch\n" +"build out1: touch\n" +"build out2: touch in\n")); + + string err; + + fs_.Create("in", ""); + + EXPECT_TRUE(builder_.AddTarget("out1", &err)); + EXPECT_TRUE(builder_.AddTarget("out2", &err)); + EXPECT_TRUE(builder_.Build(&err)); + EXPECT_EQ("", err); + EXPECT_EQ(2u, command_runner_.commands_ran_.size()); + + command_runner_.commands_ran_.clear(); + state_.Reset(); + + fs_.Tick(); + + fs_.Create("in", ""); + + EXPECT_TRUE(builder_.AddTarget("out1", &err)); + EXPECT_TRUE(builder_.AddTarget("out2", &err)); + EXPECT_TRUE(builder_.Build(&err)); + EXPECT_EQ("", err); + EXPECT_EQ(1u, command_runner_.commands_ran_.size()); +} + TEST_F(BuildWithLogTest, RestatTest) { ASSERT_NO_FATAL_FAILURE(AssertParse(&state_, "rule true\n" |