about summary refs log tree commit diff
path: root/src/tools/miri/tests/pass/write-bytes.rs
blob: b2050c5393e221f2e3874c0828c12fcd7f6650f7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#![feature(core_intrinsics)] // for `volatile_set_memory`

#[repr(C)]
#[derive(Copy, Clone)]
struct Foo {
    a: u64,
    b: u64,
    c: u64,
}

fn main() {
    const LENGTH: usize = 10;
    let mut v: [u64; LENGTH] = [0; LENGTH];

    for idx in 0..LENGTH {
        assert_eq!(v[idx], 0);
    }

    unsafe {
        let p = v.as_mut_ptr();
        ::std::ptr::write_bytes(p, 0xab, LENGTH);
    }

    for idx in 0..LENGTH {
        assert_eq!(v[idx], 0xabababababababab);
    }

    // -----

    let mut w: [Foo; LENGTH] = [Foo { a: 0, b: 0, c: 0 }; LENGTH];
    for idx in 0..LENGTH {
        assert_eq!(w[idx].a, 0);
        assert_eq!(w[idx].b, 0);
        assert_eq!(w[idx].c, 0);
    }

    unsafe {
        let p = w.as_mut_ptr();
        ::std::ptr::write_bytes(p, 0xcd, LENGTH);
    }

    for idx in 0..LENGTH {
        assert_eq!(w[idx].a, 0xcdcdcdcdcdcdcdcd);
        assert_eq!(w[idx].b, 0xcdcdcdcdcdcdcdcd);
        assert_eq!(w[idx].c, 0xcdcdcdcdcdcdcdcd);
    }

    // -----
    // `std::intrinsics::volatile_set_memory` should behave identically

    let mut v: [u64; LENGTH] = [0; LENGTH];

    for idx in 0..LENGTH {
        assert_eq!(v[idx], 0);
    }

    unsafe {
        let p = v.as_mut_ptr();
        ::std::intrinsics::volatile_set_memory(p, 0xab, LENGTH);
    }

    for idx in 0..LENGTH {
        assert_eq!(v[idx], 0xabababababababab);
    }

    // -----

    let mut w: [Foo; LENGTH] = [Foo { a: 0, b: 0, c: 0 }; LENGTH];
    for idx in 0..LENGTH {
        assert_eq!(w[idx].a, 0);
        assert_eq!(w[idx].b, 0);
        assert_eq!(w[idx].c, 0);
    }

    unsafe {
        let p = w.as_mut_ptr();
        ::std::intrinsics::volatile_set_memory(p, 0xcd, LENGTH);
    }

    for idx in 0..LENGTH {
        assert_eq!(w[idx].a, 0xcdcdcdcdcdcdcdcd);
        assert_eq!(w[idx].b, 0xcdcdcdcdcdcdcdcd);
        assert_eq!(w[idx].c, 0xcdcdcdcdcdcdcdcd);
    }
}