Validate flatbuffers before printing in aos_dump, log_cat, and simulated_event_loop

We had a corrupted flatbuffer being logged, and the error was very poor
when it was being printed.  Let's try to catch this a lot earlier.

Fix 1: log_cat should validate before printing.  That'll prevent us
from wasting time debugging why it is crashing and point the finger a
lot better.

Fix 2: aos_dump should do the same.  That'll save us from nasty crashes
there too and focus attention a lot better.

Fix 3: SimulatedEventLoop sender Send should also validate in debug
mode.  This will avoid too big a performance hit in the fast path, but
will catch corrupted flatbuffers in any simulations we do, or any log
replay that gets done with debug turned on.

This caught a couple of places where we were missing schemas, so add
those in too.

Change-Id: I1873ddd592d33fe4e64210a2e08aa9b937d61ab8
Signed-off-by: Austin Schuh <austin.schuh@bluerivertech.com>
diff --git a/aos/events/logging/log_cat.cc b/aos/events/logging/log_cat.cc
index 2032f9f..3469674 100644
--- a/aos/events/logging/log_cat.cc
+++ b/aos/events/logging/log_cat.cc
@@ -44,6 +44,13 @@
                   const aos::Context &context,
                   aos::FastStringBuilder *builder) {
   builder->Reset();
+  CHECK(flatbuffers::Verify(*channel->schema(),
+                            *channel->schema()->root_table(),
+                            static_cast<const uint8_t *>(context.data),
+                            static_cast<size_t>(context.size)))
+      << ": Corrupted flatbuffer on " << channel->name()->c_str() << " "
+      << channel->type()->c_str();
+
   aos::FlatbufferToJson(
       builder, channel->schema(), static_cast<const uint8_t *>(context.data),
       {FLAGS_pretty, static_cast<size_t>(FLAGS_max_vector_size)});
@@ -111,6 +118,17 @@
       CHECK_LT(channel_index, channels->size());
       const aos::Channel *const channel = channels->Get(channel_index);
 
+      if (message.value().message().data() != nullptr) {
+        CHECK(channel->has_schema());
+
+        CHECK(flatbuffers::Verify(*channel->schema(),
+                                  *channel->schema()->root_table(),
+                                  message.value().message().data()->data(),
+                                  message.value().message().data()->size()))
+            << ": Corrupted flatbuffer on " << channel->name()->c_str() << " "
+            << channel->type()->c_str();
+      }
+
       if (FLAGS_format_raw && message.value().message().data() != nullptr) {
         std::cout << aos::configuration::StrippedChannelToString(channel) << " "
                   << aos::FlatbufferToJson(