From: Kevin Wolf <kwolf@redhat.com>
To: Junjie Mao <junjie.mao@hotmail.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
qemu-devel@nongnu.org,
Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Subject: Re: [PATCH v2 08/13] rust: cleanup module_init!, use it from #[derive(Object)]
Date: Tue, 22 Oct 2024 22:32:34 +0200 [thread overview]
Message-ID: <ZxgL4l-itd8GjhnB@redhat.com> (raw)
In-Reply-To: <ME0P300MB1040458035970DCE9B84D6A3954C2@ME0P300MB1040.AUSP300.PROD.OUTLOOK.COM>
Am 22.10.2024 um 08:00 hat Junjie Mao geschrieben:
>
> Paolo Bonzini <pbonzini@redhat.com> writes:
>
> > On Tue, Oct 22, 2024 at 4:12 AM Junjie Mao <junjie.mao@hotmail.com> wrote:
> >> > + ($type:ident => $body:block) => {
> >> > + const _: () = {
> >> > + #[used]
> >> > + #[cfg_attr(
> >> > + not(any(target_vendor = "apple", target_os = "windows")),
> >> > + link_section = ".init_array"
> >> > + )]
> >> > + #[cfg_attr(target_vendor = "apple", link_section = "__DATA,__mod_init_func")]
> >> > + #[cfg_attr(target_os = "windows", link_section = ".CRT$XCU")]
> >> > + pub static LOAD_MODULE: extern "C" fn() = {
> >> > + extern "C" fn init_fn() {
> >>
> >> init_fn() should be unsafe fn according to the signature of
> >> register_module_init.
> >
> > I think it *can* be unsafe (which bindgen does by default). It's
> > always okay to pass a non-unsafe function as unsafe function pointer:
> >
> > fn f() {
> > println!("abc");
> > }
> >
> > fn g(pf: unsafe fn()) {
> > unsafe {
> > pf();
> > }
> > }
> >
> > fn main() {
> > g(f);
> > }
> >
> >> Being unsafe fn also makes sense here because it
> >> is the caller, not init_fn() itself, that is responsible for the safety of
> >> the unsafe code in the body.
> >
> > Isn't it the opposite? Since the caller of module_init! is responsible
> > for the safety, init_fn() itself can be safe.
>
> My understanding is that:
>
> 1. init_fn() is called by QEMU QOM subsystem with certain timing
> (e.g., called after main()) and concurrency (e.g., all init_fn()
> are called sequentially) preconditions.
Though these conditions are not a matter of safety, but of correctness.
> 2. The caller of module_init! is responsible for justifying the safety
> of their $body under the preconditions established in #1.
>
> "unsafe fn" in Rust is designed to mark functions with safety
> preconditions so that the compiler can raise an error if the caller
> forgets that it has those preconditions to uphold [1].
I don't think we expect to have preconditions here that are required for
safety (in the sense with which the term is used in Rust).
But safe code is not automatically correct.
If you added "unsafe" for every function that requires some
preconditions to be met so that it functions correctly (instead of only
so that it doesn't have undefined behaviour on the language level), then
you would annotate almost every function as "unsafe".
I think the rule of thumb for marking a function unsafe is when you have
unsafe code inside of it whose safety (not correctness!) depends on a
condition that the caller must reason about because you can't guarantee
it in the function itself.
This macro should probably only be used with code that can guarantee the
safety of its unsafe blocks in itself. The C side of constructors can't
make many guarantees anyway, and there is nobody who would reason about
them.
Kevin
next prev parent reply other threads:[~2024-10-22 20:33 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-21 16:35 [PATCH v2 00/13] rust: miscellaneous cleanups + QOM integration tests Paolo Bonzini
2024-10-21 16:35 ` [PATCH v2 01/13] meson: import rust module into a global variable Paolo Bonzini
2024-10-23 10:29 ` Manos Pitsidianakis
2024-10-21 16:35 ` [PATCH v2 02/13] meson: remove repeated search for rust_root_crate.sh Paolo Bonzini
2024-10-21 16:35 ` [PATCH v2 03/13] meson: pass rustc_args when building all crates Paolo Bonzini
2024-10-22 2:35 ` Junjie Mao
2024-10-22 15:35 ` Zhao Liu
2024-10-21 16:35 ` [PATCH v2 04/13] rust: do not use --no-size_t-is-usize Paolo Bonzini
2024-10-22 2:38 ` Junjie Mao
2024-10-23 4:24 ` Zhao Liu
2024-10-21 16:35 ` [PATCH v2 05/13] rust: remove uses of #[no_mangle] Paolo Bonzini
2024-10-23 10:48 ` Paolo Bonzini
2024-10-23 14:06 ` Zhao Liu
2024-10-23 14:13 ` Zhao Liu
2024-10-21 16:35 ` [PATCH v2 06/13] rust: modernize link_section usage for ELF platforms Paolo Bonzini
2024-10-23 15:31 ` Zhao Liu
2024-10-24 6:04 ` Paolo Bonzini
2024-10-21 16:35 ` [PATCH v2 07/13] rust: build integration test for the qemu_api crate Paolo Bonzini
2024-10-22 1:52 ` Junjie Mao
2024-10-24 17:23 ` Zhao Liu
2024-10-21 16:35 ` [PATCH v2 08/13] rust: cleanup module_init!, use it from #[derive(Object)] Paolo Bonzini
2024-10-22 2:02 ` Junjie Mao
2024-10-22 5:16 ` Paolo Bonzini
2024-10-22 6:00 ` Junjie Mao
2024-10-22 7:20 ` Paolo Bonzini
2024-10-22 20:32 ` Kevin Wolf [this message]
2024-10-23 6:46 ` Junjie Mao
2024-10-25 8:59 ` Zhao Liu
2024-10-25 9:12 ` Paolo Bonzini
2024-10-21 16:35 ` [PATCH v2 09/13] rust: clean up define_property macro Paolo Bonzini
2024-10-22 19:46 ` Kevin Wolf
2024-10-23 7:10 ` Paolo Bonzini
2024-10-23 10:38 ` Manos Pitsidianakis
2024-10-23 11:23 ` Paolo Bonzini
2024-10-25 9:17 ` Zhao Liu
2024-10-21 16:35 ` [PATCH v2 10/13] qdev: make properties array "const" Paolo Bonzini
2024-10-22 4:31 ` Philippe Mathieu-Daudé
2024-10-22 5:23 ` Paolo Bonzini
2024-10-22 21:43 ` Philippe Mathieu-Daudé
2024-10-23 7:06 ` Paolo Bonzini
2024-10-21 16:35 ` [PATCH v2 11/13] rust: make properties array immutable Paolo Bonzini
2024-10-25 11:27 ` Zhao Liu
2024-10-21 16:35 ` [PATCH v2 12/13] rust: provide safe wrapper for MaybeUninit::zeroed() Paolo Bonzini
2024-10-25 10:10 ` Zhao Liu
2024-10-21 16:35 ` [PATCH v2 13/13] rust: do not use TYPE_CHARDEV unnecessarily Paolo Bonzini
2024-10-25 10:05 ` Zhao Liu
2024-10-22 20:46 ` [PATCH v2 00/13] rust: miscellaneous cleanups + QOM integration tests Kevin Wolf
2024-10-23 7:14 ` Paolo Bonzini
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=ZxgL4l-itd8GjhnB@redhat.com \
--to=kwolf@redhat.com \
--cc=junjie.mao@hotmail.com \
--cc=manos.pitsidianakis@linaro.org \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).