• David Gow's avatar
    kunit: Add a macro to wrap a deferred action function · 56778b49
    David Gow authored
    KUnit's deferred action API accepts a void(*)(void *) function pointer
    which is called when the test is exited. However, we very frequently
    want to use existing functions which accept a single pointer, but which
    may not be of type void*. While this is probably dodgy enough to be on
    the wrong side of the C standard, it's been often used for similar
    callbacks, and gcc's -Wcast-function-type seems to ignore cases where
    the only difference is the type of the argument, assuming it's
    compatible (i.e., they're both pointers to data).
    
    However, clang 16 has introduced -Wcast-function-type-strict, which no
    longer permits any deviation in function pointer type. This seems to be
    because it'd break CFI, which validates the type of function calls.
    
    This rather ruins our attempts to cast functions to defer them, and
    leaves us with a few options. The one we've chosen is to implement a
    macro which will generate a wrapper function which accepts a void*, and
    casts the argument to the appropriate type.
    
    For example, if you were trying to wrap:
    void foo_close(struct foo *handle);
    you could use:
    KUNIT_DEFINE_ACTION_WRAPPER(kunit_action_foo_close,
    			    foo_close,
    			    struct foo *);
    
    This would create a new kunit_action_foo_close() function, of type
    kunit_action_t, which could be passed into kunit_add_action() and
    similar functions.
    
    In addition to defining this macro, update KUnit and its tests to use
    it.
    
    Link: https://github.com/ClangBuiltLinux/linux/issues/1750Reviewed-by: default avatarNathan Chancellor <nathan@kernel.org>
    Tested-by: default avatarNathan Chancellor <nathan@kernel.org>
    Acked-by: default avatarDaniel Vetter <daniel@ffwll.ch>
    Reviewed-by: default avatarMaxime Ripard <mripard@kernel.org>
    Signed-off-by: default avatarDavid Gow <davidgow@google.com>
    Signed-off-by: default avatarShuah Khan <skhan@linuxfoundation.org>
    56778b49
kunit-test.c 18.9 KB