From 91462db9f1c1b5db941c22efb64e7ec01d472911 Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Sun, 26 Apr 2020 08:58:22 +0530 Subject: [PATCH 1/3] [miri] Throw UB if target size and data size don't match If an extern C function is defined as ``` extern "C" { fn malloc(size: u32) -> *mut std::ffi::c_void; } ``` on a 64-bit machine(ie. pointer sizes don't match), throw an undefined behaviour. --- src/librustc_middle/mir/interpret/error.rs | 10 ++++++++++ src/librustc_middle/mir/interpret/value.rs | 7 ++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/librustc_middle/mir/interpret/error.rs b/src/librustc_middle/mir/interpret/error.rs index 2510dbcea0bdc..71a9382bc65c4 100644 --- a/src/librustc_middle/mir/interpret/error.rs +++ b/src/librustc_middle/mir/interpret/error.rs @@ -361,6 +361,11 @@ pub enum UndefinedBehaviorInfo { InvalidUndefBytes(Option), /// Working with a local that is not currently live. DeadLocal, + /// Data size is not equal to target size + ArgumentSizeMismatch { + target_size: u64, + data_size: u64, + }, } impl fmt::Debug for UndefinedBehaviorInfo { @@ -422,6 +427,11 @@ impl fmt::Debug for UndefinedBehaviorInfo { "using uninitialized data, but this operation requires initialized memory" ), DeadLocal => write!(f, "accessing a dead local variable"), + ArgumentSizeMismatch { target_size, data_size } => write!( + f, + "argument size mismatch: expected {} bytes but got {} bytes instead", + target_size, data_size + ), } } } diff --git a/src/librustc_middle/mir/interpret/value.rs b/src/librustc_middle/mir/interpret/value.rs index f3c1c87dad484..c11e50015087b 100644 --- a/src/librustc_middle/mir/interpret/value.rs +++ b/src/librustc_middle/mir/interpret/value.rs @@ -393,7 +393,12 @@ impl<'tcx, Tag> Scalar { assert_ne!(target_size.bytes(), 0, "you should never look at the bits of a ZST"); match self { Scalar::Raw { data, size } => { - assert_eq!(target_size.bytes(), u64::from(size)); + if target_size.bytes() != u64::from(size) { + throw_ub!(ArgumentSizeMismatch { + target_size: target_size.bytes(), + data_size: u64::from(size) + }); + } Scalar::check_data(data, size); Ok(data) } From b8af409a51138d46951d4fc49d3d2edd3346ecd5 Mon Sep 17 00:00:00 2001 From: Samrat Man Singh Date: Sun, 26 Apr 2020 20:11:14 +0530 Subject: [PATCH 2/3] Rename ArgumentSizeMismatch to ScalarSizeMismatch --- src/librustc_middle/mir/interpret/error.rs | 6 +++--- src/librustc_middle/mir/interpret/value.rs | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/librustc_middle/mir/interpret/error.rs b/src/librustc_middle/mir/interpret/error.rs index 71a9382bc65c4..875b514e8c81f 100644 --- a/src/librustc_middle/mir/interpret/error.rs +++ b/src/librustc_middle/mir/interpret/error.rs @@ -362,7 +362,7 @@ pub enum UndefinedBehaviorInfo { /// Working with a local that is not currently live. DeadLocal, /// Data size is not equal to target size - ArgumentSizeMismatch { + ScalarSizeMismatch { target_size: u64, data_size: u64, }, @@ -427,9 +427,9 @@ impl fmt::Debug for UndefinedBehaviorInfo { "using uninitialized data, but this operation requires initialized memory" ), DeadLocal => write!(f, "accessing a dead local variable"), - ArgumentSizeMismatch { target_size, data_size } => write!( + ScalarSizeMismatch { target_size, data_size } => write!( f, - "argument size mismatch: expected {} bytes but got {} bytes instead", + "scalar size mismatch: expected {} bytes but got {} bytes instead", target_size, data_size ), } diff --git a/src/librustc_middle/mir/interpret/value.rs b/src/librustc_middle/mir/interpret/value.rs index c11e50015087b..6e013f75ed759 100644 --- a/src/librustc_middle/mir/interpret/value.rs +++ b/src/librustc_middle/mir/interpret/value.rs @@ -394,9 +394,9 @@ impl<'tcx, Tag> Scalar { match self { Scalar::Raw { data, size } => { if target_size.bytes() != u64::from(size) { - throw_ub!(ArgumentSizeMismatch { + throw_ub!(ScalarSizeMismatch { target_size: target_size.bytes(), - data_size: u64::from(size) + data_size: u64::from(size), }); } Scalar::check_data(data, size); From c8d8c42d1ce10d945bcd8cbff3ac9858fc909abc Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sun, 26 Apr 2020 18:44:38 +0200 Subject: [PATCH 3/3] Adjust style --- src/librustc_middle/mir/interpret/error.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/librustc_middle/mir/interpret/error.rs b/src/librustc_middle/mir/interpret/error.rs index 875b514e8c81f..785aadc11faed 100644 --- a/src/librustc_middle/mir/interpret/error.rs +++ b/src/librustc_middle/mir/interpret/error.rs @@ -361,7 +361,7 @@ pub enum UndefinedBehaviorInfo { InvalidUndefBytes(Option), /// Working with a local that is not currently live. DeadLocal, - /// Data size is not equal to target size + /// Data size is not equal to target size. ScalarSizeMismatch { target_size: u64, data_size: u64,