Message ID | 9c0210393a8da6fb6887a111a986eb50dfc1b895.1664050880.git.andreyknvl@google.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [mm,v2] kasan: fix array-bounds warnings in tests | expand |
On Sat, 24 Sep 2022 22:23:21 +0200 andrey.konovalov@linux.dev wrote: > From: Andrey Konovalov <andreyknvl@google.com> > > GCC's -Warray-bounds option detects out-of-bounds accesses to > statically-sized allocations in krealloc out-of-bounds tests. > > Use OPTIMIZER_HIDE_VAR to suppress the warning. > > Also change kmalloc_memmove_invalid_size to use OPTIMIZER_HIDE_VAR > instead of a volatile variable. > > ... > > --- a/mm/kasan/kasan_test.c > +++ b/mm/kasan/kasan_test.c > @@ -333,6 +333,8 @@ static void krealloc_more_oob_helper(struct kunit *test, > ptr2 = krealloc(ptr1, size2, GFP_KERNEL); > KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr2); > > + OPTIMIZER_HIDE_VAR(ptr2); > + > /* All offsets up to size2 must be accessible. */ > ptr2[size1 - 1] = 'x'; > ptr2[size1] = 'x'; > @@ -365,6 +367,8 @@ static void krealloc_less_oob_helper(struct kunit *test, > ptr2 = krealloc(ptr1, size2, GFP_KERNEL); > KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr2); > > + OPTIMIZER_HIDE_VAR(ptr2); What chance does a reader have of working out why this is here? If "little" then a code comment would be a nice way of saving that poor person for having to dive into the git history. > /* Must be accessible for all modes. */ > ptr2[size2 - 1] = 'x'; > > @@ -578,13 +582,14 @@ static void kmalloc_memmove_invalid_size(struct kunit *test) > { > char *ptr; > size_t size = 64; > - volatile size_t invalid_size = size; > + size_t invalid_size = size; > > ptr = kmalloc(size, GFP_KERNEL); > KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr); > > memset((char *)ptr, 0, 64); > OPTIMIZER_HIDE_VAR(ptr); > + OPTIMIZER_HIDE_VAR(invalid_size); > KUNIT_EXPECT_KASAN_FAIL(test, > memmove((char *)ptr, (char *)ptr + 4, invalid_size)); > kfree(ptr); > -- > 2.25.1
On Sun, Sep 25, 2022 at 7:03 PM Andrew Morton <akpm@linux-foundation.org> wrote: > > > --- a/mm/kasan/kasan_test.c > > +++ b/mm/kasan/kasan_test.c > > @@ -333,6 +333,8 @@ static void krealloc_more_oob_helper(struct kunit *test, > > ptr2 = krealloc(ptr1, size2, GFP_KERNEL); > > KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr2); > > > > + OPTIMIZER_HIDE_VAR(ptr2); > > + > > /* All offsets up to size2 must be accessible. */ > > ptr2[size1 - 1] = 'x'; > > ptr2[size1] = 'x'; > > @@ -365,6 +367,8 @@ static void krealloc_less_oob_helper(struct kunit *test, > > ptr2 = krealloc(ptr1, size2, GFP_KERNEL); > > KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr2); > > > > + OPTIMIZER_HIDE_VAR(ptr2); > > What chance does a reader have of working out why this is here? If > "little" then a code comment would be a nice way of saving that poor > person for having to dive into the git history. Will add in v3. Thank you, Andrew!
diff --git a/mm/kasan/kasan_test.c b/mm/kasan/kasan_test.c index 71cb402c404f..dbb0a672380f 100644 --- a/mm/kasan/kasan_test.c +++ b/mm/kasan/kasan_test.c @@ -333,6 +333,8 @@ static void krealloc_more_oob_helper(struct kunit *test, ptr2 = krealloc(ptr1, size2, GFP_KERNEL); KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr2); + OPTIMIZER_HIDE_VAR(ptr2); + /* All offsets up to size2 must be accessible. */ ptr2[size1 - 1] = 'x'; ptr2[size1] = 'x'; @@ -365,6 +367,8 @@ static void krealloc_less_oob_helper(struct kunit *test, ptr2 = krealloc(ptr1, size2, GFP_KERNEL); KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr2); + OPTIMIZER_HIDE_VAR(ptr2); + /* Must be accessible for all modes. */ ptr2[size2 - 1] = 'x'; @@ -578,13 +582,14 @@ static void kmalloc_memmove_invalid_size(struct kunit *test) { char *ptr; size_t size = 64; - volatile size_t invalid_size = size; + size_t invalid_size = size; ptr = kmalloc(size, GFP_KERNEL); KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ptr); memset((char *)ptr, 0, 64); OPTIMIZER_HIDE_VAR(ptr); + OPTIMIZER_HIDE_VAR(invalid_size); KUNIT_EXPECT_KASAN_FAIL(test, memmove((char *)ptr, (char *)ptr + 4, invalid_size)); kfree(ptr);