Shims for vararg functions: check that we get the right number of "fixed" arguments · Issue #4013 · rust-lang/miri (original) (raw)
Most Miri shims use check_shim
to ensure they are called with the right ABI and right number of arguments. However, some shims emulate vararg functions. There, we currently separately call check_abi_and_shim_symbol_clash
and then check_min_arg_count
,however, that misses potential UB: when a function, like open
, is declared with 2 fixed args followed by varargs, then it is crucial that the caller uses a signature that actually involves 2 fixed args followed by varargs. If someone were to, say, declare this function as
pub fn open(path: *const c_char, ...) -> ::c_int;
and then call it as open(path, flags)
, that is Undefined Behavior!
Similarly, non-vararg shims can actually currently be invoked with a vararg import, which should also be detected as UB.
Unfortunately, emulate_foreign_item
is not even given enough information to detect this -- we are given a slice of args
, but we don't learn how many of those were passed as fixed args vs varargs. So this requires changing the rustc side of this to pass more information to find_mir_or_eval_fn
-- basically, we should pass down the full FnAbi
.