Message ID | 20250304092417.2873893-4-elver@google.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Compiler-Based Capability- and Locking-Analysis | expand |
On 3/4/25 1:21 AM, Marco Elver wrote: > +#include <linux/build_bug.h> > + > +/* > + * Test that helper macros work as expected. > + */ > +static void __used test_common_helpers(void) > +{ > + BUILD_BUG_ON(capability_unsafe(3) != 3); /* plain expression */ > + BUILD_BUG_ON(capability_unsafe((void)2; 3;) != 3); /* does not swallow semi-colon */ > + BUILD_BUG_ON(capability_unsafe((void)2, 3) != 3); /* does not swallow commas */ > + capability_unsafe(do { } while (0)); /* works with void statements */ > +} Is it guaranteed that <linux/build_bug.h> includes the header file that defines capability_unsafe() or should that header file perhaps be included explicitly? Thanks, Bart.
On Wed, 5 Mar 2025 at 00:52, Bart Van Assche <bvanassche@acm.org> wrote: > > On 3/4/25 1:21 AM, Marco Elver wrote: > > +#include <linux/build_bug.h> > > + > > +/* > > + * Test that helper macros work as expected. > > + */ > > +static void __used test_common_helpers(void) > > +{ > > + BUILD_BUG_ON(capability_unsafe(3) != 3); /* plain expression */ > > + BUILD_BUG_ON(capability_unsafe((void)2; 3;) != 3); /* does not swallow semi-colon */ > > + BUILD_BUG_ON(capability_unsafe((void)2, 3) != 3); /* does not swallow commas */ > > + capability_unsafe(do { } while (0)); /* works with void statements */ > > +} > > Is it guaranteed that <linux/build_bug.h> includes the header file that > defines capability_unsafe() or should that header file perhaps be > included explicitly? It doesn't come in via build_bug.h, but via: scripts/Makefile.lib -> "-include $(srctree)/include/linux/compiler_types.h" (all TUs) -> compiler-capability-analysis.h. The things pulled in via compiler_types.h are treated a bit like builtins available everywhere implicitly.
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index f30099051294..8abaf7dab3f8 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -2764,6 +2764,20 @@ config LINEAR_RANGES_TEST If unsure, say N. +config CAPABILITY_ANALYSIS_TEST + bool "Compiler capability-analysis warnings test" + depends on EXPERT + help + This builds the test for compiler-based capability analysis. The test + does not add executable code to the kernel, but is meant to test that + common patterns supported by the analysis do not result in false + positive warnings. + + When adding support for new capabilities, it is strongly recommended + to add supported patterns to this test. + + If unsure, say N. + config CMDLINE_KUNIT_TEST tristate "KUnit test for cmdline API" if !KUNIT_ALL_TESTS depends on KUNIT diff --git a/lib/Makefile b/lib/Makefile index d5cfc7afbbb8..1dbb59175eb0 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -394,6 +394,9 @@ obj-$(CONFIG_CRC_KUNIT_TEST) += crc_kunit.o obj-$(CONFIG_SIPHASH_KUNIT_TEST) += siphash_kunit.o obj-$(CONFIG_USERCOPY_KUNIT_TEST) += usercopy_kunit.o +CAPABILITY_ANALYSIS_test_capability-analysis.o := y +obj-$(CONFIG_CAPABILITY_ANALYSIS_TEST) += test_capability-analysis.o + obj-$(CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED) += devmem_is_allowed.o obj-$(CONFIG_FIRMWARE_TABLE) += fw_table.o diff --git a/lib/test_capability-analysis.c b/lib/test_capability-analysis.c new file mode 100644 index 000000000000..a0adacce30ff --- /dev/null +++ b/lib/test_capability-analysis.c @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Compile-only tests for common patterns that should not generate false + * positive errors when compiled with Clang's capability analysis. + */ + +#include <linux/build_bug.h> + +/* + * Test that helper macros work as expected. + */ +static void __used test_common_helpers(void) +{ + BUILD_BUG_ON(capability_unsafe(3) != 3); /* plain expression */ + BUILD_BUG_ON(capability_unsafe((void)2; 3;) != 3); /* does not swallow semi-colon */ + BUILD_BUG_ON(capability_unsafe((void)2, 3) != 3); /* does not swallow commas */ + capability_unsafe(do { } while (0)); /* works with void statements */ +}
Add a simple test stub where we will add common supported patterns that should not generate false positive of each new supported capability. Signed-off-by: Marco Elver <elver@google.com> --- lib/Kconfig.debug | 14 ++++++++++++++ lib/Makefile | 3 +++ lib/test_capability-analysis.c | 18 ++++++++++++++++++ 3 files changed, 35 insertions(+) create mode 100644 lib/test_capability-analysis.c