@@ -60,94 +60,150 @@ fn integer_overflow() {
60
60
// Instantiate machine
61
61
tester. instantiate_machine ( DummyExterns ) . unwrap ( ) ;
62
62
63
- // Params setup
63
+ // X is the target value.
64
64
let x: i64 = 10000000000 ;
65
- let params = RawBytes :: serialize ( x) . unwrap ( ) ;
66
-
67
- // Send message to set
68
- let message = Message {
69
- from : sender. 1 ,
70
- to : actor_address,
71
- gas_limit : 1000000000 ,
72
- method_num : 1 ,
73
- params,
74
- ..Message :: default ( )
75
- } ;
76
-
77
- // Set inner state value
78
- let res = tester
79
- . executor
80
- . as_mut ( )
81
- . unwrap ( )
82
- . execute_message ( message, ApplyKind :: Explicit , 100 )
83
- . unwrap ( ) ;
84
-
85
- assert_eq ! (
86
- ExitCode :: OK ,
87
- res. msg_receipt. exit_code,
88
- "{}" ,
89
- res. failure_info. unwrap( )
90
- ) ;
91
-
92
- // Read inner state value
93
- let message = Message {
94
- from : sender. 1 ,
95
- to : actor_address,
96
- gas_limit : 1000000000 ,
97
- method_num : 3 ,
98
- sequence : 1 ,
99
- ..Message :: default ( )
100
- } ;
101
-
102
- let res = tester
103
- . executor
104
- . as_mut ( )
105
- . unwrap ( )
106
- . execute_message ( message, ApplyKind :: Explicit , 100 )
107
- . unwrap ( ) ;
108
-
109
- let current_state_value: i64 = res. msg_receipt . return_data . deserialize ( ) . unwrap ( ) ;
110
-
111
- assert_eq ! ( current_state_value, x) ;
112
-
113
- // Overflow inner state integer
114
- let message = Message {
115
- from : sender. 1 ,
116
- to : actor_address,
117
- gas_limit : 1000000000 ,
118
- method_num : 2 ,
119
- sequence : 2 ,
120
- ..Message :: default ( )
121
- } ;
122
-
123
- // Set inner state value
124
- tester
125
- . executor
126
- . as_mut ( )
127
- . unwrap ( )
128
- . execute_message ( message, ApplyKind :: Explicit , 100 )
129
- . unwrap ( ) ;
130
-
131
- // Read inner state value
132
- let message = Message {
133
- from : sender. 1 ,
134
- to : actor_address,
135
- gas_limit : 1000000000 ,
136
- method_num : 3 ,
137
- sequence : 3 ,
138
- ..Message :: default ( )
139
- } ;
140
-
141
- let res = tester
142
- . executor
143
- . unwrap ( )
144
- . execute_message ( message, ApplyKind :: Explicit , 100 )
145
- . unwrap ( ) ;
146
-
147
- let current_state_value: i64 = res. msg_receipt . return_data . deserialize ( ) . unwrap ( ) ;
148
-
149
- // Check overflow
150
- let overflow_value: i64 = -5340232216128654848 ;
151
65
152
- assert_eq ! ( current_state_value, overflow_value) ;
66
+ {
67
+ // Params setup
68
+ let params = RawBytes :: serialize ( x) . unwrap ( ) ;
69
+
70
+ // Send message to set
71
+ let message = Message {
72
+ from : sender. 1 ,
73
+ to : actor_address,
74
+ gas_limit : 1000000000 ,
75
+ method_num : 1 ,
76
+ params,
77
+ ..Message :: default ( )
78
+ } ;
79
+
80
+ // Set inner state value
81
+ let res = tester
82
+ . executor
83
+ . as_mut ( )
84
+ . unwrap ( )
85
+ . execute_message ( message, ApplyKind :: Explicit , 100 )
86
+ . unwrap ( ) ;
87
+
88
+ assert_eq ! (
89
+ ExitCode :: OK ,
90
+ res. msg_receipt. exit_code,
91
+ "{}" ,
92
+ res. failure_info. unwrap( )
93
+ ) ;
94
+
95
+ // Read inner state value
96
+ let message = Message {
97
+ from : sender. 1 ,
98
+ to : actor_address,
99
+ gas_limit : 1000000000 ,
100
+ method_num : 3 ,
101
+ sequence : 1 ,
102
+ ..Message :: default ( )
103
+ } ;
104
+
105
+ let res = tester
106
+ . executor
107
+ . as_mut ( )
108
+ . unwrap ( )
109
+ . execute_message ( message, ApplyKind :: Explicit , 100 )
110
+ . unwrap ( ) ;
111
+ assert ! ( res. msg_receipt. exit_code. is_success( ) ) ;
112
+
113
+ let current_state_value: i64 = res. msg_receipt . return_data . deserialize ( ) . unwrap ( ) ;
114
+
115
+ assert_eq ! ( current_state_value, x) ;
116
+ }
117
+
118
+ {
119
+ // Overflow inner state integer with checked overflows.
120
+ let message = Message {
121
+ from : sender. 1 ,
122
+ to : actor_address,
123
+ gas_limit : 1000000000 ,
124
+ method_num : 4 ,
125
+ sequence : 2 ,
126
+ ..Message :: default ( )
127
+ } ;
128
+
129
+ let res = tester
130
+ . executor
131
+ . as_mut ( )
132
+ . unwrap ( )
133
+ . execute_message ( message, ApplyKind :: Explicit , 100 )
134
+ . unwrap ( ) ;
135
+ assert_eq ! ( ExitCode :: SYS_ILLEGAL_INSTRUCTION , res. msg_receipt. exit_code) ;
136
+
137
+ // Read inner state value
138
+ let message = Message {
139
+ from : sender. 1 ,
140
+ to : actor_address,
141
+ gas_limit : 1000000000 ,
142
+ method_num : 3 ,
143
+ sequence : 3 ,
144
+ ..Message :: default ( )
145
+ } ;
146
+
147
+ let res = tester
148
+ . executor
149
+ . as_mut ( )
150
+ . unwrap ( )
151
+ . execute_message ( message, ApplyKind :: Explicit , 100 )
152
+ . unwrap ( ) ;
153
+ assert ! ( res. msg_receipt. exit_code. is_success( ) ) ;
154
+
155
+ let current_state_value: i64 = res. msg_receipt . return_data . deserialize ( ) . unwrap ( ) ;
156
+ assert_eq ! ( current_state_value, x) ;
157
+ }
158
+
159
+ {
160
+ // Overflow inner state integer with wrapping.
161
+ let message = Message {
162
+ from : sender. 1 ,
163
+ to : actor_address,
164
+ gas_limit : 1000000000 ,
165
+ method_num : 2 ,
166
+ sequence : 4 ,
167
+ ..Message :: default ( )
168
+ } ;
169
+
170
+ // Set inner state value
171
+ let res = tester
172
+ . executor
173
+ . as_mut ( )
174
+ . unwrap ( )
175
+ . execute_message ( message, ApplyKind :: Explicit , 100 )
176
+ . unwrap ( ) ;
177
+ assert_eq ! (
178
+ ExitCode :: OK ,
179
+ res. msg_receipt. exit_code,
180
+ "{}" ,
181
+ res. failure_info. unwrap( )
182
+ ) ;
183
+
184
+ // Read inner state value
185
+ let message = Message {
186
+ from : sender. 1 ,
187
+ to : actor_address,
188
+ gas_limit : 1000000000 ,
189
+ method_num : 3 ,
190
+ sequence : 5 ,
191
+ ..Message :: default ( )
192
+ } ;
193
+
194
+ let res = tester
195
+ . executor
196
+ . as_mut ( )
197
+ . unwrap ( )
198
+ . execute_message ( message, ApplyKind :: Explicit , 100 )
199
+ . unwrap ( ) ;
200
+ assert ! ( res. msg_receipt. exit_code. is_success( ) ) ;
201
+
202
+ let current_state_value: i64 = res. msg_receipt . return_data . deserialize ( ) . unwrap ( ) ;
203
+
204
+ // Check overflow
205
+ let overflow_value: i64 = -5340232216128654848 ;
206
+
207
+ assert_eq ! ( current_state_value, overflow_value) ;
208
+ }
153
209
}
0 commit comments