From 8e90a2bf873e32bde37f1e9ab9344c895a64c958 Mon Sep 17 00:00:00 2001 From: Edward Lee Date: Fri, 13 Nov 2020 07:15:53 -0500 Subject: [PATCH] Add Third MIR bug (44800). --- perses-docker/dataset/rust-44800.rs | 152 ++++++++++++++++++++++ perses-docker/dataset/rust-44800.setup.sh | 2 + perses-docker/dataset/rust-44800.sh | 58 +++++++++ 3 files changed, 212 insertions(+) create mode 100644 perses-docker/dataset/rust-44800.rs create mode 100755 perses-docker/dataset/rust-44800.setup.sh create mode 100755 perses-docker/dataset/rust-44800.sh diff --git a/perses-docker/dataset/rust-44800.rs b/perses-docker/dataset/rust-44800.rs new file mode 100644 index 0000000..dfd3e6d --- /dev/null +++ b/perses-docker/dataset/rust-44800.rs @@ -0,0 +1,152 @@ +use std::collections::VecDeque; +use std::fmt; + +pub struct Packet +{ + pub payload: VecDeque, +} + +pub struct Header +{ + pub data: Vec, +} + +impl Packet +{ + pub fn new() -> Self + { + let payload = VecDeque::with_capacity(32); + Packet{payload} + } + + pub fn len(&self) -> usize + { + self.payload.len() + } + + pub fn push_header(&mut self, header: &Header) + { + self.payload.reserve(header.data.len()); + for b in header.data.iter().rev() { + self.payload.push_front(*b); + } + } + + pub fn push_back_bytes(&mut self, data: &[u8]) + { + self.payload.extend(data.iter()); + } +} + +impl fmt::Debug for Packet +{ + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result + { + let mut bytes = String::with_capacity(3*self.len()); + for i in 0..self.payload.len() { + bytes.push_str(&format!(" {:02X}", self.payload[i])); + } + + write!(f, "{}", bytes) + } +} + +impl Header +{ + pub fn new() -> Self + { + let data = Vec::with_capacity(20); + Header{data} + } + + pub fn with_capacity(capacity: usize) -> Self + { + let data = Vec::with_capacity(capacity); + Header{data} + } + + pub fn push8(&mut self, data: u8) + { + self.data.push(data); + } + + pub fn push16(&mut self, data: u16) + { + self.data.push((data >> 8) as u8); + self.data.push((data & 0xFF) as u8); + } + + pub fn push32(&mut self, data: u32) + { + self.data.push((data >> 24) as u8); + self.data.push(((data >> 16) & 0xFF) as u8); + self.data.push(((data >> 8) & 0xFF) as u8); + self.data.push((data & 0xFF) as u8); + } + + pub fn push_bytes(&mut self, data: &[u8]) + { + self.data.extend(data); + } +} + +fn push_ipv4(packet: &mut Packet) +{ + let payload_len = packet.len(); + let mut header = Header::with_capacity(20); + + let b = 0x45; // version + IHL (we don't support options so length is fixed) + header.push8(b); + + header.push8(20); + + let hw = 20 + payload_len; // total length + header.push16(hw as u16); + + header.push16(21); // identification + header.push16(23); + + packet.push_header(&header); +} + +fn push_mac(packet: &mut Packet) +{ + let mut header = Header::with_capacity(30); + + let hw = 0b1000_10_00; // frame control, see 9.2.4.1 + header.push16(hw); + + let addr = [1, 2, 3, 4, 5, 6]; + for &b in addr.iter() { // address 1, see 9.3.2.1 + header.push8(b); + } + + for &b in addr.iter() { // address 2 + header.push8(b); + } + + for &b in addr.iter() {// address 3 + header.push8(b); + } + + header.push16(55); + + let hw = 0b111_0_00_0_000; // QoS control, see 9.2.4.5.1 + header.push16(hw); + + packet.push_header(&header); + + let fcs = [0xD9, 0x58, 0xFB, 0xA8]; + println!("old packet = {:?}", packet); + println!("pushing {:X} {:X} {:X} {:X} ", fcs[0], fcs[1], fcs[2], fcs[3]); + packet.push_back_bytes(&fcs); + + println!("new packet = {:?}", packet); +} + +fn main() +{ + let mut packet = Packet::new(); + push_ipv4(&mut packet); + push_mac(&mut packet); +} diff --git a/perses-docker/dataset/rust-44800.setup.sh b/perses-docker/dataset/rust-44800.setup.sh new file mode 100755 index 0000000..06bd986 --- /dev/null +++ b/perses-docker/dataset/rust-44800.setup.sh @@ -0,0 +1,2 @@ +#!/bin/bash +exit 0 diff --git a/perses-docker/dataset/rust-44800.sh b/perses-docker/dataset/rust-44800.sh new file mode 100755 index 0000000..b191e05 --- /dev/null +++ b/perses-docker/dataset/rust-44800.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash + +set -o nounset + +readonly FILE="${INPUT}" + +readonly BUGGY_RUSTC_VERSION="1.20.0" +readonly CORRECT_RUSTC_VERSION="1.47.0" +readonly CORRECT_RUSTC_VERSION_2="1.47.0" +rustup toolchain install "${BUGGY_RUSTC_VERSION}" --force +rustup toolchain install "${CORRECT_RUSTC_VERSION}" --force +rustup toolchain install "${CORRECT_RUSTC_VERSION_2}" --force + +if ! command -v valgrind > /dev/null ; then + echo "valgrind is not installed" + exit 100 +fi + +readonly EXE_WRONG="./wrong.out" +if ! timeout -s 9 60 rustup run "${BUGGY_RUSTC_VERSION}" rustc -o "${EXE_WRONG}" "${FILE}"; then + exit 1 +fi + +readonly EXE_CORRECT="./correct.out" +if ! timeout -s 9 60 rustup run "${CORRECT_RUSTC_VERSION}" rustc -o "${EXE_CORRECT}" "${FILE}" ; then + exit 1 +fi + +readonly EXE_CORRECT_2="./correct_2.out" +if ! timeout -s 9 60 rustup run "${CORRECT_RUSTC_VERSION_2}" rustc -o "${EXE_CORRECT_2}" "${FILE}" ; then + exit 1 +fi + +readonly OUTPUT_WRONG="wrong_output.txt" + +if (timeout -s 9 30 valgrind "${EXE_WRONG}") &> "${OUTPUT_WRONG}" ; then + exit 1 +fi + +readonly OUTPUT_CORRECT_1="correct_output.txt" +readonly OUTPUT_CORRECT_2="correct_output_2.txt" +if ! timeout -s 9 30 valgrind "${EXE_CORRECT}"; then + exit 1 +fi + +timeout -s 9 30 "${EXE_CORRECT}" &> "${OUTPUT_CORRECT_1}" + +if ! timeout -s 9 30 valgrind "${EXE_CORRECT_2}" ; then + exit 1 +fi +timeout -s 9 30 "${EXE_CORRECT_2}" &> "${OUTPUT_CORRECT_2}" + +if ! diff "${OUTPUT_CORRECT_1}" "${OUTPUT_CORRECT_2}" ; then + exit 1 +fi + +exit 0 +