Skip to content
  • Rasmus Villemoes's avatar
    6bab69c6
    build_bug.h: add wrapper for _Static_assert · 6bab69c6
    Rasmus Villemoes authored
    BUILD_BUG_ON() is a little annoying, since it cannot be used outside
    function scope.  So one cannot put assertions about the sizeof() a
    struct next to the struct definition, but has to hide that in some more
    or less arbitrary function.
    
    Since gcc 4.6 (which is now also the required minimum), there is support
    for the C11 _Static_assert in all C modes, including gnu89.  So add a
    simple wrapper for that.
    
    _Static_assert() requires a message argument, which is usually quite
    redundant (and I believe that bug got fixed at least in newer C++
    standards), but we can easily work around that with a little macro
    magic, making it optional.
    
    For example, adding
    
      static_assert(sizeof(struct printf_spec) == 8);
    
    in vsprintf.c and modifying that struct to violate it, one gets
    
    ./include/linux/build_bug.h:78:41: error: static assertion failed: "sizeof(struct printf_spec) == 8"
     #define __static_assert(expr, msg, ...) _Static_assert(expr, "" msg "")
    
    godbolt.org suggests that _Static_assert() has been support by clang
    since at least 3.0.0.
    
    Link: http://lkml.kernel.org/r/20190208203015.29702-1-linux@rasmusvillemoes.dk
    
    
    Signed-off-by: default avatarRasmus Villemoes <linux@rasmusvillemoes.dk>
    Acked-by: default avatarAlexey Dobriyan <adobriyan@gmail.com>
    Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
    Cc: Nick Desaulniers <ndesaulniers@google.com>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
    Cc: Alexander Viro <viro@zeniv.linux.org.uk>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    6bab69c6
    build_bug.h: add wrapper for _Static_assert
    Rasmus Villemoes authored
    BUILD_BUG_ON() is a little annoying, since it cannot be used outside
    function scope.  So one cannot put assertions about the sizeof() a
    struct next to the struct definition, but has to hide that in some more
    or less arbitrary function.
    
    Since gcc 4.6 (which is now also the required minimum), there is support
    for the C11 _Static_assert in all C modes, including gnu89.  So add a
    simple wrapper for that.
    
    _Static_assert() requires a message argument, which is usually quite
    redundant (and I believe that bug got fixed at least in newer C++
    standards), but we can easily work around that with a little macro
    magic, making it optional.
    
    For example, adding
    
      static_assert(sizeof(struct printf_spec) == 8);
    
    in vsprintf.c and modifying that struct to violate it, one gets
    
    ./include/linux/build_bug.h:78:41: error: static assertion failed: "sizeof(struct printf_spec) == 8"
     #define __static_assert(expr, msg, ...) _Static_assert(expr, "" msg "")
    
    godbolt.org suggests that _Static_assert() has been support by clang
    since at least 3.0.0.
    
    Link: http://lkml.kernel.org/r/20190208203015.29702-1-linux@rasmusvillemoes.dk
    
    
    Signed-off-by: default avatarRasmus Villemoes <linux@rasmusvillemoes.dk>
    Acked-by: default avatarAlexey Dobriyan <adobriyan@gmail.com>
    Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
    Cc: Nick Desaulniers <ndesaulniers@google.com>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
    Cc: Alexander Viro <viro@zeniv.linux.org.uk>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
Loading