Skip to content

Commit 288a7e8

Browse files
kpcyrdkamadak
authored andcommitted
Remove some usage of unsafe rust
1 parent 4874c69 commit 288a7e8

File tree

4 files changed

+25
-30
lines changed

4 files changed

+25
-30
lines changed

src/endian.rs

+15-20
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,8 @@ pub struct LittleEndian;
4646
macro_rules! generate_load {
4747
($name:ident, $int_type:ident, $from_func:ident) => (
4848
fn $name(buf: &[u8], offset: usize) -> $int_type {
49-
// Check if the specified range of the slice is valid
50-
// before transmute(). This will also detect the
51-
// wrap-around of (offset + size_of) in the release mode.
52-
let buf = &buf[offset .. offset + mem::size_of::<$int_type>()];
53-
let ptr = buf.as_ptr() as *const $int_type;
54-
let num = unsafe { mem::transmute(*ptr) };
49+
let mut num = [0u8; mem::size_of::<$int_type>()];
50+
num.copy_from_slice(&buf[offset .. offset + mem::size_of::<$int_type>()]);
5551
$int_type::$from_func(num)
5652
}
5753
)
@@ -61,29 +57,28 @@ macro_rules! generate_write {
6157
($name:ident, $int_type:ident, $type_size:expr, $to_func:ident) => (
6258
fn $name<W>(w: &mut W, num: $int_type)
6359
-> io::Result<()> where W: io::Write {
64-
let buf: [u8; $type_size] =
65-
unsafe { mem::transmute(num.$to_func()) };
60+
let buf = num.$to_func();
6661
w.write_all(&buf)
6762
}
6863
)
6964
}
7065

7166
impl Endian for BigEndian {
72-
generate_load!(loadu16, u16, from_be);
73-
generate_load!(loadu32, u32, from_be);
74-
generate_load!(loadu64, u64, from_be);
75-
generate_write!(writeu16, u16, 2, to_be);
76-
generate_write!(writeu32, u32, 4, to_be);
77-
generate_write!(writeu64, u64, 8, to_be);
67+
generate_load!(loadu16, u16, from_be_bytes);
68+
generate_load!(loadu32, u32, from_be_bytes);
69+
generate_load!(loadu64, u64, from_be_bytes);
70+
generate_write!(writeu16, u16, 2, to_be_bytes);
71+
generate_write!(writeu32, u32, 4, to_be_bytes);
72+
generate_write!(writeu64, u64, 8, to_be_bytes);
7873
}
7974

8075
impl Endian for LittleEndian {
81-
generate_load!(loadu16, u16, from_le);
82-
generate_load!(loadu32, u32, from_le);
83-
generate_load!(loadu64, u64, from_le);
84-
generate_write!(writeu16, u16, 2, to_le);
85-
generate_write!(writeu32, u32, 4, to_le);
86-
generate_write!(writeu64, u64, 8, to_le);
76+
generate_load!(loadu16, u16, from_le_bytes);
77+
generate_load!(loadu32, u32, from_le_bytes);
78+
generate_load!(loadu64, u64, from_le_bytes);
79+
generate_write!(writeu16, u16, 2, to_le_bytes);
80+
generate_write!(writeu32, u32, 4, to_le_bytes);
81+
generate_write!(writeu64, u64, 8, to_le_bytes);
8782
}
8883

8984
#[cfg(test)]

src/util.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ const ASCII_A: u8 = 0x41;
3434
const ASCII_Z: u8 = 0x5a;
3535

3636
pub fn read8<R>(reader: &mut R) -> Result<u8, io::Error> where R: io::Read {
37-
let mut buf: [u8; 1] = unsafe { ::std::mem::uninitialized() };
37+
let mut buf = [0u8; 1];
3838
reader.read_exact(&mut buf).and(Ok(buf[0]))
3939
}
4040

4141
pub fn read16<R>(reader: &mut R) -> Result<u16, io::Error> where R: io::Read {
42-
let mut buf: [u8; 2] = unsafe { ::std::mem::uninitialized() };
42+
let mut buf = [0u8; 2];
4343
reader.read_exact(&mut buf)?;
4444
Ok(((buf[0] as u16) << 8) + buf[1] as u16)
4545
}

src/value.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -357,10 +357,10 @@ fn parse_rational<'a, E>(data: &'a [u8], offset: usize, count: usize)
357357

358358
fn parse_sbyte<'a>(data: &'a [u8], offset: usize, count: usize)
359359
-> Value<'a> {
360-
let uslice = &data[offset .. offset + count];
361-
let islice = unsafe { ::std::slice::from_raw_parts(
362-
uslice.as_ptr() as *const i8, count) };
363-
Value::SByte(islice.to_vec())
360+
let bytes = data[offset .. offset + count].into_iter()
361+
.map(|x| *x as i8)
362+
.collect();
363+
Value::SByte(bytes)
364364
}
365365

366366
fn parse_undefined<'a>(data: &'a [u8], offset: usize, count: usize)

src/writer.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626

2727
use std::io;
2828
use std::io::{Seek, SeekFrom, Write};
29-
use std::slice;
3029

3130
use endian::{Endian, BigEndian, LittleEndian};
3231
use error::Error;
@@ -527,9 +526,10 @@ fn compose_value<E>(value: &Value)
527526
Ok((5, vec.len(), buf))
528527
},
529528
Value::SByte(ref vec) => {
530-
let uslice = unsafe { slice::from_raw_parts(
531-
vec.as_ptr() as *const u8, vec.len()) };
532-
Ok((6, vec.len(), uslice.to_vec()))
529+
let bytes = vec.into_iter()
530+
.map(|x| *x as u8)
531+
.collect();
532+
Ok((6, vec.len(), bytes))
533533
},
534534
Value::Undefined(ref s, _) =>
535535
Ok((7, s.len(), s.to_vec())),

0 commit comments

Comments
 (0)