[vlc-devel] [PATCH] configure: add a with-sanitizer switch

Shaleen Jain shaleen.jain95 at gmail.com
Mon Aug 14 13:19:33 CEST 2017


On Mon, 2017-08-14 at 13:00 +0300, Rémi Denis-Courmont wrote:
> Le 14 août 2017 12:48:03 GMT+03:00, Shaleen Jain <shaleen.jain95 at gmai
> l.com> a écrit :
> > Add an option to compile with a set of the
> > recommended flags for the various santizers.
> > 
> > Use AX_APPEND_COMPILE_FLAGS to maintain compatibility
> > with previous versions of gcc and clang where only a
> > subset of the flags are supported.
> > 
> > This patch also disables no-undefined-symbols(-Wl,-z,defs)
> > only when this switch is used, to avoid link errors, mainly with
> > asan.
> > ---
> >  configure.ac                  | 29 ++++++++++++++++-
> >  m4/ax_append_compile_flags.m4 | 68
> > +++++++++++++++++++++++++++++++++++++++
> >  m4/ax_append_flag.m4          | 72
> > +++++++++++++++++++++++++++++++++++++++++
> >  m4/ax_check_compile_flag.m4   | 75
> > +++++++++++++++++++++++++++++++++++++++++++
> >  m4/ax_require_defined.m4      | 38 ++++++++++++++++++++++
> >  5 files changed, 281 insertions(+), 1 deletion(-)
> >  create mode 100644 m4/ax_append_compile_flags.m4
> >  create mode 100644 m4/ax_append_flag.m4
> >  create mode 100644 m4/ax_check_compile_flag.m4
> >  create mode 100644 m4/ax_require_defined.m4
> > 
> > diff --git a/configure.ac b/configure.ac
> > index 8487fea895..b3eebc4d08 100644
> > --- a/configure.ac
> > +++ b/configure.ac
> > @@ -1015,6 +1015,33 @@ AS_IF([test "${SYS}" != "mingw32" -a
> > "${SYS}" != "os2"], [
> >    AS_IF([test "${ac_cv_c_visibility_hidden}" = "no"],
> > [VLC_RESTORE_FLAGS])
> >  ])
> >  
> > +dnl
> > +dnl  Sanitizer flags
> > +dnl
> > +AC_ARG_WITH([sanitizer],
> > +    [AS_HELP_STRING([--with-
> > sanitizer=(address/memory/undefined/thread)],
> > +        [build with sanitizer flags (default disabled)])],
> > +     [],
> > +     [with_sanitizer=no])
> > +
> > +AS_VAR_IF(with_sanitizer, no, [], [
> > +    AX_CHECK_COMPILE_FLAG([-fsanitize=${with_sanitizer}], [
> > +        AX_APPEND_FLAG([-
> > fsanitize=${with_sanitizer}])                       
> > +    ], [
> > +        AC_MSG_ERROR(["-fsanitize=${with_sanitizer} not
> > supported!"])
> > +    ])
> > +    AX_APPEND_FLAG([-g])
> > +
> > +    AS_VAR_IF(with_sanitizer, address, [
> > +       AX_APPEND_COMPILE_FLAGS([-fsanitize-address-use-after-scope 
> > -fno-omit-frame-pointer])
> > +    ])
> > +    AS_VAR_IF(with_sanitizer, memory, [
> > +        AX_APPEND_COMPILE_FLAGS([-fPIE -pie])
> > +    ])
> > +    AS_VAR_IF(with_sanitizer, thread, [
> > +        AX_APPEND_COMPILE_FLAGS([-fPIE -pie])
> > +    ])
> > +])
> >  
> >  dnl
> >  dnl  Enable/disable optimizations
> > @@ -1115,7 +1142,7 @@ AC_CACHE_CHECK([if linker supports -z,defs],
> > [ac_cv_ld_z_defs], [
> >      ac_cv_ld_z_defs="no"
> >    ])
> >  ])
> > -AS_IF([test "${ac_cv_ld_z_defs}" = "no"], [VLC_RESTORE_FLAGS])
> > +AS_IF([test "${ac_cv_ld_z_defs}" = "no" -o "x$with_sanitizer" !=
> > xno], [VLC_RESTORE_FLAGS])
> >  
> >  dnl Check for __attribute__((packed))
> >  AC_CACHE_CHECK([for __attribute__((packed))],
> > diff --git a/m4/ax_append_compile_flags.m4
> > b/m4/ax_append_compile_flags.m4
> > new file mode 100644
> > index 0000000000..56627670d0
> > --- /dev/null
> > +++ b/m4/ax_append_compile_flags.m4
> > @@ -0,0 +1,68 @@
> > +#
> > 
> > +#  https://www.gnu.org/software/autoconf-archive/ax_append_compile
> > _flags.html
> > +#
> > 
> > +#
> > +# SYNOPSIS
> > +#
> > +#   AX_APPEND_COMPILE_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE],
> > [EXTRA-FLAGS], [INPUT])
> > +#
> > +# DESCRIPTION
> > +#
> > +#   For every FLAG1, FLAG2 it is checked whether the compiler
> > works with the
> > +#   flag.  If it does, the flag is added FLAGS-VARIABLE
> > +#
> > +#   If FLAGS-VARIABLE is not specified, the current language's
> > flags (e.g.
> > +#   CFLAGS) is used.  During the check the flag is always added to
> > the
> > +#   current language's flags.
> > +#
> > +#   If EXTRA-FLAGS is defined, it is added to the current
> > language's default
> > +#   flags (e.g. CFLAGS) when the check is done.  The check is thus
> > made with
> > +#   the flags: "CFLAGS EXTRA-FLAGS FLAG".  This can for example be
> > used to
> > +#   force the compiler to issue an error when a bad flag is given.
> > +#
> > +#   INPUT gives an alternative input source to AC_COMPILE_IFELSE.
> > +#
> > +#   NOTE: This macro depends on the AX_APPEND_FLAG and
> > +#   AX_CHECK_COMPILE_FLAG. Please keep this macro in sync with
> > +#   AX_APPEND_LINK_FLAGS.
> > +#
> > +# LICENSE
> > +#
> > +#   Copyright (c) 2011 Maarten Bosmans <mkbosmans at gmail.com>
> > +#
> > +#   This program is free software: you can redistribute it and/or
> > modify it
> > +#   under the terms of the GNU General Public License as published
> > by the
> > +#   Free Software Foundation, either version 3 of the License, or
> > (at your
> > +#   option) any later version.
> > +#
> > +#   This program is distributed in the hope that it will be
> > useful, but
> > +#   WITHOUT ANY WARRANTY; without even the implied warranty of
> > +#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> > GNU General
> > +#   Public License for more details.
> > +#
> > +#   You should have received a copy of the GNU General Public
> > License along
> > +#   with this program. If not, see <https://www.gnu.org/licenses/>
> > .
> > +#
> > +#   As a special exception, the respective Autoconf Macro's
> > copyright owner
> > +#   gives unlimited permission to copy, distribute and modify the
> > configure
> > +#   scripts that are the output of Autoconf when processing the
> > Macro. You
> > +#   need not follow the terms of the GNU General Public License
> > when using
> > +#   or distributing such scripts, even though portions of the text
> > of the
> > +#   Macro appear in them. The GNU General Public License (GPL)
> > does govern
> > +#   all other use of the material that constitutes the Autoconf
> > Macro.
> > +#
> > +#   This special exception to the GPL applies to versions of the
> > Autoconf
> > +#   Macro released by the Autoconf Archive. When you make and
> > distribute a
> > +#   modified version of the Autoconf Macro, you may extend this
> > special
> > +#   exception to the GPL to apply to your modified version as
> > well.
> > +
> > +#serial 6
> > +
> > +AC_DEFUN([AX_APPEND_COMPILE_FLAGS],
> > +[AX_REQUIRE_DEFINED([AX_CHECK_COMPILE_FLAG])
> > +AX_REQUIRE_DEFINED([AX_APPEND_FLAG])
> > +for flag in $1; do
> > +  AX_CHECK_COMPILE_FLAG([$flag], [AX_APPEND_FLAG([$flag], [$2])],
> > [], [$3], [$4])
> > +done
> > +])dnl AX_APPEND_COMPILE_FLAGS
> > +
> > diff --git a/m4/ax_append_flag.m4 b/m4/ax_append_flag.m4
> > new file mode 100644
> > index 0000000000..7d3f840b84
> > --- /dev/null
> > +++ b/m4/ax_append_flag.m4
> > @@ -0,0 +1,72 @@
> > +#
> > 
> > +#      https://www.gnu.org/software/autoconf-archive/ax_append_fla
> > g.html
> > +#
> > 
> > +#
> > +# SYNOPSIS
> > +#
> > +#   AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE])
> > +#
> > +# DESCRIPTION
> > +#
> > +#   FLAG is appended to the FLAGS-VARIABLE shell variable, with a
> > space
> > +#   added in between.
> > +#
> > +#   If FLAGS-VARIABLE is not specified, the current language's
> > flags (e.g.
> > +#   CFLAGS) is used.  FLAGS-VARIABLE is not changed if it already
> > contains
> > +#   FLAG.  If FLAGS-VARIABLE is unset in the shell, it is set to
> > exactly
> > +#   FLAG.
> > +#
> > +#   NOTE: Implementation based on AX_CFLAGS_GCC_OPTION.
> > +#
> > +# LICENSE
> > +#
> > +#   Copyright (c) 2008 Guido U. Draheim <guidod at gmx.de>
> > +#   Copyright (c) 2011 Maarten Bosmans <mkbosmans at gmail.com>
> > +#
> > +#   This program is free software: you can redistribute it and/or
> > modify it
> > +#   under the terms of the GNU General Public License as published
> > by the
> > +#   Free Software Foundation, either version 3 of the License, or
> > (at your
> > +#   option) any later version.
> > +#
> > +#   This program is distributed in the hope that it will be
> > useful, but
> > +#   WITHOUT ANY WARRANTY; without even the implied warranty of
> > +#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> > GNU General
> > +#   Public License for more details.
> > +#
> > +#   You should have received a copy of the GNU General Public
> > License along
> > +#   with this program. If not, see <https://www.gnu.org/licenses/>
> > .
> > +#
> > +#   As a special exception, the respective Autoconf Macro's
> > copyright owner
> > +#   gives unlimited permission to copy, distribute and modify the
> > configure
> > +#   scripts that are the output of Autoconf when processing the
> > Macro. You
> > +#   need not follow the terms of the GNU General Public License
> > when using
> > +#   or distributing such scripts, even though portions of the text
> > of the
> > +#   Macro appear in them. The GNU General Public License (GPL)
> > does govern
> > +#   all other use of the material that constitutes the Autoconf
> > Macro.
> > +#
> > +#   This special exception to the GPL applies to versions of the
> > Autoconf
> > +#   Macro released by the Autoconf Archive. When you make and
> > distribute a
> > +#   modified version of the Autoconf Macro, you may extend this
> > special
> > +#   exception to the GPL to apply to your modified version as
> > well.
> > +
> > +#serial 7
> > +
> > +AC_DEFUN([AX_APPEND_FLAG],
> > +[dnl
> > +AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_SET_IF
> > +AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])])
> > +AS_VAR_SET_IF(FLAGS,[
> > +  AS_CASE([" AS_VAR_GET(FLAGS) "],
> > +    [*" $1 "*], [AC_RUN_LOG([: FLAGS already contains $1])],
> > +    [
> > +     AS_VAR_APPEND(FLAGS,[" $1"])
> > +     AC_RUN_LOG([: FLAGS="$FLAGS"])
> > +    ])
> > +  ],
> > +  [
> > +  AS_VAR_SET(FLAGS,[$1])
> > +  AC_RUN_LOG([: FLAGS="$FLAGS"])
> > +  ])
> > +AS_VAR_POPDEF([FLAGS])dnl
> > +])dnl AX_APPEND_FLAG
> > +
> > diff --git a/m4/ax_check_compile_flag.m4
> > b/m4/ax_check_compile_flag.m4
> > new file mode 100644
> > index 0000000000..80c79114e9
> > --- /dev/null
> > +++ b/m4/ax_check_compile_flag.m4
> > @@ -0,0 +1,75 @@
> > +#
> > 
> > +#  https://www.gnu.org/software/autoconf-archive/ax_check_compile_
> > flag.html
> > +#
> > 
> > +#
> > +# SYNOPSIS
> > +#
> > +#   AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-
> > FAILURE], [EXTRA-FLAGS], [INPUT])
> > +#
> > +# DESCRIPTION
> > +#
> > +#   Check whether the given FLAG works with the current language's
> > compiler
> > +#   or gives an error.  (Warnings, however, are ignored)
> > +#
> > +#   ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
> > +#   success/failure.
> > +#
> > +#   If EXTRA-FLAGS is defined, it is added to the current
> > language's default
> > +#   flags (e.g. CFLAGS) when the check is done.  The check is thus
> > made with
> > +#   the flags: "CFLAGS EXTRA-FLAGS FLAG".  This can for example be
> > used to
> > +#   force the compiler to issue an error when a bad flag is given.
> > +#
> > +#   INPUT gives an alternative input source to AC_COMPILE_IFELSE.
> > +#
> > +#   NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please
> > keep this
> > +#   macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG.
> > +#
> > +# LICENSE
> > +#
> > +#   Copyright (c) 2008 Guido U. Draheim <guidod at gmx.de>
> > +#   Copyright (c) 2011 Maarten Bosmans <mkbosmans at gmail.com>
> > +#
> > +#   This program is free software: you can redistribute it and/or
> > modify it
> > +#   under the terms of the GNU General Public License as published
> > by the
> > +#   Free Software Foundation, either version 3 of the License, or
> > (at your
> > +#   option) any later version.
> > +#
> > +#   This program is distributed in the hope that it will be
> > useful, but
> > +#   WITHOUT ANY WARRANTY; without even the implied warranty of
> > +#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> > GNU General
> > +#   Public License for more details.
> > +#
> > +#   You should have received a copy of the GNU General Public
> > License along
> > +#   with this program. If not, see <https://www.gnu.org/licenses/>
> > .
> > +#
> > +#   As a special exception, the respective Autoconf Macro's
> > copyright owner
> > +#   gives unlimited permission to copy, distribute and modify the
> > configure
> > +#   scripts that are the output of Autoconf when processing the
> > Macro. You
> > +#   need not follow the terms of the GNU General Public License
> > when using
> > +#   or distributing such scripts, even though portions of the text
> > of the
> > +#   Macro appear in them. The GNU General Public License (GPL)
> > does govern
> > +#   all other use of the material that constitutes the Autoconf
> > Macro.
> > +#
> > +#   This special exception to the GPL applies to versions of the
> > Autoconf
> > +#   Macro released by the Autoconf Archive. When you make and
> > distribute a
> > +#   modified version of the Autoconf Macro, you may extend this
> > special
> > +#   exception to the GPL to apply to your modified version as
> > well.
> > +
> > +#serial 5
> > +
> > +AC_DEFUN([AX_CHECK_COMPILE_FLAG],
> > +[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
> > +AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4
> > _$1])dnl
> > +AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [
> > +  ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS
> > +  _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1"
> > +  AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
> > +    [AS_VAR_SET(CACHEVAR,[yes])],
> > +    [AS_VAR_SET(CACHEVAR,[no])])
> > +  _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags])
> > +AS_VAR_IF(CACHEVAR,yes,
> > +  [m4_default([$2], :)],
> > +  [m4_default([$3], :)])
> > +AS_VAR_POPDEF([CACHEVAR])dnl
> > +])dnl AX_CHECK_COMPILE_FLAGS
> > +
> > diff --git a/m4/ax_require_defined.m4 b/m4/ax_require_defined.m4
> > new file mode 100644
> > index 0000000000..c4e9859550
> > --- /dev/null
> > +++ b/m4/ax_require_defined.m4
> > @@ -0,0 +1,38 @@
> > +#
> > 
> > +#    https://www.gnu.org/software/autoconf-archive/ax_require_defi
> > ned.html
> > +#
> > 
> > +#
> > +# SYNOPSIS
> > +#
> > +#   AX_REQUIRE_DEFINED(MACRO)
> > +#
> > +# DESCRIPTION
> > +#
> > +#   AX_REQUIRE_DEFINED is a simple helper for making sure other
> > macros have
> > +#   been defined and thus are available for use.  This avoids
> > random issues
> > +#   where a macro isn't expanded.  Instead the configure script
> > emits a
> > +#   non-fatal:
> > +#
> > +#     ./configure: line 1673: AX_CFLAGS_WARN_ALL: command not
> > found
> > +#
> > +#   It's like AC_REQUIRE except it doesn't expand the required
> > macro.
> > +#
> > +#   Here's an example:
> > +#
> > +#     AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG])
> > +#
> > +# LICENSE
> > +#
> > +#   Copyright (c) 2014 Mike Frysinger <vapier at gentoo.org>
> > +#
> > +#   Copying and distribution of this file, with or without
> > modification, are
> > +#   permitted in any medium without royalty provided the copyright
> > notice
> > +#   and this notice are preserved. This file is offered as-is,
> > without any
> > +#   warranty.
> > +
> > +#serial 2
> > +
> > +AC_DEFUN([AX_REQUIRE_DEFINED], [dnl
> > +  m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined; is a m4
> > file missing?])])
> > +])dnl AX_REQUIRE_DEFINED
> > +
> 
> Looks like a lot of duplicated functionality with existing m4 macros.
I do not see any existing m4 marcos that provide the exact same
functionality.

RDC_PROG_{CC,CXX}_FLAGS_IFELSE comes close but they are language
asserted.

These marcos were used based on a suggestion on one of my previous
patches.

Presumably because they are standard marcos that provide a nice
encapsulation of the same logic that is currently used all over the
configure.ac with AC_CACHE_CHECK and build upon each other to provide 
significantly increased maintainability and readability.

Additional patch can be written to clean up configure.ac with these
marcos. But if it is the need of the project to stick to current
conventions, I can re-write this patch without using additional marcos.

> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
-- 
Regards,
Shaleen Jain


More information about the vlc-devel mailing list