From a781408bd48d51f3a68c839054de8512365f97db Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Tue, 3 Apr 2018 22:52:54 +0000 Subject: [PATCH] Introduce static_assert We are going to use static_assert provided by or, if it doesn't work, our cheap imitation that doesn't display the message specified as the second argument of static_assert. * configure.ac (AC_CACHE_CHECK): Check for static_assert in , define HAVE_STATIC_ASSERT if it is available. * static_assert.h: New file. * Makefile.am (strace_SOURCES): Add it. --- Makefile.am | 1 + configure.ac | 10 ++++++++++ static_assert.h | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100755 static_assert.h diff --git a/Makefile.am b/Makefile.am index b961a6dd..354da2a3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -303,6 +303,7 @@ strace_SOURCES = \ stat64.c \ statfs.c \ statfs.h \ + static_assert.h \ statx.c \ statx.h \ strace.c \ diff --git a/configure.ac b/configure.ac index 4b8bc736..89f3f559 100644 --- a/configure.ac +++ b/configure.ac @@ -803,6 +803,16 @@ if test "x$st_cv_have_program_invocation_name" = xyes; then [Define to 1 if the system provides program_invocation_name variable]) fi +AC_CACHE_CHECK([for static_assert], [st_cv_have_static_assert], + [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[static_assert(1,"")]])], + [st_cv_have_static_assert=yes], + [st_cv_have_static_assert=no])]) +if test "x$st_cv_have_static_assert" = xyes; then + AC_DEFINE([HAVE_STATIC_ASSERT], [1], + [Define to 1 if the system provides static_assert]) +fi + AC_CHECK_LIB([dl], [dladdr], [dl_LIBS='-ldl'], [dl_LIBS=]) if test "x$ac_cv_lib_dl_dladdr" = xyes; then AC_DEFINE([HAVE_DLADDR], [1], [Define to 1 if the system provides dladdr]) diff --git a/static_assert.h b/static_assert.h new file mode 100755 index 00000000..1c58e7da --- /dev/null +++ b/static_assert.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018 Dmitry V. Levin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef STRACE_STATIC_ASSERT_H +#define STRACE_STATIC_ASSERT_H + +#include "assert.h" + +#ifndef HAVE_STATIC_ASSERT + +# define static_assert(expr, message) \ + extern int (*strace_static_assert(int))[sizeof(int[2 * !!(expr) - 1])] + +#endif + +#endif /* !STRACE_STATIC_ASSERT_H */ -- 2.40.0