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