diff -r db46a530e275 -r 5f204d1cb62f SConstruct --- a/SConstruct Mon Sep 22 14:37:23 2014 -0500 +++ b/SConstruct Mon Sep 29 11:37:28 2014 +0100 @@ -189,6 +189,8 @@ 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 @@ '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. diff -r db46a530e275 -r 5f204d1cb62f src/SConscript --- a/src/SConscript Mon Sep 22 14:37:23 2014 -0500 +++ b/src/SConscript Mon Sep 29 11:37:28 2014 +0100 @@ -956,6 +956,15 @@ 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 @@ -969,6 +978,12 @@ '-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')