From f35d5adea1cee8ce9141ad85a7e59d008c2e4d42 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Sat, 18 Aug 2018 15:32:46 -0600 Subject: [PATCH] Add --enable-ubsan This adds --enable-ubsan to gdb's configure. By default it is enabled in development mode, and disabled otherwise. This passes both -fsanitize=undefined and -fno-sanitize-recover=undefined to compilations, so that undefined behavior violations will be sure to cause test failures. gdb/ChangeLog 2018-10-03 Tom Tromey * README: Mention --enable-ubsan. * NEWS: Mention --enable-ubsan. * acinclude.m4: Include sanitize.m4. * configure: Rebuild. * configure.ac: Call AM_GDB_UBSAN. * sanitize.m4: New file. gdb/doc/ChangeLog 2018-10-03 Tom Tromey * gdb.texinfo (Configure Options): Document --enable-ubsan. --- gdb/ChangeLog | 9 +++++ gdb/NEWS | 10 +++++ gdb/README | 7 ++++ gdb/acinclude.m4 | 3 ++ gdb/configure | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++ gdb/configure.ac | 1 + gdb/doc/ChangeLog | 4 ++ gdb/doc/gdb.texinfo | 8 ++++ gdb/sanitize.m4 | 46 +++++++++++++++++++++++ 9 files changed, 193 insertions(+) create mode 100644 gdb/sanitize.m4 diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 8fd128a..57b85dc 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,14 @@ 2018-10-03 Tom Tromey + * README: Mention --enable-ubsan. + * NEWS: Mention --enable-ubsan. + * acinclude.m4: Include sanitize.m4. + * configure: Rebuild. + * configure.ac: Call AM_GDB_UBSAN. + * sanitize.m4: New file. + +2018-10-03 Tom Tromey + * expression.h (enum exp_opcode): Use uint8_t as base type. * expprint.c (op_name): Handle invalid opcodes. diff --git a/gdb/NEWS b/gdb/NEWS index 00adcd4..b409aa4 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -108,6 +108,16 @@ CSKY GNU/LINUX csky*-*-linux ** The gdb.Progspace type has a new 'objfiles' method, which returns the list of objfiles associated to that program space. +* Configure changes + +--enable-ubsan + + Enable or disable the undefined behavior sanitizer. Release + versions of GDB disable this by default if it is available, but + development versions enable it. Enabling this can cause a + performance penalty. The undefined behavior sanitizer was first + introduced in GCC 4.9. + *** Changes in GDB 8.2 * The 'set disassembler-options' command now supports specifying options diff --git a/gdb/README b/gdb/README index 5881be2..69ba0eb 100644 --- a/gdb/README +++ b/gdb/README @@ -538,6 +538,13 @@ more obscure GDB `configure' options are not listed here. the compiler, which will fail the compilation if the compiler outputs any warning messages. +`--enable-ubsan' + Enable the GCC undefined behavior sanitizer. By default this is + disabled in GDB releases, but enabled when building from git. + The undefined behavior sanitizer checks for C++ undefined + behavior. It has a performance cost, so if you are looking at + GDB's performance, you should disable it. + `configure' accepts other options, for compatibility with configuring other GNU tools recursively. diff --git a/gdb/acinclude.m4 b/gdb/acinclude.m4 index 3c2d010..52ba3f9 100644 --- a/gdb/acinclude.m4 +++ b/gdb/acinclude.m4 @@ -15,6 +15,9 @@ sinclude(transform.m4) # This gets AM_GDB_WARNINGS. sinclude(warning.m4) +# AM_GDB_UBSAN +sinclude(sanitize.m4) + dnl gdb/configure.in uses BFD_NEED_DECLARATION, so get its definition. sinclude(../bfd/bfd.m4) diff --git a/gdb/configure b/gdb/configure index 931e19d..0ba8014 100755 --- a/gdb/configure +++ b/gdb/configure @@ -886,6 +886,7 @@ with_system_gdbinit enable_werror enable_build_warnings enable_gdb_build_warnings +enable_ubsan with_lzma with_liblzma_prefix with_tcl @@ -1556,6 +1557,7 @@ Optional Features: --enable-gdb-build-warnings enable GDB specific build-time compiler warnings if gcc is used + --enable-ubsan enable undefined behavior sanitizer (auto/yes/no) --enable-sim link gdb with simulator --enable-gdbserver automatically build gdbserver (yes/no/auto, default is auto) @@ -2448,6 +2450,52 @@ $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_decl + +# ac_fn_cxx_try_link LINENO +# ------------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_link cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. @@ -15561,6 +15609,63 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu +# Check whether --enable-ubsan was given. +if test "${enable_ubsan+set}" = set; then : + enableval=$enable_ubsan; +else + enable_ubsan=auto +fi + +if test "x$enable_ubsan" = xauto; then + if $development; then + enable_ubsan=yes + fi +fi +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +if test "x$enable_ubsan" = xyes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -fsanitize=undefined is accepted" >&5 +$as_echo_n "checking whether -fsanitize=undefined is accepted... " >&6; } + saved_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -fsanitize=undefined -fno-sanitize-recover=undefined" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + enable_ubsan=yes +else + enable_ubsan=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CXXFLAGS="$saved_CXXFLAGS" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_ubsan" >&5 +$as_echo "$enable_ubsan" >&6; } + if test "x$enable_ubsan" = xyes; then + WARN_CFLAGS="$WARN_CFLAGS -fsanitize=undefined -fno-sanitize-recover=undefined" + CONFIG_LDFLAGS="$CONFIG_LDFLAGS -fsanitize=undefined" + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + # In the Cygwin environment, we need some additional flags. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cygwin" >&5 $as_echo_n "checking for cygwin... " >&6; } diff --git a/gdb/configure.ac b/gdb/configure.ac index 88f2fc4..dfb7c87 100644 --- a/gdb/configure.ac +++ b/gdb/configure.ac @@ -1838,6 +1838,7 @@ GDB_AC_WITH_DIR(SYSTEM_GDBINIT, system-gdbinit, []) AM_GDB_WARNINGS +AM_GDB_UBSAN # In the Cygwin environment, we need some additional flags. AC_CACHE_CHECK([for cygwin], gdb_cv_os_cygwin, diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index c26b8e6..99aefc2 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,7 @@ +2018-10-03 Tom Tromey + + * gdb.texinfo (Configure Options): Document --enable-ubsan. + 2018-10-02 John Darrington * gdb.texinfo (Remote Connection Commands): Describe diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index d37c9e4..5653bdc 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -35763,6 +35763,14 @@ compiler you are using. Treat compiler warnings as werrors. It adds the @code{-Werror} flag to the compiler, which will fail the compilation if the compiler outputs any warning messages. + +@item --enable-ubsan +Enable the GCC undefined behavior sanitizer. By default this is +disabled in @value{GDBN} releases, but enabled, when available, when +building from git. The undefined behavior sanitizer checks for +C@t{++} undefined behavior. It has a performance cost, so if you are +looking at @value{GDBN}'s performance, you should disable it. The +undefined behavior sanitizer was first introduced in GCC 4.9. @end table @node System-wide configuration diff --git a/gdb/sanitize.m4 b/gdb/sanitize.m4 new file mode 100644 index 0000000..76df44d --- /dev/null +++ b/gdb/sanitize.m4 @@ -0,0 +1,46 @@ +dnl Sanitization-related configure macro for GDB +dnl Copyright (C) 2018 Free Software Foundation, Inc. +dnl +dnl This file is part of GDB. +dnl +dnl This program is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 3 of the License, or +dnl (at your option) any later version. +dnl +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +dnl GNU General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this program. If not, see . + +AC_DEFUN([AM_GDB_UBSAN],[ +AC_ARG_ENABLE(ubsan, + AS_HELP_STRING([--enable-ubsan], + [enable undefined behavior sanitizer (auto/yes/no)]), + [],enable_ubsan=auto) +if test "x$enable_ubsan" = xauto; then + if $development; then + enable_ubsan=yes + fi +fi +AC_LANG_PUSH([C++]) +if test "x$enable_ubsan" = xyes; then + AC_MSG_CHECKING(whether -fsanitize=undefined is accepted) + saved_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -fsanitize=undefined -fno-sanitize-recover=undefined" + dnl A link check is required because it is possible to install gcc + dnl without libubsan, leading to link failures when compiling with + dnl -fsanitize=undefined. + AC_TRY_LINK([],[],enable_ubsan=yes,enable_ubsan=no) + CXXFLAGS="$saved_CXXFLAGS" + AC_MSG_RESULT($enable_ubsan) + if test "x$enable_ubsan" = xyes; then + WARN_CFLAGS="$WARN_CFLAGS -fsanitize=undefined -fno-sanitize-recover=undefined" + CONFIG_LDFLAGS="$CONFIG_LDFLAGS -fsanitize=undefined" + fi +fi +AC_LANG_POP([C++]) +]) -- 2.7.4