2016-01-02 18:27:06 -05:00
|
|
|
#![feature(zero_one)]
|
|
|
|
#![feature(num_bits_bytes)]
|
|
|
|
|
|
|
|
extern crate rand;
|
|
|
|
|
2015-12-30 17:14:48 -05:00
|
|
|
extern crate alchemy;
|
2016-01-02 18:27:06 -05:00
|
|
|
extern crate sigils;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
use rand::thread_rng;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// This should only be called by the macro below.
|
|
|
|
macro_rules! overflow_impl
|
|
|
|
{
|
|
|
|
($numBytes: expr, $T: ident,
|
|
|
|
$read_func: ident, $write_func: ident) =>
|
|
|
|
{
|
|
|
|
use std::num::Zero;
|
|
|
|
|
|
|
|
use alchemy::{BigEndian, LittleEndian, Transmutable};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
#[should_panic]
|
|
|
|
fn read_big_endian()
|
|
|
|
{
|
|
|
|
let buffer: [u8; $numBytes];
|
|
|
|
|
|
|
|
buffer = [0u8; $numBytes];
|
|
|
|
BigEndian::$read_func(&buffer);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
#[should_panic]
|
|
|
|
fn read_little_endian()
|
|
|
|
{
|
|
|
|
let buffer: [u8; $numBytes];
|
|
|
|
|
|
|
|
buffer = [0u8; $numBytes];
|
|
|
|
LittleEndian::$read_func(&buffer);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
#[should_panic]
|
|
|
|
fn write_big_endian()
|
|
|
|
{
|
|
|
|
let mut buffer: [u8; $numBytes];
|
|
|
|
|
|
|
|
buffer = [0u8; $numBytes];
|
|
|
|
BigEndian::$write_func(&mut buffer, $T::zero());
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
#[should_panic]
|
|
|
|
fn write_little_endian()
|
|
|
|
{
|
|
|
|
let mut buffer: [u8; $numBytes];
|
|
|
|
|
|
|
|
buffer = [0u8; $numBytes];
|
|
|
|
LittleEndian::$write_func(&mut buffer, $T::zero());
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
/// This macro tries to test for buffer overflow happening.
|
|
|
|
macro_rules! test_buffer_overflow
|
|
|
|
{
|
|
|
|
($mod_name: ident, $T: ident,
|
|
|
|
$read_func: ident, $write_func: ident) =>
|
|
|
|
{
|
|
|
|
mod $mod_name
|
|
|
|
{
|
|
|
|
use std::$T;
|
|
|
|
overflow_impl!($T::BYTES, $T, $read_func, $write_func);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
($mod_name: ident, $T: ident,
|
|
|
|
$read_func: ident, $write_func: ident, $numBytes: expr) =>
|
|
|
|
{
|
|
|
|
mod $mod_name
|
|
|
|
{
|
|
|
|
overflow_impl!($numBytes, $T, $read_func, $write_func);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Test the different data types for buffer overflow.
|
|
|
|
test_buffer_overflow!(overflow_u16, u16, bytes_to_u16, u16_to_bytes);
|
|
|
|
test_buffer_overflow!(overflow_u32, u32, bytes_to_u32, u32_to_bytes);
|
|
|
|
test_buffer_overflow!(overflow_u64, u64, bytes_to_u64, u64_to_bytes);
|
|
|
|
//test_buffer_overflow!(overflow_usize, usize, bytes_to_usize, usize_to_bytes);
|
|
|
|
|
|
|
|
test_buffer_overflow!(overflow_i16, i16, bytes_to_i16, i16_to_bytes);
|
|
|
|
test_buffer_overflow!(overflow_i32, i32, bytes_to_i32, i32_to_bytes);
|
|
|
|
test_buffer_overflow!(overflow_i64, i64, bytes_to_i64, i64_to_bytes);
|
|
|
|
//test_buffer_overflow!(overflow_isize, isize, bytes_to_isize, isize_to_bytes);
|
|
|
|
|
|
|
|
test_buffer_overflow!(overflow_f32, f32, bytes_to_f32, f32_to_bytes, 4);
|
|
|
|
test_buffer_overflow!(overflow_f64, f64, bytes_to_f64, f64_to_bytes, 8);
|