All of lore.kernel.org
 help / color / mirror / Atom feed
From: Boqun Feng <boqun.feng@gmail.com>
To: Tamir Duberstein <tamird@gmail.com>
Cc: "Masahiro Yamada" <masahiroy@kernel.org>,
	"Nathan Chancellor" <nathan@kernel.org>,
	"Miguel Ojeda" <ojeda@kernel.org>,
	"Alex Gaynor" <alex.gaynor@gmail.com>,
	"Gary Guo" <gary@garyguo.net>,
	"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
	"Benno Lossin" <benno.lossin@proton.me>,
	"Andreas Hindborg" <a.hindborg@kernel.org>,
	"Alice Ryhl" <aliceryhl@google.com>,
	"Trevor Gross" <tmgross@umich.edu>,
	"Danilo Krummrich" <dakr@kernel.org>,
	"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
	"Rafael J. Wysocki" <rafael@kernel.org>,
	"Brendan Higgins" <brendan.higgins@linux.dev>,
	"David Gow" <davidgow@google.com>, "Rae Moar" <rmoar@google.com>,
	"Bjorn Helgaas" <bhelgaas@google.com>,
	"Luis Chamberlain" <mcgrof@kernel.org>,
	"Russ Weight" <russ.weight@linux.dev>,
	"Rob Herring" <robh@kernel.org>,
	"Saravana Kannan" <saravanak@google.com>,
	"Abdiel Janulgue" <abdiel.janulgue@gmail.com>,
	"Daniel Almeida" <daniel.almeida@collabora.com>,
	"Robin Murphy" <robin.murphy@arm.com>,
	"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
	"Maxime Ripard" <mripard@kernel.org>,
	"Thomas Zimmermann" <tzimmermann@suse.de>,
	"David Airlie" <airlied@gmail.com>,
	"Simona Vetter" <simona@ffwll.ch>,
	"FUJITA Tomonori" <fujita.tomonori@gmail.com>,
	"Nicolas Schier" <nicolas.schier@linux.dev>,
	"Frederic Weisbecker" <frederic@kernel.org>,
	"Lyude Paul" <lyude@redhat.com>,
	"Thomas Gleixner" <tglx@linutronix.de>,
	"Anna-Maria Behnsen" <anna-maria@linutronix.de>,
	linux-kbuild@vger.kernel.org, linux-kernel@vger.kernel.org,
	rust-for-linux@vger.kernel.org, linux-kselftest@vger.kernel.org,
	kunit-dev@googlegroups.com, linux-pci@vger.kernel.org,
	linux-block@vger.kernel.org, devicetree@vger.kernel.org,
	dri-devel@lists.freedesktop.org, netdev@vger.kernel.org
Subject: Re: [PATCH v8 6/6] rust: enable `clippy::ref_as_ptr` lint
Date: Tue, 15 Apr 2025 13:51:08 -0700	[thread overview]
Message-ID: <67fec6c1.0c0a0220.f907e.c6dd@mx.google.com> (raw)
In-Reply-To: <CAJ-ks9=G1ajyT8gwLHyvHW09Z2gG=Geg7LDS6iyRyqx_wyp5Sg@mail.gmail.com>

On Tue, Apr 15, 2025 at 04:10:01PM -0400, Tamir Duberstein wrote:
> On Tue, Apr 15, 2025 at 2:18 PM Boqun Feng <boqun.feng@gmail.com> wrote:
> >
> > On Tue, Apr 15, 2025 at 01:58:41PM -0400, Tamir Duberstein wrote:
> > > Hi Boqun, thanks for having a look!
> > >
> > > On Tue, Apr 15, 2025 at 1:37 PM Boqun Feng <boqun.feng@gmail.com> wrote:
> > > >
> > > > On Wed, Apr 09, 2025 at 10:47:23AM -0400, Tamir Duberstein wrote:
> > > > > In Rust 1.78.0, Clippy introduced the `ref_as_ptr` lint [1]:
> > > > >
> > > > > > Using `as` casts may result in silently changing mutability or type.
> > > > >
> > > > > While this doesn't eliminate unchecked `as` conversions, it makes such
> > > > > conversions easier to scrutinize.  It also has the slight benefit of
> > > > > removing a degree of freedom on which to bikeshed. Thus apply the
> > > > > changes and enable the lint -- no functional change intended.
> > > > >
> > > > > Link: https://rust-lang.github.io/rust-clippy/master/index.html#ref_as_ptr [1]
> > > > > Suggested-by: Benno Lossin <benno.lossin@proton.me>
> > > > > Link: https://lore.kernel.org/all/D8PGG7NTWB6U.3SS3A5LN4XWMN@proton.me/
> > > > > Signed-off-by: Tamir Duberstein <tamird@gmail.com>
> > > > > ---
> > > > >  Makefile                 |  1 +
> > > > >  rust/bindings/lib.rs     |  1 +
> > > > >  rust/kernel/device_id.rs |  3 ++-
> > > > >  rust/kernel/fs/file.rs   |  3 ++-
> > > > >  rust/kernel/str.rs       |  6 ++++--
> > > > >  rust/kernel/uaccess.rs   | 10 ++++------
> > > > >  rust/uapi/lib.rs         |  1 +
> > > > >  7 files changed, 15 insertions(+), 10 deletions(-)
> > > > >
> > > > > diff --git a/Makefile b/Makefile
> > > > > index eb5a942241a2..2a16e02f26db 100644
> > > > > --- a/Makefile
> > > > > +++ b/Makefile
> > > > > @@ -485,6 +485,7 @@ export rust_common_flags := --edition=2021 \
> > > > >                           -Wclippy::no_mangle_with_rust_abi \
> > > > >                           -Wclippy::ptr_as_ptr \
> > > > >                           -Wclippy::ptr_cast_constness \
> > > > > +                         -Wclippy::ref_as_ptr \
> > > > >                           -Wclippy::undocumented_unsafe_blocks \
> > > > >                           -Wclippy::unnecessary_safety_comment \
> > > > >                           -Wclippy::unnecessary_safety_doc \
> > > > > diff --git a/rust/bindings/lib.rs b/rust/bindings/lib.rs
> > > > > index b105a0d899cc..2b69016070c6 100644
> > > > > --- a/rust/bindings/lib.rs
> > > > > +++ b/rust/bindings/lib.rs
> > > > > @@ -27,6 +27,7 @@
> > > > >  #[allow(dead_code)]
> > > > >  #[allow(clippy::cast_lossless)]
> > > > >  #[allow(clippy::ptr_as_ptr)]
> > > > > +#[allow(clippy::ref_as_ptr)]
> > > > >  #[allow(clippy::undocumented_unsafe_blocks)]
> > > > >  mod bindings_raw {
> > > > >      // Manual definition for blocklisted types.
> > > > > diff --git a/rust/kernel/device_id.rs b/rust/kernel/device_id.rs
> > > > > index 4063f09d76d9..37cc03d1df4c 100644
> > > > > --- a/rust/kernel/device_id.rs
> > > > > +++ b/rust/kernel/device_id.rs
> > > > > @@ -136,7 +136,8 @@ impl<T: RawDeviceId, U, const N: usize> IdTable<T, U> for IdArray<T, U, N> {
> > > > >      fn as_ptr(&self) -> *const T::RawType {
> > > > >          // This cannot be `self.ids.as_ptr()`, as the return pointer must have correct provenance
> > > > >          // to access the sentinel.
> > > > > -        (self as *const Self).cast()
> > > > > +        let this: *const Self = self;
> > > >
> > > > Hmm.. so this lint usually just requires to use a let statement instead
> > > > of as expression when casting a reference to a pointer? Not 100%
> > > > convinced this results into better code TBH..
> > >
> > > The rationale is in the lint description and quoted in the commit
> > > message: "Using `as` casts may result in silently changing mutability
> > > or type.".
> > >
> >
> > Could you show me how you can silently change the mutability or type? A
> > simple try like below doesn't compile:
> >
> >         let x = &42;
> >         let ptr = x as *mut i32; // <- error
> >         let another_ptr = x as *const i64; // <- error
> 
> I think the point is that the meaning of an `as` cast can change when
> the type of `x` changes, which can happen at a distance. The example

So my example shows that you can only use `as` to convert a `&T` into a
`*const T`, no matter how far it happens, and..

> shown in the clippy docs uses `as _`, which is where you get into real
> trouble.
> 

... no matter whether `as _` is used or not. Of course once you have a
`*const T`, using `as` can change it to a different type or mutability,
but that's a different problem. Your argument still lacks convincing
evidences or examples showing this is a real trouble. For example, if
you have a `x` of type `&i32`, and do a `x as _` somewhere, you will
have a compiler error once compilers infers a type that is not `*const
i32` for `_`. If your argument being it's better do the
reference-to-pointer conversion explicitly, then that makes some sense,
but I still don't think we need to do it globablly.

> > also from the link document you shared, looks like the suggestion is to
> > use core::ptr::from_{ref,mut}(), was this ever considered?
> 
> I considered it, but I thought it was ugly. We don't have a linter to
> enforce it, so I'd be surprised if people reached for it.
> 

I think avoiding the extra line of `let` is a win, also I don't get why
you feel it's *ugly*: having the extra `let` line is ugly to me ;-)

Regards,
Boqun

[...]

  reply	other threads:[~2025-04-15 20:51 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-04-09 14:47 [PATCH v8 0/6] rust: reduce `as` casts, enable related lints Tamir Duberstein
2025-04-09 14:47 ` [PATCH v8 1/6] rust: enable `clippy::ptr_as_ptr` lint Tamir Duberstein
2025-04-15 17:03   ` Lyude Paul
2025-04-09 14:47 ` [PATCH v8 2/6] rust: enable `clippy::ptr_cast_constness` lint Tamir Duberstein
2025-04-09 14:47 ` [PATCH v8 3/6] rust: enable `clippy::as_ptr_cast_mut` lint Tamir Duberstein
2025-04-09 14:47 ` [PATCH v8 4/6] rust: enable `clippy::as_underscore` lint Tamir Duberstein
2025-04-09 14:47 ` [PATCH v8 5/6] rust: enable `clippy::cast_lossless` lint Tamir Duberstein
2025-04-09 14:47 ` [PATCH v8 6/6] rust: enable `clippy::ref_as_ptr` lint Tamir Duberstein
2025-04-14 10:52   ` Benno Lossin
2025-04-15 17:37   ` Boqun Feng
2025-04-15 17:58     ` Tamir Duberstein
2025-04-15 18:17       ` Boqun Feng
2025-04-15 20:10         ` Tamir Duberstein
2025-04-15 20:51           ` Boqun Feng [this message]
2025-04-15 20:59             ` Tamir Duberstein
2025-04-15 23:03               ` Boqun Feng
2025-04-15 23:08                 ` Tamir Duberstein
2025-04-15 23:11                   ` Boqun Feng

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=67fec6c1.0c0a0220.f907e.c6dd@mx.google.com \
    --to=boqun.feng@gmail.com \
    --cc=a.hindborg@kernel.org \
    --cc=abdiel.janulgue@gmail.com \
    --cc=airlied@gmail.com \
    --cc=alex.gaynor@gmail.com \
    --cc=aliceryhl@google.com \
    --cc=anna-maria@linutronix.de \
    --cc=benno.lossin@proton.me \
    --cc=bhelgaas@google.com \
    --cc=bjorn3_gh@protonmail.com \
    --cc=brendan.higgins@linux.dev \
    --cc=dakr@kernel.org \
    --cc=daniel.almeida@collabora.com \
    --cc=davidgow@google.com \
    --cc=devicetree@vger.kernel.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=frederic@kernel.org \
    --cc=fujita.tomonori@gmail.com \
    --cc=gary@garyguo.net \
    --cc=gregkh@linuxfoundation.org \
    --cc=kunit-dev@googlegroups.com \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-kbuild@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=lyude@redhat.com \
    --cc=maarten.lankhorst@linux.intel.com \
    --cc=masahiroy@kernel.org \
    --cc=mcgrof@kernel.org \
    --cc=mripard@kernel.org \
    --cc=nathan@kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=nicolas.schier@linux.dev \
    --cc=ojeda@kernel.org \
    --cc=rafael@kernel.org \
    --cc=rmoar@google.com \
    --cc=robh@kernel.org \
    --cc=robin.murphy@arm.com \
    --cc=russ.weight@linux.dev \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=saravanak@google.com \
    --cc=simona@ffwll.ch \
    --cc=tamird@gmail.com \
    --cc=tglx@linutronix.de \
    --cc=tmgross@umich.edu \
    --cc=tzimmermann@suse.de \
    /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.