[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <CANpmjNNhdDfovyRr04nF1K5uNth1Hh+KVzBKBNJMd0VsY5WWDA@mail.gmail.com>
Date: Mon, 5 Dec 2022 16:10:43 +0100
From: Marco Elver <elver@...gle.com>
To: Alexander Potapenko <glider@...gle.com>
Cc: linux-kernel@...r.kernel.org, akpm@...ux-foundation.org,
dvyukov@...gle.com, linux-mm@...ck.org
Subject: Re: [PATCH v2] kmsan: fix memcpy tests
On Mon, 5 Dec 2022 at 15:57, Alexander Potapenko <glider@...gle.com> wrote:
>
> Recent Clang changes may cause it to delete calls of memcpy(), if the
> source is an uninitialized volatile local.
> This happens because passing a pointer to a volatile local into memcpy()
> discards the volatile qualifier, giving the compiler a free hand to
> optimize the memcpy() call away.
>
> Use OPTIMIZER_HIDE_VAR() to hide the uninitialized var from the
> too-smart compiler.
>
> Suggested-by: Marco Elver <elver@...gle.com>
> Signed-off-by: Alexander Potapenko <glider@...gle.com>
Reviewed-by: Marco Elver <elver@...gle.com>
> ---
> mm/kmsan/kmsan_test.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/mm/kmsan/kmsan_test.c b/mm/kmsan/kmsan_test.c
> index 9a29ea2dbfb9b..eb44ef3c5f290 100644
> --- a/mm/kmsan/kmsan_test.c
> +++ b/mm/kmsan/kmsan_test.c
> @@ -419,6 +419,7 @@ static void test_memcpy_aligned_to_aligned(struct kunit *test)
> kunit_info(
> test,
> "memcpy()ing aligned uninit src to aligned dst (UMR report)\n");
> + OPTIMIZER_HIDE_VAR(uninit_src);
> memcpy((void *)&dst, (void *)&uninit_src, sizeof(uninit_src));
> kmsan_check_memory((void *)&dst, sizeof(dst));
> KUNIT_EXPECT_TRUE(test, report_matches(&expect));
> @@ -441,6 +442,7 @@ static void test_memcpy_aligned_to_unaligned(struct kunit *test)
> kunit_info(
> test,
> "memcpy()ing aligned uninit src to unaligned dst (UMR report)\n");
> + OPTIMIZER_HIDE_VAR(uninit_src);
> memcpy((void *)&dst[1], (void *)&uninit_src, sizeof(uninit_src));
> kmsan_check_memory((void *)dst, 4);
> KUNIT_EXPECT_TRUE(test, report_matches(&expect));
> @@ -464,6 +466,7 @@ static void test_memcpy_aligned_to_unaligned2(struct kunit *test)
> kunit_info(
> test,
> "memcpy()ing aligned uninit src to unaligned dst - part 2 (UMR report)\n");
> + OPTIMIZER_HIDE_VAR(uninit_src);
> memcpy((void *)&dst[1], (void *)&uninit_src, sizeof(uninit_src));
> kmsan_check_memory((void *)&dst[4], sizeof(uninit_src));
> KUNIT_EXPECT_TRUE(test, report_matches(&expect));
> --
> 2.39.0.rc0.267.gcb52ba06e7-goog
>
Powered by blists - more mailing lists