Hi Kuan-Wei,

On Sun, Aug 23, 2026 at 8:11 AM Kuan-Wei Chiu <[email protected]> wrote:
>
> Hi Bill,
>
> On Sun, Aug 23, 2026 at 12:35:33PM +0000, Bill Wendling wrote:
> > Add a custom KUnit test suite 'stacktrace_counted_by' to verify that the
> > __counted_by_ptr annotation on the 'entries' field of 'struct stack_trace'
> > behaves correctly.
> >
> > The test verifies that 'max_entries' correctly limits and validates access
> > to 'entries' when CONFIG_ARCH_STACKWALK is not defined. If it is defined,
> > the test is cleanly skipped at runtime to prevent compile-time or runtime
> > failures due to 'struct stack_trace' being undefined on modern
> > architectures.
> >
> > Assisted-by: Gemini Next
> > Signed-off-by: Bill Wendling <[email protected]>
> > ---
> > Cc: Kees Cook <[email protected]>
> > Cc: "Gustavo A. R. Silva" <[email protected]>
> > Cc: Andrew Morton <[email protected]>
> > Cc: Brendan Higgins <[email protected]>
> > Cc: David Gow <[email protected]>
> > Cc: Rae Moar <[email protected]>
> > Cc: Ryota Sakamoto <[email protected]>
> > Cc: Kuan-Wei Chiu <[email protected]>
> > Cc: Pasha Tatashin <[email protected]>
> > Cc: Dmitry Antipov <[email protected]>
> > Cc: Petr Mladek <[email protected]>
> > Cc: Kir Chou <[email protected]>
> > Cc: [email protected]
> > Cc: [email protected]
> > Cc: [email protected]
> > Cc: [email protected]
> > Cc: [email protected]
> > Cc: [email protected]
> > ---
> >  lib/Kconfig.debug            | 10 +++++++
> >  lib/kunit/.kunitconfig       |  1 +
> >  lib/tests/Makefile           |  1 +
> >  lib/tests/stacktrace_kunit.c | 51 ++++++++++++++++++++++++++++++++++++
> >  4 files changed, 63 insertions(+)
> >  create mode 100644 lib/tests/stacktrace_kunit.c
> >
> > diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
> > index e97bdf3a42a8..51a6ac1a2461 100644
> > --- a/lib/Kconfig.debug
> > +++ b/lib/Kconfig.debug
> > @@ -2716,6 +2716,16 @@ config BITOPS_KUNIT
> >
> >         If unsure, say N.
> >
> > +config STACKTRACE_KUNIT_TEST
> > +     tristate "KUnit test for stacktrace counted_by attribute" if 
> > !KUNIT_ALL_TESTS
> > +     depends on KUNIT
> > +     default KUNIT_ALL_TESTS
> > +     help
> > +       This option enables the KUnit test for verifying the 
> > __counted_by_ptr
> > +       attribute on struct stack_trace.
> > +
> > +       If unsure, say N.
> > +
> >  config BITFIELD_KUNIT
> >       tristate "KUnit test bitfield functions at runtime" if 
> > !KUNIT_ALL_TESTS
> >       depends on KUNIT
> > diff --git a/lib/kunit/.kunitconfig b/lib/kunit/.kunitconfig
> > index 9235b7d42d38..b3761b41459e 100644
> > --- a/lib/kunit/.kunitconfig
> > +++ b/lib/kunit/.kunitconfig
> > @@ -1,3 +1,4 @@
> >  CONFIG_KUNIT=y
> >  CONFIG_KUNIT_TEST=y
> >  CONFIG_KUNIT_EXAMPLE_TEST=y
> > +CONFIG_STACKTRACE_KUNIT_TEST=y
> > diff --git a/lib/tests/Makefile b/lib/tests/Makefile
> > index 4ead57602eac..40875e729fc8 100644
> > --- a/lib/tests/Makefile
> > +++ b/lib/tests/Makefile
> > @@ -6,6 +6,7 @@
> >  CFLAGS_bitfield_kunit.o := $(DISABLE_STRUCTLEAK_PLUGIN)
> >  obj-$(CONFIG_BASE64_KUNIT) += base64_kunit.o
> >  obj-$(CONFIG_BITOPS_KUNIT) += bitops_kunit.o
> > +obj-$(CONFIG_STACKTRACE_KUNIT_TEST) += stacktrace_kunit.o
> >  obj-$(CONFIG_BITFIELD_KUNIT) += bitfield_kunit.o
> >  obj-$(CONFIG_BITS_TEST) += test_bits.o
> >  obj-$(CONFIG_SHDI3_KUNIT_TEST) += shdi3_kunit.o
> > diff --git a/lib/tests/stacktrace_kunit.c b/lib/tests/stacktrace_kunit.c
> > new file mode 100644
> > index 000000000000..7ec48edf84fe
> > --- /dev/null
> > +++ b/lib/tests/stacktrace_kunit.c
> > @@ -0,0 +1,51 @@
> > +// SPDX-License-Identifier: GPL-2.0
> > +/*
> > + * KUnit test for struct stack_trace counted_by attribute.
> > + */
> > +
> > +#include <kunit/test.h>
> > +#include <linux/stacktrace.h>
> > +
> > +#ifndef CONFIG_ARCH_STACKWALK
> > +static void test_stack_trace_counted_by(struct kunit *test)
> > +{
> > +     unsigned long entries_buf[4];
> > +     struct stack_trace trace = {
> > +             .entries = entries_buf,
> > +             .max_entries = 4,
> > +     };
> > +
> > +     KUNIT_EXPECT_EQ(test, trace.max_entries, 4U);
> > +     KUNIT_EXPECT_PTR_EQ(test, trace.entries, (unsigned long 
> > *)entries_buf);
> > +
> > +     /* Write to the allocated elements to verify access */
> > +     trace.entries[0] = 0xdeadbeef;
> > +     trace.entries[1] = 0xbeefcafe;
> > +     trace.entries[2] = 0xcafebabe;
> > +     trace.entries[3] = 0x12345678;
>
> This only does in bounds array writes.
> To test __counted_by_ptr, I thought we were supposed to intentionally
> trigger an out of bounds access and see if it actually catches the
> error?
>
True. This is testing only that the existing behavior doesn't fail
with the new attribute. It looks like you're not the only one to
comment on this, though...

-bw

> > +
> > +     KUNIT_EXPECT_EQ(test, trace.entries[0], 0xdeadbeefUL);
> > +     KUNIT_EXPECT_EQ(test, trace.entries[1], 0xbeefcafeUL);
> > +     KUNIT_EXPECT_EQ(test, trace.entries[2], 0xcafebabeUL);
> > +     KUNIT_EXPECT_EQ(test, trace.entries[3], 0x12345678UL);
> > +}
> > +#else
> > +static void test_stack_trace_counted_by(struct kunit *test)
> > +{
> > +     kunit_skip(test, "CONFIG_ARCH_STACKWALK is enabled, struct 
> > stack_trace is not defined");
> > +}
> > +#endif
> > +
> > +static struct kunit_case stacktrace_test_cases[] = {
> > +     KUNIT_CASE(test_stack_trace_counted_by),
> > +     {}
> > +};
> > +
> > +static struct kunit_suite stacktrace_test_suite = {
> > +     .name = "stacktrace_counted_by",
> > +     .test_cases = stacktrace_test_cases,
> > +};
> > +
> > +kunit_test_suite(stacktrace_test_suite);
> > +
> > +MODULE_LICENSE("GPL");
> > --
> > 2.55.0.860.g4b6b3295ed-goog
> >

Reply via email to