@@ -195,3 +195,83 @@ code:
195
195
post : ["r0.type=number",
196
196
" r6.type=ctx" , "r6.ctx_offset=0",
197
197
" r7.type=number" , "r7.svalue=23", "r7.uvalue=23"]
198
+ ---
199
+ test-case : meta_offset lower bound access
200
+
201
+ pre : ["meta_offset=-8", "packet_size=0",
202
+ " r1.type=packet" , "r1.packet_offset=0", "r1.svalue=[4098, 2147418112]", "r1.uvalue=[4098, 2147418112]"]
203
+
204
+ code :
205
+ <start> : |
206
+ r2 = *(u64 *)(r1 - 8)
207
+
208
+ post : ["meta_offset=-8", "packet_size=0",
209
+ " r1.type=packet" , "r1.packet_offset=0", "r1.svalue=[4098, 2147418112]", "r1.uvalue=[4098, 2147418112]",
210
+ " r2.type=number" ]
211
+ messages : []
212
+ ---
213
+ test-case : meta_offset lower bound incorrect access
214
+
215
+ pre : ["meta_offset=0", "packet_size=8",
216
+ " r1.type=packet" , "r1.packet_offset=0", "r1.svalue=[4098, 2147418112]", "r1.uvalue=[4098, 2147418112]"]
217
+
218
+ code :
219
+ <start> : |
220
+ r2 = *(u64 *)(r1 - 8)
221
+
222
+ post : ["meta_offset=0", "packet_size=8",
223
+ " r1.type=packet" , "r1.packet_offset=0", "r1.svalue=[4098, 2147418112]", "r1.uvalue=[4098, 2147418112]",
224
+ " r2.type=number" ]
225
+ messages :
226
+ - " 0: Lower bound must be at least meta_offset (valid_access(r1.offset-8, width=8) for read)"
227
+ ---
228
+ test-case : meta_offset upper bound incorrect access
229
+
230
+ pre : ["meta_offset=-8", "packet_size=0",
231
+ " r1.type=packet" , "r1.packet_offset=-8", "r1.svalue=[4098, 2147418112]", "r1.uvalue=[4098, 2147418112]"]
232
+
233
+ code :
234
+ <start> : |
235
+ r2 = *(u64 *)(r1 + 8)
236
+
237
+ post : ["meta_offset=-8", "packet_size=0",
238
+ " r1.type=packet" , "r1.packet_offset=-8", "r1.svalue=[4098, 2147418112]", "r1.uvalue=[4098, 2147418112]",
239
+ " r2.type=number" ]
240
+ messages :
241
+ - " 0: Upper bound must be at most packet_size (valid_access(r1.offset+8, width=8) for read)"
242
+ ---
243
+ test-case : meta_offset upper bound access
244
+
245
+ pre : ["meta_offset=-8", "packet_size=0",
246
+ " r1.type=packet" , "r1.packet_offset=-8", "r1.svalue=[4098, 2147418112]", "r1.uvalue=[4098, 2147418112]"]
247
+
248
+ code :
249
+ <start> : |
250
+ r2 = *(u64 *)(r1 + 0)
251
+
252
+ post : ["meta_offset=-8", "packet_size=0",
253
+ " r1.type=packet" , "r1.packet_offset=-8", "r1.svalue=[4098, 2147418112]", "r1.uvalue=[4098, 2147418112]",
254
+ " r2.type=number" ]
255
+ ---
256
+ # This test case demonstrates a false negative generated by the verifier where data_meta + offset < data is known
257
+ # but packet access at that offset is not allowed.
258
+
259
+ test-case : meta access with data bound check
260
+ pre : ["meta_offset=[-4098, 0]", "meta_offset=r2.packet_offset",
261
+ " r2.packet_offset=[-4098, 0]" , "r2.svalue=[4098, 2147418112]", "r2.type=packet",
262
+ " r1.packet_offset=0" , "r1.svalue=[4098, 2147418112]", "r1.type=packet"]
263
+
264
+ code :
265
+ <start> : |
266
+ r1 -= r2
267
+ r3 = 101
268
+ assume r3 s<= r1;
269
+ r0 = *(u8 *)(r2 + 100);
270
+
271
+ post : ["meta_offset=[-4098, 0]",
272
+ " r0.svalue=[0, 255]" , "r0.type=number", "r0.uvalue=[0, 255]",
273
+ " r1.svalue=[101, 4098]" , "r1.type=number", "r1.uvalue=r1.svalue",
274
+ " r2.packet_offset=meta_offset" , "r2.svalue=[4098, 2147418112]", "r2.type=packet",
275
+ " r3.svalue=101" , "r3.type=number", "r3.uvalue=101"]
276
+ messages :
277
+ - " 3: Upper bound must be at most packet_size (valid_access(r2.offset+100, width=1) for read)"
0 commit comments