| From: Kees Cook <kees@kernel.org> |
| Subject: lib: stackinit: hide never-taken branch from compiler |
| Date: Sun, 17 Nov 2024 03:38:13 -0800 |
| |
| The never-taken branch leads to an invalid bounds condition, which is by |
| design. To avoid the unwanted warning from the compiler, hide the |
| variable from the optimizer. |
| |
| ../lib/stackinit_kunit.c: In function 'do_nothing_u16_zero': |
| ../lib/stackinit_kunit.c:51:49: error: array subscript 1 is outside array bounds of 'u16[0]' {aka 'short unsigned int[]'} [-Werror=array-bounds=] |
| 51 | #define DO_NOTHING_RETURN_SCALAR(ptr) *(ptr) |
| | ^~~~~~ |
| ../lib/stackinit_kunit.c:219:24: note: in expansion of macro 'DO_NOTHING_RETURN_SCALAR' |
| 219 | return DO_NOTHING_RETURN_ ## which(ptr + 1); \ |
| | ^~~~~~~~~~~~~~~~~~ |
| |
| Link: https://lkml.kernel.org/r/20241117113813.work.735-kees@kernel.org |
| Signed-off-by: Kees Cook <kees@kernel.org> |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| lib/stackinit_kunit.c | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| --- a/lib/stackinit_kunit.c~lib-stackinit-hide-never-taken-branch-from-compiler |
| +++ a/lib/stackinit_kunit.c |
| @@ -212,6 +212,7 @@ static noinline void test_ ## name (stru |
| static noinline DO_NOTHING_TYPE_ ## which(var_type) \ |
| do_nothing_ ## name(var_type *ptr) \ |
| { \ |
| + OPTIMIZER_HIDE_VAR(ptr); \ |
| /* Will always be true, but compiler doesn't know. */ \ |
| if ((unsigned long)ptr > 0x2) \ |
| return DO_NOTHING_RETURN_ ## which(ptr); \ |
| _ |