Re: kcsan -Wmaybe-uninitialized warning in ntfs3
"Arnd Bergmann" <[email protected]> Wed, 22 Apr 2026 10:00:15 +0200
| Newsgroups | dev.linux.lists.ntfs3,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
On Tue, Apr 21, 2026, at 21:12, Arnd Bergmann wrote: > On Tue, Apr 21, 2026, at 21:06, Marco Elver wrote: >> On Tue, 21 Apr 2026 at 17:26, Marco Elver <[email protected]> wrote: >> [...] >>> > To me, 2 makes more sense. The attribute requires gcc-11 or higher, >>> > so you need to wrap that in a compiler version specific macro, >>> > but since I only saw the warning with gcc-12 and higher, that >>> > should be fine. >> >> Kindly test if you can: >> https://lore.kernel.org/all/[email protected]/ > > Applied to my randconfig tree and verified that this fixes the > known warning (only one out of about 200 random configs). I'll > let you know if something comes up by tomorrow. Unfortunately, there are new warnings after your patches using gcc-11. In 500 randconfig builds with that compiler, I saw 7 configurations failing with one of these four messages: 1. In file included from include/asm-generic/rwonce.h:27, from ./arch/x86/include/generated/asm/rwonce.h:1, from include/linux/compiler.h:369, from include/linux/build_bug.h:5, from arch/x86/include/asm/current.h:5, from include/linux/sched.h:12, from include/linux/mempool.h:8, from include/linux/bio.h:8, from drivers/md/dm-bio-record.h:11, from drivers/md/dm-raid1.c:9: In function 'instrument_atomic_write', inlined from 'atomic_set' at include/linux/atomic/atomic-instrumented.h:67:2, inlined from 'reset_ms_flags' at drivers/md/dm-raid1.c:384:3, inlined from 'do_recovery' at drivers/md/dm-raid1.c:413:3, inlined from 'do_mirror' at drivers/md/dm-raid1.c:876:2: include/linux/kcsan-checks.h:220:28: error: '__kcsan_check_access' expecting 0 bytes in a region of size 0 [-Werror=stringop-overread] 220 | #define kcsan_check_access __kcsan_check_access | ^ include/linux/kcsan-checks.h:334:9: note: in expansion of macro 'kcsan_check_access' 334 | kcsan_check_access(ptr, size, KCSAN_ACCESS_ATOMIC | KCSAN_ACCESS_WRITE) | ^~~~~~~~~~~~~~~~~~ include/linux/instrumented.h:98:9: note: in expansion of macro 'kcsan_check_atomic_write' 98 | kcsan_check_atomic_write(v, size); | ^~~~~~~~~~~~~~~~~~~~~~~~ include/linux/instrumented.h: In function 'do_mirror': drivers/md/dm-raid1.c:59:27: note: at offset [504, 171798692304] into source object 'ti' of size 8 59 | struct dm_target *ti; | ^~ In file included from include/asm-generic/rwonce.h:27, from ./arch/x86/include/generated/asm/rwonce.h:1, from include/linux/compiler.h:369, from include/linux/build_bug.h:5, from arch/x86/include/asm/current.h:5, from include/linux/sched.h:12, from include/linux/mempool.h:8, from include/linux/bio.h:8, from drivers/md/dm-bio-record.h:11, from drivers/md/dm-raid1.c:9: include/linux/kcsan-checks.h:37:6: note: in a call to function '__kcsan_check_access' declared with attribute 'access (none, 1)' 37 | void __kcsan_check_access(const volatile void *ptr, size_t size, int type) __access(none, 1); | ^~~~~~~~~~~~~~~~~~~~ 2. In file included from include/asm-generic/rwonce.h:27, from arch/arm64/include/asm/rwonce.h:81, from include/linux/compiler.h:369, from include/asm-generic/bug.h:5, from arch/arm64/include/asm/bug.h:26, from include/linux/bug.h:5, from include/linux/random.h:6, from include/crypto/curve25519.h:10, from drivers/net/wireguard/messages.h:9, from drivers/net/wireguard/noise.h:8, from drivers/net/wireguard/device.h:9, from drivers/net/wireguard/peer.h:9, from drivers/net/wireguard/queueing.h:9, from drivers/net/wireguard/receive.c:6: In function 'instrument_atomic_read_write', inlined from 'test_and_set_bit' at include/asm-generic/bitops/instrumented-atomic.h:71:2, inlined from 'counter_validate' at drivers/net/wireguard/receive.c:325:9, inlined from 'wg_packet_rx_poll' at drivers/net/wireguard/receive.c:461:7: include/linux/kcsan-checks.h:220:28: error: '__kcsan_check_access' expecting 0 bytes in a region of size 0 [-Werror=stringop-overread] 220 | #define kcsan_check_access __kcsan_check_access | ^ include/linux/kcsan-checks.h:336:9: note: in expansion of macro 'kcsan_check_access' 336 | kcsan_check_access(ptr, size, KCSAN_ACCESS_ATOMIC | KCSAN_ACCESS_WRITE | KCSAN_ACCESS_COMPOUND) | ^~~~~~~~~~~~~~~~~~ include/linux/instrumented.h:113:9: note: in expansion of macro 'kcsan_check_atomic_read_write' 113 | kcsan_check_atomic_read_write(v, size); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from drivers/net/wireguard/device.h:9, from drivers/net/wireguard/peer.h:9, from drivers/net/wireguard/queueing.h:9, from drivers/net/wireguard/receive.c:6: include/linux/instrumented.h: In function 'wg_packet_rx_poll': drivers/net/wireguard/noise.h:19:13: note: at offset [80, 1096] into source object 'counter' of size 8 19 | u64 counter; | ^~~~~~~ In file included from include/asm-generic/rwonce.h:27, from arch/arm64/include/asm/rwonce.h:81, from include/linux/compiler.h:369, from include/asm-generic/bug.h:5, from arch/arm64/include/asm/bug.h:26, from include/linux/bug.h:5, from include/linux/random.h:6, from include/crypto/curve25519.h:10, from drivers/net/wireguard/messages.h:9, from drivers/net/wireguard/noise.h:8, from drivers/net/wireguard/device.h:9, from drivers/net/wireguard/peer.h:9, from drivers/net/wireguard/queueing.h:9, from drivers/net/wireguard/receive.c:6: include/linux/kcsan-checks.h:37:6: note: in a call to function '__kcsan_check_access' declared with attribute 'access (none, 1)' 37 | void __kcsan_check_access(const volatile void *ptr, size_t size, int type) __access(none, 1); | ^~~~~~~~~~~~~~~~~~~~ 3. In file included from include/asm-generic/rwonce.h:27, from arch/arm64/include/asm/rwonce.h:81, from include/linux/compiler.h:369, from include/asm-generic/div64.h:27, from ./arch/arm64/include/generated/asm/div64.h:1, from include/linux/math.h:6, from include/linux/delay.h:12, from drivers/misc/bcm-vk/bcm_vk_msg.c:6: In function 'instrument_atomic_write', inlined from 'atomic_set' at include/linux/atomic/atomic-instrumented.h:67:2, inlined from 'bcm_vk_get_ctx' at drivers/misc/bcm-vk/bcm_vk_msg.c:250:2, inlined from 'bcm_vk_open' at drivers/misc/bcm-vk/bcm_vk_msg.c:980:8: include/linux/kcsan-checks.h:220:28: error: '__kcsan_check_access' expecting 0 bytes in a region of size 0 [-Werror=stringop-overread] 220 | #define kcsan_check_access __kcsan_check_access | ^ include/linux/kcsan-checks.h:334:9: note: in expansion of macro 'kcsan_check_access' 334 | kcsan_check_access(ptr, size, KCSAN_ACCESS_ATOMIC | KCSAN_ACCESS_WRITE) | ^~~~~~~~~~~~~~~~~~ include/linux/instrumented.h:98:9: note: in expansion of macro 'kcsan_check_atomic_write' 98 | kcsan_check_atomic_write(v, size); | ^~~~~~~~~~~~~~~~~~~~~~~~ In file included from drivers/misc/bcm-vk/bcm_vk_msg.c:17: include/linux/instrumented.h: In function 'bcm_vk_open': drivers/misc/bcm-vk/bcm_vk.h:359:25: note: at offset [1576, 23200] into source object 'pdev' of size 8 359 | struct pci_dev *pdev; | ^~~~ In file included from include/asm-generic/rwonce.h:27, from arch/arm64/include/asm/rwonce.h:81, from include/linux/compiler.h:369, from include/asm-generic/div64.h:27, from ./arch/arm64/include/generated/asm/div64.h:1, from include/linux/math.h:6, from include/linux/delay.h:12, from drivers/misc/bcm-vk/bcm_vk_msg.c:6: include/linux/kcsan-checks.h:37:6: note: in a call to function '__kcsan_check_access' declared with attribute 'access (none, 1)' 37 | void __kcsan_check_access(const volatile void *ptr, size_t size, int type) __access(none, 1); | ^~~~~~~~~~~~~~~~~~~~ In function 'instrument_atomic_write', inlined from 'atomic_set' at include/linux/atomic/atomic-instrumented.h:67:2, inlined from 'bcm_vk_get_ctx' at drivers/misc/bcm-vk/bcm_vk_msg.c:251:2, inlined from 'bcm_vk_open' at drivers/misc/bcm-vk/bcm_vk_msg.c:980:8: include/linux/kcsan-checks.h:220:28: error: '__kcsan_check_access' expecting 0 bytes in a region of size 0 [-Werror=stringop-overread] 220 | #define kcsan_check_access __kcsan_check_access | ^ include/linux/kcsan-checks.h:334:9: note: in expansion of macro 'kcsan_check_access' 334 | kcsan_check_access(ptr, size, KCSAN_ACCESS_ATOMIC | KCSAN_ACCESS_WRITE) | ^~~~~~~~~~~~~~~~~~ include/linux/instrumented.h:98:9: note: in expansion of macro 'kcsan_check_atomic_write' 98 | kcsan_check_atomic_write(v, size); | ^~~~~~~~~~~~~~~~~~~~~~~~ In file included from drivers/misc/bcm-vk/bcm_vk_msg.c:17: include/linux/instrumented.h: In function 'bcm_vk_open': drivers/misc/bcm-vk/bcm_vk.h:359:25: note: at offset [1580, 23204] into source object 'pdev' of size 8 359 | struct pci_dev *pdev; | ^~~~ In file included from include/asm-generic/rwonce.h:27, from arch/arm64/include/asm/rwonce.h:81, from include/linux/compiler.h:369, from include/asm-generic/div64.h:27, from ./arch/arm64/include/generated/asm/div64.h:1, from include/linux/math.h:6, from include/linux/delay.h:12, from drivers/misc/bcm-vk/bcm_vk_msg.c:6: include/linux/kcsan-checks.h:37:6: note: in a call to function '__kcsan_check_access' declared with attribute 'access (none, 1)' 37 | void __kcsan_check_access(const volatile void *ptr, size_t size, int type) __access(none, 1); | ^~~~~~~~~~~~~~~~~~~~ 4. In file included from include/asm-generic/rwonce.h:27, from ./arch/x86/include/generated/asm/rwonce.h:1, from include/linux/compiler.h:369, from include/asm-generic/bug.h:5, from arch/x86/include/asm/bug.h:193, from include/linux/bug.h:5, from include/linux/mmdebug.h:5, from include/linux/mm.h:7, from mm/vmscan.c:15: In function 'instrument_atomic_read_write', inlined from 'atomic_long_add' at include/linux/atomic/atomic-instrumented.h:3260:2, inlined from 'node_page_state_add' at include/linux/vmstat.h:172:2, inlined from '__mod_node_page_state' at include/linux/vmstat.h:331:2, inlined from 'shrink_active_list' at mm/vmscan.c:2149:2, inlined from 'shrink_list' at mm/vmscan.c:2220:4, inlined from 'shrink_lruvec' at mm/vmscan.c:5969:21: include/linux/kcsan-checks.h:220:28: error: '__kcsan_check_access' expecting 0 bytes in a region of size 0 [-Werror=stringop-overread] 220 | #define kcsan_check_access __kcsan_check_access | ^ include/linux/kcsan-checks.h:336:9: note: in expansion of macro 'kcsan_check_access' 336 | kcsan_check_access(ptr, size, KCSAN_ACCESS_ATOMIC | KCSAN_ACCESS_WRITE | KCSAN_ACCESS_COMPOUND) | ^~~~~~~~~~~~~~~~~~ include/linux/instrumented.h:113:9: note: in expansion of macro 'kcsan_check_atomic_read_write' 113 | kcsan_check_atomic_read_write(v, size); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from include/linux/gfp.h:7, from include/linux/mm.h:8, from mm/vmscan.c:15: include/linux/instrumented.h: In function 'shrink_lruvec': include/linux/mmzone.h:1478:21: note: at offset [10272, 10280] into source object 'node_zones' of size 7264 1478 | struct zone node_zones[MAX_NR_ZONES]; | ^~~~~~~~~~ In file included from include/asm-generic/rwonce.h:27, from ./arch/x86/include/generated/asm/rwonce.h:1, from include/linux/compiler.h:369, from include/asm-generic/bug.h:5, from arch/x86/include/asm/bug.h:193, from include/linux/bug.h:5, from include/linux/mmdebug.h:5, from include/linux/mm.h:7, from mm/vmscan.c:15: include/linux/kcsan-checks.h:37:6: note: in a call to function '__kcsan_check_access' declared with attribute 'access (none, 1)' 37 | void __kcsan_check_access(const volatile void *ptr, size_t size, int type) __access(none, 1); | ^~~~~~~~~~~~~~~~~~~~ In function 'instrument_atomic_read_write', inlined from 'atomic_long_add' at include/linux/atomic/atomic-instrumented.h:3260:2, inlined from 'node_page_state_add' at include/linux/vmstat.h:172:2, inlined from '__mod_node_page_state' at include/linux/vmstat.h:331:2, inlined from 'mod_lruvec_state' at include/linux/vmstat.h:536:2, inlined from 'shrink_inactive_list' at mm/vmscan.c:1987:2, inlined from 'shrink_list' at mm/vmscan.c:2226:9, inlined from 'shrink_lruvec' at mm/vmscan.c:5969:21: include/linux/kcsan-checks.h:220:28: error: '__kcsan_check_access' expecting 0 bytes in a region of size 0 [-Werror=stringop-overread] 220 | #define kcsan_check_access __kcsan_check_access | ^ include/linux/kcsan-checks.h:336:9: note: in expansion of macro 'kcsan_check_access' 336 | kcsan_check_access(ptr, size, KCSAN_ACCESS_ATOMIC | KCSAN_ACCESS_WRITE | KCSAN_ACCESS_COMPOUND) | ^~~~~~~~~~~~~~~~~~ include/linux/instrumented.h:113:9: note: in expansion of macro 'kcsan_check_atomic_read_write' 113 | kcsan_check_atomic_read_write(v, size); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from include/linux/gfp.h:7, from include/linux/mm.h:8, from mm/vmscan.c:15: include/linux/instrumented.h: In function 'shrink_lruvec': include/linux/mmzone.h:1478:21: note: at offset [10624, 10648] into source object 'node_zones' of size 7264 1478 | struct zone node_zones[MAX_NR_ZONES]; | ^~~~~~~~~~ In file included from include/asm-generic/rwonce.h:27, from ./arch/x86/include/generated/asm/rwonce.h:1, from include/linux/compiler.h:369, from include/asm-generic/bug.h:5, from arch/x86/include/asm/bug.h:193, from include/linux/bug.h:5, from include/linux/mmdebug.h:5, from include/linux/mm.h:7, from mm/vmscan.c:15: I've attached one .config for each of the above, but haven't looked in too much detail. For the wireguard case, I managed to simplify the code so gcc doesn't get confused by the pointer arithmetic: --- a/drivers/net/wireguard/receive.c +++ b/drivers/net/wireguard/receive.c @@ -321,9 +321,8 @@ static bool counter_validate(struct noise_replay_counter *counter, u64 their_cou WRITE_ONCE(counter->counter, their_counter); } - index &= (COUNTER_BITS_TOTAL / BITS_PER_LONG) - 1; - ret = !test_and_set_bit(their_counter & (BITS_PER_LONG - 1), - &counter->backtrack[index]); + ret = !test_and_set_bit(their_counter & (COUNTER_BITS_TOTAL - 1), + counter->backtrack); out: spin_unlock_bh(&counter->lock); Arnd
0xD490B040_defconfig
(application/octet-stream, 160.4 KB) - not displayed
0x83019D90_defconfig
(application/octet-stream, 195.6 KB) - not displayed
0x82DE0922_defconfig
(application/octet-stream, 201.7 KB) - not displayed
0xE7F14A61_defconfig
(application/octet-stream, 153.3 KB) - not displayed