scons: fix sanitizer flags with multiple sanitizers
authorJoe Gross <joseph.gross@amd.com>
Mon, 28 Nov 2016 17:44:54 +0000 (12:44 -0500)
committerJoe Gross <joseph.gross@amd.com>
Mon, 28 Nov 2016 17:44:54 +0000 (12:44 -0500)
There has been some problem when using address and undefined-behavior
sanitizers at the same time. This patch will look for the special case
where both are enabled at once and change the flags passed to the compiler
to reflect this.

src/SConscript

index 02b3c28d4a408c0c102800fd363ced43c1d2857a..115ce24ebe0b21b0a521ddaa771f65b4d4c68be3 100755 (executable)
@@ -1085,19 +1085,26 @@ def makeEnv(env, label, objsfx, strip = False, **kwargs):
                                  '-Wno-maybe-uninitialized',
                                  '-Wno-type-limits'])
 
+
+        # The address sanitizer is available for gcc >= 4.8
+        if GetOption('with_asan'):
+            if GetOption('with_ubsan') and \
+                    compareVersions(env['GCC_VERSION'], '4.9') >= 0:
+                new_env.Append(CCFLAGS=['-fsanitize=address,undefined',
+                                        '-fno-omit-frame-pointer'])
+                new_env.Append(LINKFLAGS='-fsanitize=address,undefined')
+            else:
+                new_env.Append(CCFLAGS=['-fsanitize=address',
+                                        '-fno-omit-frame-pointer'])
+                new_env.Append(LINKFLAGS='-fsanitize=address')
         # 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 \
+        elif GetOption('with_ubsan') and \
                 compareVersions(env['GCC_VERSION'], '4.9') >= 0:
             new_env.Append(CCFLAGS='-fsanitize=undefined')
             new_env.Append(LINKFLAGS='-fsanitize=undefined')
 
-        # The address sanitizer is available for gcc >= 4.8
-        if GetOption('with_asan'):
-            new_env.Append(CCFLAGS=['-fsanitize=address',
-                                    '-fno-omit-frame-pointer'])
-            new_env.Append(LINKFLAGS='-fsanitize=address')
 
     if env['CLANG']:
         swig_env.Append(CCFLAGS=['-Wno-sometimes-uninitialized',
@@ -1107,10 +1114,15 @@ def makeEnv(env, label, objsfx, strip = False, **kwargs):
         # We require clang >= 3.1, so there is no need to check any
         # versions here.
         if GetOption('with_ubsan'):
-            new_env.Append(CCFLAGS='-fsanitize=undefined')
-            new_env.Append(LINKFLAGS='-fsanitize=undefined')
+            if GetOption('with_asan'):
+                new_env.Append(CCFLAGS=['-fsanitize=address,undefined',
+                                        '-fno-omit-frame-pointer'])
+                new_env.Append(LINKFLAGS='-fsanitize=address,undefined')
+            else:
+                new_env.Append(CCFLAGS='-fsanitize=undefined')
+                new_env.Append(LINKFLAGS='-fsanitize=undefined')
 
-        if GetOption('with_asan'):
+        elif GetOption('with_asan'):
             new_env.Append(CCFLAGS=['-fsanitize=address',
                                     '-fno-omit-frame-pointer'])
             new_env.Append(LINKFLAGS='-fsanitize=address')