From 79a53cf7bafa4b4e6d214a35f878d8e909c43e9f Mon Sep 17 00:00:00 2001 From: morenzg Date: Thu, 9 Jun 2016 13:06:17 -0400 Subject: [PATCH 1/2] Fix UB in transmute --- src/libstd/sys/common/args.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libstd/sys/common/args.rs b/src/libstd/sys/common/args.rs index e877391fb8b56..2e1264d818492 100644 --- a/src/libstd/sys/common/args.rs +++ b/src/libstd/sys/common/args.rs @@ -82,7 +82,7 @@ mod imp { } fn get_global_ptr() -> *mut Option>>> { - unsafe { mem::transmute(&GLOBAL_ARGS_PTR) } + unsafe { mem::transmute(&mut GLOBAL_ARGS_PTR) } } } From 80d29569a9bd0c0010f7ca4f75029ac181fbb43c Mon Sep 17 00:00:00 2001 From: morenzg Date: Sun, 12 Jun 2016 11:34:38 -0400 Subject: [PATCH 2/2] Simplify unix argument handling --- src/libstd/lib.rs | 1 + src/libstd/sys/common/args.rs | 18 +++++------------- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/src/libstd/lib.rs b/src/libstd/lib.rs index 135ea8a5e7cb4..f8d79387644ee 100644 --- a/src/libstd/lib.rs +++ b/src/libstd/lib.rs @@ -227,6 +227,7 @@ #![feature(core_float)] #![feature(core_intrinsics)] #![feature(dropck_parametricity)] +#![feature(drop_types_in_const)] #![feature(float_extras)] #![feature(float_from_str_radix)] #![feature(fnbox)] diff --git a/src/libstd/sys/common/args.rs b/src/libstd/sys/common/args.rs index 2e1264d818492..419e867265059 100644 --- a/src/libstd/sys/common/args.rs +++ b/src/libstd/sys/common/args.rs @@ -45,12 +45,11 @@ mod imp { use prelude::v1::*; use libc::c_char; - use mem; use ffi::CStr; use sys_common::mutex::Mutex; - static mut GLOBAL_ARGS_PTR: usize = 0; + static mut GLOBAL_ARGS: Option>> = None; static LOCK: Mutex = Mutex::new(); pub unsafe fn init(argc: isize, argv: *const *const u8) { @@ -59,32 +58,25 @@ mod imp { }).collect(); LOCK.lock(); - let ptr = get_global_ptr(); - assert!((*ptr).is_none()); - (*ptr) = Some(box args); + assert!(GLOBAL_ARGS.is_none()); + GLOBAL_ARGS = Some(args); LOCK.unlock(); } pub unsafe fn cleanup() { LOCK.lock(); - *get_global_ptr() = None; + GLOBAL_ARGS = None; LOCK.unlock(); } pub fn clone() -> Option>> { unsafe { LOCK.lock(); - let ptr = get_global_ptr(); - let ret = (*ptr).as_ref().map(|s| (**s).clone()); + let ret = GLOBAL_ARGS.clone(); LOCK.unlock(); return ret } } - - fn get_global_ptr() -> *mut Option>>> { - unsafe { mem::transmute(&mut GLOBAL_ARGS_PTR) } - } - } #[cfg(any(target_os = "macos",