• Arnd Bergmann's avatar
    kasan: use internal prototypes matching gcc-13 builtins · bb6e04a1
    Arnd Bergmann authored
    gcc-13 warns about function definitions for builtin interfaces that have a
    different prototype, e.g.:
    
    In file included from kasan_test.c:31:
    kasan.h:574:6: error: conflicting types for built-in function '__asan_register_globals'; expected 'void(void *, long int)' [-Werror=builtin-declaration-mismatch]
      574 | void __asan_register_globals(struct kasan_global *globals, size_t size);
    kasan.h:577:6: error: conflicting types for built-in function '__asan_alloca_poison'; expected 'void(void *, long int)' [-Werror=builtin-declaration-mismatch]
      577 | void __asan_alloca_poison(unsigned long addr, size_t size);
    kasan.h:580:6: error: conflicting types for built-in function '__asan_load1'; expected 'void(void *)' [-Werror=builtin-declaration-mismatch]
      580 | void __asan_load1(unsigned long addr);
    kasan.h:581:6: error: conflicting types for built-in function '__asan_store1'; expected 'void(void *)' [-Werror=builtin-declaration-mismatch]
      581 | void __asan_store1(unsigned long addr);
    kasan.h:643:6: error: conflicting types for built-in function '__hwasan_tag_memory'; expected 'void(void *, unsigned char,  long int)' [-Werror=builtin-declaration-mismatch]
      643 | void __hwasan_tag_memory(unsigned long addr, u8 tag, unsigned long size);
    
    The two problems are:
    
     - Addresses are passes as 'unsigned long' in the kernel, but gcc-13
       expects a 'void *'.
    
     - sizes meant to use a signed ssize_t rather than size_t.
    
    Change all the prototypes to match these.  Using 'void *' consistently for
    addresses gets rid of a couple of type casts, so push that down to the
    leaf functions where possible.
    
    This now passes all randconfig builds on arm, arm64 and x86, but I have
    not tested it on the other architectures that support kasan, since they
    tend to fail randconfig builds in other ways.  This might fail if any of
    the 32-bit architectures expect a 'long' instead of 'int' for the size
    argument.
    
    The __asan_allocas_unpoison() function prototype is somewhat weird, since
    it uses a pointer for 'stack_top' and an size_t for 'stack_bottom'.  This
    looks like it is meant to be 'addr' and 'size' like the others, but the
    implementation clearly treats them as 'top' and 'bottom'.
    
    Link: https://lkml.kernel.org/r/20230509145735.9263-2-arnd@kernel.orgSigned-off-by: default avatarArnd Bergmann <arnd@arndb.de>
    Cc: Alexander Potapenko <glider@google.com>
    Cc: Andrey Konovalov <andreyknvl@gmail.com>
    Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com>
    Cc: Dmitry Vyukov <dvyukov@google.com>
    Cc: Marco Elver <elver@google.com>
    Cc: Vincenzo Frascino <vincenzo.frascino@arm.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    bb6e04a1
generic.c 13.8 KB