immunant / c2rust

Migrate C code to Rust
https://c2rust.com/
Other
3.81k stars 220 forks source link

analyze: ICE on pointer transmute #996

Open spernsteiner opened 1 year ago

spernsteiner commented 1 year ago
unsafe fn f(x: *const u8) -> *const i8 {
    std::mem::transmute(x)
}

Triggers an internal compiler error:

visit_terminator(_0 = std::intrinsics::transmute::<*const u8, *const i8>(move _2) -> [return: bb1, unwind: bb2])
unsafe extern "rust-intrinsic" fn(*const u8) -> *const i8 {std::intrinsics::transmute::<*const u8, *const i8>} is trivial: false
name: "transmute"
callee = UnknownDef(Direct { ty: unsafe extern "rust-intrinsic" fn(*const u8) -> *const i8 {std::intrinsics::transmute::<*const u8, *const i8>}, def_id: DefId(2:1760 ~ core[480a]::intrinsics::{extern#1}::transmute), substs: [*const u8, *const i8], is_foreign: true })
error: internal compiler error: compiler/rustc_middle/src/ty/instance.rs:321:17: Instance::mono: DefId(2:1760 ~ core[480a]::intrinsics::{extern#1}::transmute) has type parameters

thread 'rustc' panicked at 'Box<dyn Any>', /rustc/d394408fb38c4de61f765a3ed5189d2731a1da91/compiler/rustc_errors/src/lib.rs:1392:9
stack backtrace:
   0: std::panicking::begin_panic::<rustc_errors::ExplicitBug>
   1: std::panic::panic_any::<rustc_errors::ExplicitBug>
   2: <rustc_errors::HandlerInner>::bug::<&alloc::string::String>
   3: <rustc_errors::Handler>::bug::<&alloc::string::String>
   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::opt_span_bug_fmt::<rustc_span::span_encoding::Span>
   6: rustc_middle::util::bug::bug_fmt
   7: <rustc_middle::ty::list::List<rustc_middle::ty::subst::GenericArg>>::fill_item::<<rustc_middle::ty::instance::Instance>::mono::{closure#0}>
   8: <rustc_middle::ty::list::List<rustc_middle::ty::subst::GenericArg>>::for_item::<<rustc_middle::ty::instance::Instance>::mono::{closure#0}>
   9: <rustc_middle::ty::instance::Instance>::mono
  10: c2rust_analyze::context::GlobalAnalysisCtxt::known_fn
             at ./src/context.rs:699:43
  11: c2rust_analyze::dataflow::type_check::TypeChecker::visit_call
             at ./src/dataflow/type_check.rs:403:19

transmute is declared in an extern block, but has type parameters, which seems to be confusing our attempt to get its symbol name for checking against known libc functions. We should probably just exclude Abi::RustIntrinsic extern fns from the normal known_fn checking.