Skip to content

Commit 8f7917c

Browse files
author
Nym Seddon
committed
Add ABI check for shims
Resolves #1631
1 parent 903bfd8 commit 8f7917c

File tree

2 files changed

+11
-4
lines changed

2 files changed

+11
-4
lines changed

src/machine.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -353,12 +353,12 @@ impl<'mir, 'tcx> Machine<'mir, 'tcx> for Evaluator<'mir, 'tcx> {
353353
fn find_mir_or_eval_fn(
354354
ecx: &mut InterpCx<'mir, 'tcx, Self>,
355355
instance: ty::Instance<'tcx>,
356-
_abi: Abi,
356+
abi: Abi,
357357
args: &[OpTy<'tcx, Tag>],
358358
ret: Option<(PlaceTy<'tcx, Tag>, mir::BasicBlock)>,
359359
unwind: Option<mir::BasicBlock>,
360360
) -> InterpResult<'tcx, Option<&'mir mir::Body<'tcx>>> {
361-
ecx.find_mir_or_eval_fn(instance, args, ret, unwind)
361+
ecx.find_mir_or_eval_fn(instance, abi, args, ret, unwind)
362362
}
363363

364364
#[inline(always)]

src/shims/mod.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ pub mod tls;
1515

1616
use log::trace;
1717

18+
use rustc_middle::ty::layout::HasParamEnv;
1819
use rustc_middle::{mir, ty};
20+
use rustc_target::spec::abi::Abi;
1921

2022
use crate::*;
2123
use helpers::check_arg_count;
@@ -25,6 +27,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
2527
fn find_mir_or_eval_fn(
2628
&mut self,
2729
instance: ty::Instance<'tcx>,
30+
abi: Abi,
2831
args: &[OpTy<'tcx, Tag>],
2932
ret: Option<(PlaceTy<'tcx, Tag>, mir::BasicBlock)>,
3033
unwind: Option<mir::BasicBlock>,
@@ -40,6 +43,10 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
4043
}
4144
}
4245

46+
if abi != Abi::C {
47+
throw_ub_format!("calling a function with ABI {:?} using ABI {:?}", Abi::C, abi)
48+
}
49+
4350
// Try to see if we can do something about foreign items.
4451
if this.tcx.is_foreign_item(instance.def_id()) {
4552
// An external function call that does not have a MIR body. We either find MIR elsewhere
@@ -72,8 +79,8 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
7279
return Ok(false);
7380
}
7481

75-
let req_align = this
76-
.force_bits(this.read_scalar(align_op)?.check_init()?, this.pointer_size())?;
82+
let req_align =
83+
this.force_bits(this.read_scalar(align_op)?.check_init()?, this.pointer_size())?;
7784

7885
// Stop if the alignment is not a power of two.
7986
if !req_align.is_power_of_two() {

0 commit comments

Comments
 (0)