Skip to contentSkip to conversation

ubsan: Silence W=1 warnings in self-test

PATCH Superseded Kees Cook 2 participants 4 messages Feb 2, 2024 Library code

v1 of 2 Superseded Latest is v2 →

lore
Share & tools
lore

Kees Cook

author
#0 lore raw

PATCH 1/1 ubsan: Silence W=1 warnings in self-test

Silence a handful of W=1 warnings in the UBSan selftest, which set variables without using them. For example:

lib/test_ubsan.c:101:6: warning: variable 'val1' set but not used [-Wunused-but-set-variable]

     101 |         int val1 = 10;
         |             ^
---
 lib/Makefile | 1 +
 1 file changed, 1 insertion(+)
lib/Makefile +1 -0
index 6b09731d8e61..bc36a5c167db 100644
@@ -69,6 +69,7 @@ obj-$(CONFIG_HASH_KUNIT_TEST) += test_hash.o
 obj-$(CONFIG_TEST_IDA) += test_ida.o
 obj-$(CONFIG_TEST_UBSAN) += test_ubsan.o
 CFLAGS_test_ubsan.o += $(call cc-disable-warning, vla)
+CFLAGS_test_ubsan.o += $(call cc-disable-warning, unused-but-set-variable)
 UBSAN_SANITIZE_test_ubsan.o := y
 obj-$(CONFIG_TEST_KSTRTOX) += test-kstrtox.o
 obj-$(CONFIG_TEST_LIST_SORT) += test_list_sort.o
Signature · 1 line
2.34.1
#1 lore raw
Quoted 7 lines · Kees Cook

Silence a handful of W=1 warnings in the UBSan selftest, which set variables without using them. For example:

lib/test_ubsan.c:101:6: warning: variable 'val1' set but not used [-Wunused-but-set-variable]

     101 |         int val1 = 10;
         |             ^

This is the shift_out_of_bounds test? It looks like the neg and wrap variables are volatile but the written-to variables aren't. Technically the compiler just has to emit the reads to neg and wrap, and can entirely omit the writes to val1 and val2.

Does making it volatile fix the warning?

Quoted 23 lines
---
 lib/Makefile | 1 +
 1 file changed, 1 insertion(+)
lib/Makefile +1 -1
index 6b09731d8e61..bc36a5c167db 100644
@@ -69,6 +69,7 @@ obj-$(CONFIG_HASH_KUNIT_TEST) += test_hash.o
 obj-$(CONFIG_TEST_IDA) += test_ida.o
 obj-$(CONFIG_TEST_UBSAN) += test_ubsan.o
 CFLAGS_test_ubsan.o += $(call cc-disable-warning, vla)
+CFLAGS_test_ubsan.o += $(call cc-disable-warning, unused-but-set-variable)
 UBSAN_SANITIZE_test_ubsan.o := y
 obj-$(CONFIG_TEST_KSTRTOX) += test-kstrtox.o
 obj-$(CONFIG_TEST_LIST_SORT) += test_list_sort.o
--

2.34.1

author
#2 lore raw
Quoted 9 lines · Marco Elver
Quoted 7 lines · Kees Cook

Silence a handful of W=1 warnings in the UBSan selftest, which set variables without using them. For example:

lib/test_ubsan.c:101:6: warning: variable 'val1' set but not used [-Wunused-but-set-variable]

     101 |         int val1 = 10;
         |             ^
Quoted 6 lines

This is the shift_out_of_bounds test? It looks like the neg and wrap variables are volatile but the written-to variables aren't. Technically the compiler just has to emit the reads to neg and wrap, and can entirely omit the writes to val1 and val2.

Does making it volatile fix the warning?

It does for some, but not all:

../lib/test_ubsan.c: In function 'test_ubsan_out_of_bounds':
../lib/test_ubsan.c:115:22: warning: variable 'arr' set but not used [-Wunused-but-set-variable]
115 | volatile int arr[4];
| ^~~
../lib/test_ubsan.c:114:23: warning: variable 'above' set but not used [-Wunused-but-set-variable]
114 | volatile char above[4] = { }; /* Protect surrounding memory. */
| ^~~~~
../lib/test_ubsan.c: In function 'test_ubsan_load_invalid_value':
../lib/test_ubsan.c:137:44: warning: variable 'eptr' set but not used [-Wunused-but-set-variable]
137 | enum ubsan_test_enum eval, eval2, *eptr;
| ^~~~
../lib/test_ubsan.c:136:26: warning: variable 'ptr' set but not used [-Wunused-but-set-variable]
136 | bool val, val2, *ptr;
| ^~~

Signature · 1 line
Kees Cook
#3 lore raw
Quoted 20 lines · Kees Cook
Quoted 9 lines · Marco Elver
Quoted 7 lines · Kees Cook

Silence a handful of W=1 warnings in the UBSan selftest, which set variables without using them. For example:

lib/test_ubsan.c:101:6: warning: variable 'val1' set but not used [-Wunused-but-set-variable]

     101 |         int val1 = 10;
         |             ^
Quoted 6 lines

This is the shift_out_of_bounds test? It looks like the neg and wrap variables are volatile but the written-to variables aren't. Technically the compiler just has to emit the reads to neg and wrap, and can entirely omit the writes to val1 and val2.

Does making it volatile fix the warning?

It does for some, but not all:

Quoted 14 lines

../lib/test_ubsan.c: In function 'test_ubsan_out_of_bounds':
../lib/test_ubsan.c:115:22: warning: variable 'arr' set but not used [-Wunused-but-set-variable]
115 | volatile int arr[4];
| ^~~
../lib/test_ubsan.c:114:23: warning: variable 'above' set but not used [-Wunused-but-set-variable]
114 | volatile char above[4] = { }; /* Protect surrounding memory. */
| ^~~~~
../lib/test_ubsan.c: In function 'test_ubsan_load_invalid_value':
../lib/test_ubsan.c:137:44: warning: variable 'eptr' set but not used [-Wunused-but-set-variable]
137 | enum ubsan_test_enum eval, eval2, *eptr;
| ^~~~
../lib/test_ubsan.c:136:26: warning: variable 'ptr' set but not used [-Wunused-but-set-variable]
136 | bool val, val2, *ptr;
| ^~~

Then I'd just combine the compiler flag with switching most of these variables to volatile so the tests keep working if the compiler decides to optimize too much.