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