1
1
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
2
// SPDX-License-Identifier: Apache-2.0 OR MIT
3
3
4
- // This test checks the `size` and `align` fields of vtables, for a
4
+ // This test checks the `size` and `align` fields of vtables, for a
5
5
// dynamic trait where two implementing structs have different sizes.
6
6
// The strategy is to cast the dyn trait object to a raw::TraitObject
7
7
// then do some unsafe pointer math.
14
14
15
15
use std:: intrinsics:: size_of;
16
16
use std:: mem:: transmute;
17
+ use std:: ptr:: drop_in_place;
17
18
use std:: raw:: TraitObject ;
18
19
19
20
include ! ( "../Helpers/vtable_utils_ignore.rs" ) ;
21
+ include ! ( "../../rmc-prelude.rs" ) ;
20
22
21
23
// Different sized data fields on each struct
22
24
struct Sheep {
@@ -47,18 +49,18 @@ impl Animal for Cow {
47
49
48
50
// Returns some struct that implements Animal, but we don't know which one at compile time.
49
51
fn random_animal ( random_number : i64 ) -> Box < dyn Animal > {
50
- if random_number < 5 {
51
- Box :: new ( Sheep { sheep_num : 7 } )
52
- } else {
53
- Box :: new ( Cow { cow_num : 9 } )
52
+ if random_number < 5 {
53
+ Box :: new ( Sheep { sheep_num : 7 } )
54
+ } else {
55
+ Box :: new ( Cow { cow_num : 9 } )
54
56
}
55
57
}
56
58
57
59
fn main ( ) {
58
60
let ptr_size = size_of :: < & usize > ( ) as isize ;
59
61
60
62
// The vtable is laid out as the right hand side here:
61
- //
63
+ //
62
64
// +-------+------------------+
63
65
// | size | value |
64
66
// +-------+------------------+
@@ -67,8 +69,8 @@ fn main() {
67
69
// | usize | align in bytes |
68
70
// | ? | function ptrs... |
69
71
// +-------+------------------+
70
- //
71
- // This layout taken from miri's handling:
72
+ //
73
+ // This layout taken from miri's handling:
72
74
// https://github.com/rust-lang/rust/blob/ec487bf3cfc9ce386da25169509fae8f2b4d4eec/compiler/rustc_mir/src/interpret/traits.rs#L155
73
75
74
76
// Check layout/values for Sheep
@@ -82,18 +84,21 @@ fn main() {
82
84
let data_ptr = trait_object. data ;
83
85
84
86
// Note: i32 ptr cast
85
- assert ! ( * ( data_ptr as * mut i32 ) != 7 ) ; // From Sheep
86
-
87
+ __VERIFIER_expect_fail ( * ( data_ptr as * mut i32 ) != 7 , "Wrong data" ) ; // From Sheep
88
+
87
89
let vtable_ptr = trait_object. vtable as * mut usize ;
88
90
89
91
// Drop pointer
90
- assert ! ( vtable_ptr. is_null( ) ) ;
91
-
92
+ __VERIFIER_expect_fail (
93
+ drop_from_vtrable ( vtable_ptr) != drop_in_place :: < Sheep > as * mut ( ) ,
94
+ "Wrong drop" ,
95
+ ) ;
96
+
92
97
// Size and align as usizes
93
- assert ! ( size_from_vtable( vtable_ptr) != size_of:: <i32 >( ) ) ;
94
- assert ! ( align_from_vtable( vtable_ptr) != size_of:: <i32 >( ) ) ;
98
+ __VERIFIER_expect_fail ( size_from_vtable ( vtable_ptr) != size_of :: < i32 > ( ) , "Wrong size" ) ;
99
+ __VERIFIER_expect_fail ( align_from_vtable ( vtable_ptr) != size_of :: < i32 > ( ) , "Wrong align" ) ;
95
100
}
96
- // Check layout/values for Cow
101
+ // Check layout/values for Cow
97
102
unsafe {
98
103
let animal_cow = random_animal ( 6 ) ;
99
104
@@ -104,16 +109,18 @@ fn main() {
104
109
let data_ptr = trait_object. data ;
105
110
106
111
// Note: i8 ptr cast
107
- assert ! ( * ( data_ptr as * mut i8 ) != 9 ) ; // From Cow
108
-
112
+ __VERIFIER_expect_fail ( * ( data_ptr as * mut i8 ) != 9 , "Wrong data" ) ; // From Cow
113
+
109
114
let vtable_ptr = trait_object. vtable as * mut usize ;
110
115
111
116
// Drop pointer
112
- assert ! ( vtable_ptr. is_null( ) ) ;
117
+ __VERIFIER_expect_fail (
118
+ drop_from_vtrable ( vtable_ptr) != drop_in_place :: < Cow > as * mut ( ) ,
119
+ "Wrong drop" ,
120
+ ) ;
113
121
114
122
// Size and align as usizes
115
- assert ! ( size_from_vtable( vtable_ptr) != size_of:: <i8 >( ) ) ;
116
- assert ! ( align_from_vtable( vtable_ptr) != size_of:: <i8 >( ) ) ;
123
+ __VERIFIER_expect_fail ( size_from_vtable ( vtable_ptr) != size_of :: < i8 > ( ) , "Wrong size" ) ;
124
+ __VERIFIER_expect_fail ( align_from_vtable ( vtable_ptr) != size_of :: < i8 > ( ) , "Wrong align" ) ;
117
125
}
118
126
}
119
-
0 commit comments