From: sashiko-bot@kernel.org
To: "Vineet Gupta" <vineet.gupta@linux.dev>
Cc: bpf@vger.kernel.org
Subject: Re: [RFC bpf-next 4/6] selftests/bpf: cover low-32 subreg-equal link for zero-extending movs
Date: Fri, 14 Aug 2026 23:27:54 +0000 [thread overview]
Message-ID: <20260814232754.CF49D1F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260814231945.3884596-5-vineet.gupta@linux.dev>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [Medium] Logic error in regression test rendering it ineffective
- [Low] Multi-line comment style violation in BPF subsystem
--
--- Patch [4]: [RFC bpf-next 4/6] selftests/bpf: cover low-32 subreg-equal link for zero-extending movs ---
commit c52a4172a626e9c98f4a644af71ceb18fe331f7d
Author: Vineet Gupta <vineet.gupta@linux.dev>
selftests/bpf: cover low-32 subreg-equal link for zero-extending movs
This commit adds a new test subreg_eq_zext_mov_narrow and updates existing
tests to verify the verifier's low-32 BPF_FLAG_SUBREG_ZEXT link behavior
for zero-extending moves. It also introduces tests to cover the destination
driven direction and the preservation of wide ADD_CONST sources.
> diff --git a/tools/testing/selftests/bpf/progs/verifier_linked_scalars.c b/tools/testing/selftests/bpf/progs/verifier_linked_scalars.c
> index c80747c16bcf7..2cc6f9e45aff3 100644
> --- a/tools/testing/selftests/bpf/progs/verifier_linked_scalars.c
> +++ b/tools/testing/selftests/bpf/progs/verifier_linked_scalars.c
[ ... ]
> @@ -711,4 +711,119 @@ l_exit_%=: \
> : __clobber_all);
> }
[ ... ]
> +/*
> + * Dest-driven direction, zero-extend flavour: narrowing the LINKED register
> + * must not narrow the wide base.
> + *
> + * w7 = w6 shares only r6's low 32 bits; r7's high half is zero, r6's is
> + * unknown. Learning r7 == 0 therefore says nothing about r6, and
> + * sync_linked_regs() must not copy r7's state onto it. Rejected iff the base
> + * is left alone.
> + *
> + * This is the shape that catches a lost BPF_FLAG_SUBREG_ZEXT: if the flag is
> + * dropped while the shared ->id survives, the pair looks like a full 64-bit
> + * equality, the dest-driven guard is bypassed and r6 wrongly becomes 0.
> + */
> +SEC("socket")
> +__failure __msg("div by zero")
> +__flag(BPF_F_TEST_STATE_FREQ)
> +__naked void zext_dest_driven_does_not_narrow_base(void)
> +{
> + asm volatile (" \
> + call %[bpf_get_prandom_u32]; \
> + r6 = r0; /* r6 low = unknown u32 */ \
> + call %[bpf_get_prandom_u32]; \
> + r0 <<= 32; \
> + r6 |= r0; /* r6 = full 64-bit unknown (base) */ \
> + w7 = w6; /* low-32 ZEXT link */ \
> + if r7 != 0 goto l_out_%=;/* r7 == 0: low 32 bits are 0 */ \
> + if r6 != 0 goto l_out_%=;/* r6 may still have high bits set */ \
[Severity: Medium]
Does this logic correctly catch a regression when a buggy verifier is tested?
If a buggy verifier incorrectly narrows r6 to exactly 0, wouldn't it evaluate
"r6 != 0" as statically false, and then fall through to the division by zero,
just like a correct verifier that sees r6 with unknown high bits?
Since both correct and buggy verifiers evaluate both branches and fall through
to the division, wouldn't this test always pass?
Would changing the branch to "if r6 == 0 goto l_out_%=;" correctly allow a
buggy verifier to skip the division and incorrectly accept the program,
failing the test?
> + r0 /= 0; /* must stay reachable */ \
> +l_out_%=: \
> + r0 = 0; \
> + exit; \
> +" :
> + : __imm(bpf_get_prandom_u32)
> + : __clobber_all);
> +}
> +
> char _license[] SEC("license") = "GPL";
> diff --git a/tools/testing/selftests/bpf/progs/verifier_reg_equal.c b/tools/testing/selftests/bpf/progs/verifier_reg_equal.c
> index dc1d8c30fb0ee..e6fbbfaeedcb7 100644
> --- a/tools/testing/selftests/bpf/progs/verifier_reg_equal.c
> +++ b/tools/testing/selftests/bpf/progs/verifier_reg_equal.c
> @@ -31,23 +31,25 @@ l1_%=: exit; \
> }
>
> SEC("socket")
> -__description("check w reg not equal if r reg upper32 bits not 0")
> -__failure __msg("R1 !read_ok")
> +__description("w reg shares r reg low32 via subreg link even if upper32 not 0")
> +__success
> __naked void subreg_equality_2(void)
> {
> asm volatile (" \
> call %[bpf_ktime_get_ns]; \
> r2 = r0; \
> - /* Upper 4-bytes of r2 may not be 0, thus insn \
> - * w3 = w2 should not propagate reg id, and \
> - * w2 < 9 comparison should not propagate \
> - * the range for r3 either. \
> + /* Upper 4-bytes of r2 may not be 0. w3 = w2 is a 32-bit \
[Severity: Low]
This isn't a bug, but does this multi-line comment follow the BPF subsystem
style guide?
The modern kernel multi-line comment style used in the BPF subsystem requires
the opening "/*" to be on its own line.
> + * zero-extending mov, so w3 shares only r2 low 32 bits \
> + * (a BPF_FLAG_SUBREG_ZEXT link) and its high bits are zero. The \
> + * w2 < 9 comparison then narrows r3 to [0, 8] via the link, \
> + * so if r3 < 9 is always taken and the illegal r1 read below \
> + * is unreachable. \
> */ \
> w3 = w2; \
> if w2 < 9 goto l0_%=; \
> exit; \
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260814231945.3884596-1-vineet.gupta@linux.dev?part=4
next prev parent reply other threads:[~2026-08-14 23:27 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-14 23:19 [RFC bpf-next 0/6] bpf: track scalar equality across the low 32 bits Vineet Gupta
2026-08-14 23:19 ` [RFC bpf-next 1/6] bpf: turn bpf_reg_state->precise into a flags field [NFC] Vineet Gupta
2026-08-14 23:19 ` [RFC bpf-next 2/6] bpf: move the linked-scalar flags into bpf_reg_state->flags [NFC] Vineet Gupta
2026-08-14 23:34 ` sashiko-bot
2026-08-14 23:19 ` [RFC bpf-next 3/6] bpf: support low-32 subreg scalar linking for zero-extending movs Vineet Gupta
2026-08-14 23:19 ` [RFC bpf-next 4/6] selftests/bpf: cover low-32 subreg-equal link " Vineet Gupta
2026-08-14 23:27 ` sashiko-bot [this message]
2026-08-14 23:19 ` [RFC bpf-next 5/6] bpf: support low-32 subreg scalar linking for sign-extending movs Vineet Gupta
2026-08-14 23:19 ` [RFC bpf-next 6/6] selftests/bpf: cover 32-bit sign-extension low-32 links Vineet Gupta
2026-08-14 23:27 ` sashiko-bot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260814232754.CF49D1F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
--cc=vineet.gupta@linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.