Skip to content

Commit 5f5c478

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

File tree

2 files changed

+10
-4
lines changed

2 files changed

+10
-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: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ pub mod tls;
1616
use log::trace;
1717

1818
use rustc_middle::{mir, ty};
19+
use rustc_target::spec::abi::Abi;
1920

2021
use crate::*;
2122
use helpers::check_arg_count;
@@ -25,6 +26,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
2526
fn find_mir_or_eval_fn(
2627
&mut self,
2728
instance: ty::Instance<'tcx>,
29+
abi: Abi,
2830
args: &[OpTy<'tcx, Tag>],
2931
ret: Option<(PlaceTy<'tcx, Tag>, mir::BasicBlock)>,
3032
unwind: Option<mir::BasicBlock>,
@@ -40,6 +42,10 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
4042
}
4143
}
4244

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

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

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

0 commit comments

Comments
 (0)