scons: Add Undefined Behavior Sanitizer (UBSan) option
authorAndreas Hansson <andreas.hansson@arm.com>
Thu, 16 Oct 2014 09:49:36 +0000 (05:49 -0400)
committerAndreas Hansson <andreas.hansson@arm.com>
Thu, 16 Oct 2014 09:49:36 +0000 (05:49 -0400)
This patch adds the Undefined Behavior Sanitizer (UBSan) for clang and
gcc >= 4.9. Due to the performance impact, the usage is guarded by a
command-line option.

SConstruct
src/SConscript

index 1d1b9571122f2430634b72d74a6652e82fe707d2..1078a3e9638c4a97d71a05017b896dc2f1c0b7fb 100755 (executable)
@@ -189,6 +189,8 @@ AddLocalOption('--without-python', dest='without_python',
 AddLocalOption('--without-tcmalloc', dest='without_tcmalloc',
                action='store_true',
                help='Disable linking against tcmalloc')
+AddLocalOption('--with-ubsan', dest='with_ubsan', action='store_true',
+               help='Build with Undefined Behavior Sanitizer if available')
 
 termcap = get_termcap(GetOption('use_colors'))
 
@@ -602,6 +604,15 @@ if main['GCC']:
                 'binutils to 2.23.' + \
                 termcap.Normal
 
+    # Make sure we warn if the user has requested to compile with the
+    # Undefined Benahvior Sanitizer and this version of gcc does not
+    # support it.
+    if GetOption('with_ubsan') and \
+            compareVersions(gcc_version, '4.9') < 0:
+        print termcap.Yellow + termcap.Bold + \
+            'Warning: UBSan is only supported using gcc 4.9 and later.' + \
+            termcap.Normal
+
     # Add the appropriate Link-Time Optimization (LTO) flags
     # unless LTO is explicitly turned off. Note that these flags
     # are only used by the fast target.
index 3737ef51bf699bf432cdd7cb6c54435824e6493d..ef729cb33ca008694ce4cc097b387f263d0bcf73 100755 (executable)
@@ -953,6 +953,15 @@ def makeEnv(env, label, objsfx, strip = False, **kwargs):
         if compareVersions(env['GCC_VERSION'], '4.7') >= 0:
             new_env.Append(CXXFLAGS='-Wdelete-non-virtual-dtor')
             swig_env.Append(CCFLAGS='-Wno-maybe-uninitialized')
+
+        # Only gcc >= 4.9 supports UBSan, so check both the version
+        # and the command-line option before adding the compiler and
+        # linker flags.
+        if GetOption('with_ubsan') and \
+                compareVersions(env['GCC_VERSION'], '4.9') >= 0:
+            new_env.Append(CCFLAGS='-fsanitize=undefined')
+            new_env.Append(LINKFLAGS='-fsanitize=undefined')
+
     if env['CLANG']:
         # Always enable the warning for deletion of derived classes
         # with non-virtual destructors
@@ -966,6 +975,12 @@ def makeEnv(env, label, objsfx, strip = False, **kwargs):
                 '-Wno-deprecated-register',
                 ])
 
+        # All supported clang versions have support for UBSan, so if
+        # asked to use it, append the compiler and linker flags.
+        if GetOption('with_ubsan'):
+            new_env.Append(CCFLAGS='-fsanitize=undefined')
+            new_env.Append(LINKFLAGS='-fsanitize=undefined')
+
     werror_env = new_env.Clone()
     werror_env.Append(CCFLAGS='-Werror')