have MakeWithBuilder zero everything first
A lot of time has been spent debugging bugs because this doesn't happen,
and I just found a whole bunch more of them scattered throughout all the
control loop tests. It's not worth it to keep dealing with this issue.
diff --git a/aos/common/queue.h b/aos/common/queue.h
index da2a180..474df2f 100644
--- a/aos/common/queue.h
+++ b/aos/common/queue.h
@@ -234,6 +234,7 @@
ScopedMessagePtr<T> MakeMessage();
// Returns a message builder that contains a pre-allocated message.
+ // This message will start out completely zeroed.
aos::MessageBuilder<T> MakeWithBuilder();
const char *name() const { return queue_name_; }
diff --git a/aos/common/queue_test.cc b/aos/common/queue_test.cc
index 36522f9..124fa0e 100644
--- a/aos/common/queue_test.cc
+++ b/aos/common/queue_test.cc
@@ -78,6 +78,17 @@
EXPECT_EQ(true, my_test_queue.IsNewerThanMS(10000));
}
+// Makes sure that MakeWithBuilder zeros the message initially.
+// This might randomly succeed sometimes, but it will fail with asan if it
+// doesn't.
+TEST_F(QueueTest, BuilderZero) {
+ my_test_queue.MakeWithBuilder().Send();
+
+ ASSERT_TRUE(my_test_queue.FetchLatest());
+ EXPECT_FALSE(my_test_queue->test_bool);
+ EXPECT_EQ(0, my_test_queue->test_int);
+}
+
// Tests that various pointer deref functions at least seem to work.
TEST_F(QueueTest, PointerDeref) {
my_test_queue.MakeWithBuilder().test_bool(true).test_int(0x971).Send();
diff --git a/aos/linux_code/queue-tmpl.h b/aos/linux_code/queue-tmpl.h
index 719af5d..25eb8d9 100644
--- a/aos/linux_code/queue-tmpl.h
+++ b/aos/linux_code/queue-tmpl.h
@@ -108,7 +108,9 @@
template <class T>
aos::MessageBuilder<T> Queue<T>::MakeWithBuilder() {
Init();
- return aos::MessageBuilder<T>(queue_, MakeRawMessage());
+ T *const ret = MakeRawMessage();
+ ret->Zero();
+ return aos::MessageBuilder<T>(queue_, ret);
}
} // namespace aos