Skip to content

cargo-clippy panics on MaybeUninit::<AtomicPtr<T>>::uninit().assume_init() #128547

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
yukiiiteru opened this issue Aug 2, 2024 · 4 comments
Closed
Labels
C-bug Category: This is a bug. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@yukiiiteru
Copy link

Code

Here is the MVP code, there must be MaybeUninit::uninit().assume_init() for AtomicPtr with generic type T:

use std::{mem::MaybeUninit, sync::atomic::AtomicPtr};

struct Foo<T> {
    ptr: AtomicPtr<T>,
}

impl<T> Foo<T> {
    unsafe fn foo() {
        let _: Self = MaybeUninit::uninit().assume_init();
    }
}

cargo build works, but cargo clippy crashes.

Meta

rustc --version --verbose:

stable:

rustc 1.80.0 (051478957 2024-07-21)
binary: rustc
commit-hash: 051478957371ee0084a7c0913941d2a8c4757bb9
commit-date: 2024-07-21
host: x86_64-unknown-linux-gnu
release: 1.80.0
LLVM version: 18.1.7

nightly:

rustc 1.82.0-nightly (8e86c9567 2024-08-01)
binary: rustc
commit-hash: 8e86c9567154dc5a9ada15ab196d23eae2bd7d89
commit-date: 2024-08-01
host: x86_64-unknown-linux-gnu
release: 1.82.0-nightly
LLVM version: 19.1.0

Both stable and nightly builds crash.

Error output

error: internal compiler error: /rustc/8e86c9567154dc5a9ada15ab196d23eae2bd7d89/compiler/rustc_middle/src/ty/layout.rs:961:21: failed to get layout for `std::sync::atomic::AtomicPtr<T>`: Unknown(Alias(Projection, AliasTy { args: [T/#0], def_id: DefId(2:2227 ~ core[5b06]::ptr::metadata::Pointee::Metadata), .. })),
                                despite it being a field (#0) of an existing layout: TyAndLayout {
                                    ty: Foo<T>,
                                    layout: Layout {
                                        size: Size(8 bytes),
                                        align: AbiAndPrefAlign {
                                            abi: Align(8 bytes),
                                            pref: Align(8 bytes),
                                        },
                                        abi: Aggregate {
                                            sized: true,
                                        },
                                        fields: Arbitrary {
                                            offsets: [
                                                Size(0 bytes),
                                            ],
                                            memory_index: [
                                                0,
                                            ],
                                        },
                                        largest_niche: None,
                                        variants: Single {
                                            index: 0,
                                        },
                                        max_repr_align: Some(
                                            Align(8 bytes),
                                        ),
                                        unadjusted_abi_align: Align(8 bytes),
                                    },
                                }
Backtrace

stable:

$ RUST_BACKTRACE=1 cargo clippy
    Checking ice-reproduce v0.1.0 (/tmp/ice-reproduce)
warning: struct `Foo` is never constructed
 --> src/lib.rs:3:8
  |
3 | struct Foo<T> {
  |        ^^^
  |
  = note: `#[warn(dead_code)]` on by default

warning: associated function `foo` is never used
 --> src/lib.rs:8:15
  |
7 | impl<T> Foo<T> {
  | -------------- associated function in this implementation
8 |     unsafe fn foo() {
  |               ^^^

error: internal compiler error: /rustc/8e86c9567154dc5a9ada15ab196d23eae2bd7d89/compiler/rustc_middle/src/ty/layout.rs:961:21: failed to get layout for `std::sync::atomic::AtomicPtr<T>`: Unknown(Alias(Projection, AliasTy { args: [T/#0], def_id: DefId(2:2227 ~ core[5b06]::ptr::metadata::Pointee::Metadata), .. })),
                                despite it being a field (#0) of an existing layout: TyAndLayout {
                                    ty: Foo<T>,
                                    layout: Layout {
                                        size: Size(8 bytes),
                                        align: AbiAndPrefAlign {
                                            abi: Align(8 bytes),
                                            pref: Align(8 bytes),
                                        },
                                        abi: Aggregate {
                                            sized: true,
                                        },
                                        fields: Arbitrary {
                                            offsets: [
                                                Size(0 bytes),
                                            ],
                                            memory_index: [
                                                0,
                                            ],
                                        },
                                        largest_niche: None,
                                        variants: Single {
                                            index: 0,
                                        },
                                        max_repr_align: Some(
                                            Align(8 bytes),
                                        ),
                                        unadjusted_abi_align: Align(8 bytes),
                                    },
                                }

thread 'rustc' panicked at /rustc/8e86c9567154dc5a9ada15ab196d23eae2bd7d89/compiler/rustc_middle/src/ty/layout.rs:961:21:
Box<dyn Any>
stack backtrace:
   0: std::panicking::begin_panic::<rustc_errors::ExplicitBug>
   1: <rustc_errors::diagnostic::BugAbort as rustc_errors::diagnostic::EmissionGuarantee>::emit_producing_guarantee
   2: rustc_middle::util::bug::opt_span_bug_fmt::<rustc_span::span_encoding::Span>::{closure#0}
   3: rustc_middle::ty::context::tls::with_opt::<rustc_middle::util::bug::opt_span_bug_fmt<rustc_span::span_encoding::Span>::{closure#0}, !>::{closure#0}
   4: rustc_middle::ty::context::tls::with_context_opt::<rustc_middle::ty::context::tls::with_opt<rustc_middle::util::bug::opt_span_bug_fmt<rustc_span::span_encoding::Span>::{closure#0}, !>::{closure#0}, !>
   5: rustc_middle::util::bug::bug_fmt
   6: <rustc_const_eval::interpret::eval_context::InterpCx<rustc_const_eval::const_eval::machine::CompileTimeMachine>>::project_field::<rustc_const_eval::interpret::operand::OpTy>
   7: <rustc_const_eval::interpret::validity::ValidityVisitor<rustc_const_eval::const_eval::machine::CompileTimeMachine> as rustc_const_eval::interpret::visitor::ValueVisitor<rustc_const_eval::const_eval::machine::CompileTimeMachine>>::visit_value
   8: <rustc_const_eval::interpret::eval_context::InterpCx<rustc_const_eval::const_eval::machine::CompileTimeMachine>>::validate_operand_internal
   9: rustc_const_eval::util::check_validity_requirement::check_validity_requirement
  10: <rustc_const_eval::provide::{closure#2} as core::ops::function::FnOnce<(rustc_middle::ty::context::TyCtxt, (rustc_middle::ty::layout::ValidityRequirement, rustc_middle::ty::ParamEnvAnd<rustc_middle::ty::Ty>))>>::call_once
      [... omitted 3 frames ...]
  11: clippy_utils::ty::is_uninit_value_valid_for_ty
  12: clippy_lints::methods::uninit_assumed_init::check
  13: <clippy_lints::methods::Methods>::check_methods
  14: <clippy_lints::methods::Methods as rustc_lint::passes::LateLintPass>::check_expr
  15: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_expr::{closure#0}::{closure#0}
  16: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_expr
  17: rustc_hir::intravisit::walk_block::<rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass>>
  18: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_block
  19: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_expr::{closure#0}::{closure#0}
  20: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_expr
  21: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_nested_body
  22: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_fn
  23: <rustc_lint::late::LateContextAndPass<rustc_lint::late::RuntimeCombinedLateLintPass> as rustc_hir::intravisit::Visitor>::visit_nested_item
  24: rustc_lint::late::check_crate::{closure#0}
  25: rustc_lint::late::check_crate
  26: rustc_interface::passes::analysis
      [... omitted 1 frame ...]
  27: rustc_interface::interface::run_compiler::<core::result::Result<(), rustc_span::ErrorGuaranteed>, rustc_driver_impl::run_compiler::{closure#0}>::{closure#1}
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

note: we would appreciate a bug report: https://github.com/rust-lang/rust-clippy/issues/new?template=ice.yml

note: please make sure that you have updated to the latest nightly

note: please attach the file at `/tmp/ice-reproduce/rustc-ice-2024-08-02T14_18_52-3442737.txt` to your bug report

note: compiler flags: --crate-type lib -C embed-bitcode=no -C debuginfo=2 -C incremental=[REDACTED] -C target-feature=+aes,+avx2,+bmi1,+bmi2,+f16c,+fma,+fxsr,+lzcnt,+movbe,+pclmulqdq,+popcnt,+rdrand,+rdseed,+xsave,+xsaveopt -C force-frame-pointers=yes

note: some of the compiler flags provided by cargo are hidden

query stack during panic:
#0 [check_validity_requirement] checking validity requirement for `Foo<T>`: allows being left uninitialized
#1 [analysis] running analysis passes on this crate
end of query stack
note: Clippy version: clippy 0.1.82 (8e86c95 2024-08-01)

warning: the type `Foo<T>` does not permit being left uninitialized
 --> src/lib.rs:9:23
  |
9 |         let _: Self = MaybeUninit::uninit().assume_init();
  |                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |                       |
  |                       this code causes undefined behavior when executed
  |                       help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
  |
note: raw pointers must be initialized (in this struct field)
 --> src/lib.rs:4:5
  |
4 |     ptr: AtomicPtr<T>,
  |     ^^^^^^^^^^^^^^^^^
  = note: `#[warn(invalid_value)]` on by default

warning: `ice-reproduce` (lib) generated 3 warnings
error: could not compile `ice-reproduce` (lib); 3 warnings emitted

nightly has the same messages.

@yukiiiteru yukiiiteru added C-bug Category: This is a bug. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Aug 2, 2024
@rustbot rustbot added the needs-triage This issue may need triage. Remove it if it has been sufficiently triaged. label Aug 2, 2024
@ChrisDenton
Copy link
Member

Clippy shouldn't panic here but do note that MaybeUninit::uninit().assume_init() is documented as causing immediate undefined behaviour.

@y21
Copy link
Member

y21 commented Aug 2, 2024

This looks very similar to #119620, probably the same underlying issue that's causing the ICE here?

@yukiiiteru
Copy link
Author

Clippy shouldn't panic here but do note that MaybeUninit::uninit().assume_init() is documented as causing immediate undefined behaviour.

Yes it's really an UB, but it's not a reason to panic.

@Noratrieb
Copy link
Member

yes, this is a duplicate of #119620
closing as such, thank you for the report!

@Noratrieb Noratrieb closed this as not planned Won't fix, can't repro, duplicate, stale Aug 2, 2024
@saethlin saethlin removed the needs-triage This issue may need triage. Remove it if it has been sufficiently triaged. label Aug 3, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
C-bug Category: This is a bug. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

No branches or pull requests

6 participants