diff --git a/aos/build/build.py b/aos/build/build.py
index 208b380..b54efe4 100755
--- a/aos/build/build.py
+++ b/aos/build/build.py
@@ -182,7 +182,7 @@
 
     def build_env(self):
       r = {}
-      if self.compiler == 'clang':
+      if self.compiler == 'clang' or self.compiler == 'gcc_4.8':
         r['LD_LIBRARY_PATH'] = '/opt/clang-3.5/lib64'
       if self.sanitizer == 'address':
         r['ASAN_SYMBOLIZER_PATH'] = '/opt/clang-3.5/bin/llvm-symbolizer'
@@ -191,12 +191,23 @@
         r['MSAN_SYMBOLIZER_PATH'] = '/opt/clang-3.5/bin/llvm-symbolizer'
       return r
 
-  ARCHITECTURES = ['arm', 'amd64']
-  COMPILERS = ['clang', 'gcc']
-  # TODO(brians): memory doesn't really work because we don't have everything
-  # instrumented. Print out a warning or something.
-  SANITIZERS = ['address', 'undefined', 'integer', 'memory', 'thread', 'none']
-  PIC_SANITIZERS = ['memory', 'thread']
+  ARCHITECTURES = ('arm', 'amd64')
+  COMPILERS = ('clang', 'gcc', 'gcc_4.8')
+  SANITIZERS = ('address', 'undefined', 'integer', 'memory', 'thread', 'none')
+  SANITIZER_TEST_WARNINGS = {
+      'memory': (True,
+"""We don't have all of the libraries instrumented which leads to lots of false
+errors with msan (especially stdlibc++).
+TODO(brians): Figure out a way to deal with it."""),
+      'undefined': (False,
+"""There are several warnings in other people's code that ubsan catches.
+The following have been verified non-interesting:
+    include/c++/4.8.2/array:*: runtime error: reference binding to null pointer of type 'int'
+      This happens with ::std::array<T, 0> and it doesn't seem to cause any issues.
+    output/downloaded/eigen-3.2.1/Eigen/src/Core/util/Memory.h:782:*: runtime error: load of misaligned address 0x* for type 'const int', which requires 4 byte alignment
+      That's in the CPUID detection code which only runs on x86."""),
+  }
+  PIC_SANITIZERS = ('memory', 'thread')
 
   def __init__(self, is_test, is_deploy):
     super(Processor, self).__init__()
@@ -205,16 +216,28 @@
     for architecture in PrimeProcessor.ARCHITECTURES:
       for compiler in PrimeProcessor.COMPILERS:
         for debug in [True, False]:
+          if architecture == 'arm' and compiler == 'gcc_4.8':
+            # We don't have a compiler to use here.
+            continue
           platforms.append(
               PrimeProcessor.Platform(architecture, compiler, debug, 'none'))
     for sanitizer in PrimeProcessor.SANITIZERS:
-      if sanitizer != 'none':
-        platforms.append(
-            PrimeProcessor.Platform('amd64', 'clang', True, sanitizer))
+      for compiler in ('gcc_4.8', 'clang'):
+        if compiler == 'gcc_4.8' and (sanitizer == 'undefined' or
+                                      sanitizer == 'integer' or
+                                      sanitizer == 'memory'):
+          # GCC 4.8 doesn't support these sanitizers.
+          continue
+        # We already added sanitizer == 'none' above.
+        if sanitizer != 'none':
+          platforms.append(
+              PrimeProcessor.Platform('amd64', compiler, True, sanitizer))
     self.platforms = frozenset(platforms)
     if is_test:
       self.default_platforms = self.select_platforms(architecture='amd64',
                                                      debug=True)
+      for sanitizer in PrimeProcessor.SANITIZER_TEST_WARNINGS:
+        self.default_platforms -= self.select_platforms(sanitizer=sanitizer)
     elif is_deploy:
       # TODO(brians): Switch to deploying the code built with clang.
       self.default_platforms = self.select_platforms(architecture='arm',
@@ -437,6 +460,23 @@
     build_env['PATH'] = os.environ['PATH']
     return build_env
 
+  to_build = []
+  for platform in platforms:
+    to_build.append(str(platform))
+  if len(to_build) > 1:
+    to_build[-1] = 'and ' + to_build[-1]
+  user_output('Building %s...' % ', '.join(to_build))
+
+  if args.action_name == 'tests':
+    for sanitizer, warning in PrimeProcessor.SANITIZER_TEST_WARNINGS.items():
+      warned_about = platforms & processor.select_platforms(sanitizer=sanitizer)
+      if warned_about:
+        user_output(warning[1])
+        if warning[0]:
+          # TODO(brians): Add a --force flag or something?
+          user_output('Refusing to run tests for sanitizer %s.' % sanitizer)
+          exit(1)
+
   num = 1
   for platform in platforms:
     user_output('Building %s (%d/%d)...' % (platform, num, len(platforms)))
@@ -456,7 +496,8 @@
              '-DOS=%s' % platform.os(),
              '-DPLATFORM=%s' % platform.gyp_platform(),
              '-DARCHITECTURE=%s' % platform.architecture,
-             '-DCOMPILER=%s' % platform.compiler,
+             '-DCOMPILER=%s' % platform.compiler.split('_')[0],
+             '-DFULL_COMPILER=%s' % platform.compiler,
              '-DDEBUG=%s' % ('yes' if platform.debug else 'no'),
              '-DSANITIZER=%s' % platform.sanitizer,
              '-DSANITIZER_FPIC=%s' % ('-fPIC'
@@ -480,9 +521,9 @@
               ('sed', '-i',
                's/nm -gD/nm/g', platform.build_ninja()),
               stdin=open(os.devnull, 'r'))
-        user_output('Done running gyp.')
+        user_output('Done running gyp')
       else:
-        user_output("Not running gyp.")
+        user_output("Not running gyp")
 
       try:
         subprocess.check_call(
