1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
17using tracegen::TestTraceContainer;
22TEST(ExecutionDiscardConstrainingTest, EmptyRow)
27TEST(ExecutionDiscardConstrainingTest, DiscardIffDyingContext)
30 TestTraceContainer
trace({
31 { { C::precomputed_first_row, 1 } },
33 { { C::execution_sel, 1 },
34 { C::execution_discard, 0 },
35 { C::execution_dying_context_id, 0 },
36 { C::execution_dying_context_id_inv, 0 } },
38 { { C::execution_sel, 1 },
39 { C::execution_discard, 1 },
40 { C::execution_dying_context_id, 42 },
41 { C::execution_dying_context_id_inv,
FF(42).invert() } },
42 { { C::execution_sel, 1 } },
43 { { C::execution_sel, 0 } },
47 check_relation<execution_discard>(
48 trace, execution_discard::SR_DISCARD_IFF_DYING_CONTEXT, execution_discard::SR_DISCARD_IF_FAILURE);
51 trace.
set(C::execution_dying_context_id, 2, 0);
52 trace.
set(C::execution_dying_context_id_inv, 2, 0);
54 "DISCARD_IFF_DYING_CONTEXT");
57 trace.
set(C::execution_dying_context_id, 1, 0);
58 trace.
set(C::execution_dying_context_id_inv, 1, 0);
59 trace.
set(C::execution_dying_context_id, 2, 42);
60 trace.
set(C::execution_dying_context_id_inv, 2,
FF(42).invert());
63 trace.
set(C::execution_dying_context_id, 1, 42);
64 trace.
set(C::execution_dying_context_id_inv, 1,
FF(42).invert());
66 "DISCARD_IFF_DYING_CONTEXT");
69TEST(ExecutionDiscardConstrainingTest, DiscardFailureMustDiscard)
72 TestTraceContainer
trace({
73 { { C::precomputed_first_row, 1 } },
75 { { C::execution_sel, 1 },
76 { C::execution_sel_failure, 1 },
77 { C::execution_discard, 1 },
78 { C::execution_dying_context_id, 42 },
79 { C::execution_dying_context_id_inv,
FF(42).invert() } },
81 { { C::execution_sel, 1 },
82 { C::execution_sel_failure, 0 },
83 { C::execution_discard, 0 },
84 { C::execution_dying_context_id, 0 },
85 { C::execution_dying_context_id_inv, 0 } },
87 { { C::execution_sel, 1 },
88 { C::execution_sel_failure, 0 },
89 { C::execution_discard, 1 },
90 { C::execution_dying_context_id, 0 } },
91 { { C::execution_sel, 1 } },
92 { { C::execution_sel, 0 } },
96 check_relation<execution_discard>(trace, execution_discard::SR_DISCARD_IF_FAILURE);
99 trace.
set(C::execution_discard, 1, 0);
100 trace.
set(C::execution_dying_context_id, 1, 0);
102 "DISCARD_IF_FAILURE");
105TEST(ExecutionDiscardConstrainingTest, DiscardIsDyingContextCheck)
108 TestTraceContainer
trace({
109 { { C::precomputed_first_row, 1 } },
111 { { C::execution_sel, 1 },
112 { C::execution_context_id, 5 },
113 { C::execution_discard, 1 },
114 { C::execution_dying_context_id, 5 },
115 { C::execution_is_dying_context, 1 },
116 { C::execution_dying_context_diff_inv, 0 } },
118 { { C::execution_sel, 1 },
119 { C::execution_context_id, 3 },
120 { C::execution_discard, 1 },
121 { C::execution_dying_context_id, 5 },
122 { C::execution_dying_context_id_inv,
FF(5).invert() },
123 { C::execution_is_dying_context, 0 },
124 { C::execution_dying_context_diff_inv,
FF(3 - 5).invert() } },
126 { { C::execution_sel, 1 },
127 { C::execution_context_id, 7 },
128 { C::execution_discard, 0 },
129 { C::execution_dying_context_id, 0 },
130 { C::execution_is_dying_context, 0 },
131 { C::execution_dying_context_diff_inv,
FF(7 - 0).invert() } },
132 { { C::execution_sel, 0 } },
135 check_relation<execution_discard>(trace, execution_discard::SR_IS_DYING_CONTEXT_CHECK);
138 trace.
set(C::execution_is_dying_context, 1, 0);
140 "IS_DYING_CONTEXT_CHECK");
143 trace.
set(C::execution_is_dying_context, 1, 1);
144 trace.
set(C::execution_is_dying_context, 2, 1);
146 "IS_DYING_CONTEXT_CHECK");
149TEST(ExecutionDiscardConstrainingTest, DiscardPropagationOfZeroDiscard)
151 TestTraceContainer
trace({
152 { { C::precomputed_first_row, 1 } },
154 { C::execution_sel, 1 },
155 { C::execution_discard, 0 },
156 { C::execution_dying_context_id, 0 },
157 { C::execution_sel_exit_call, 0 },
158 { C::execution_has_parent_ctx, 1 },
159 { C::execution_sel_failure, 0 },
160 { C::execution_is_dying_context, 0 },
161 { C::execution_sel_enter_call, 0 },
162 { C::execution_enqueued_call_end, 0 },
163 { C::execution_resolves_dying_context, 0 },
164 { C::execution_nested_call_from_undiscarded_context, 0 },
167 { { C::execution_sel, 1 },
168 { C::execution_discard, 0 },
169 { C::execution_dying_context_id, 0 },
170 { C::execution_dying_context_id_inv, 0 },
171 { C::execution_enqueued_call_end, 0 },
172 { C::execution_resolves_dying_context, 0 },
173 { C::execution_nested_call_from_undiscarded_context, 0 } },
175 { { C::execution_sel, 1 }, { C::execution_discard, 0 }, { C::execution_dying_context_id, 0 } },
176 { { C::execution_sel, 0 } },
179 check_relation<execution_discard>(
180 trace, execution_discard::SR_DISCARD_PROPAGATION, execution_discard::SR_DYING_CONTEXT_PROPAGATION);
183 trace.
set(C::execution_discard, 2, 42);
185 "DISCARD_PROPAGATION");
188TEST(ExecutionDiscardConstrainingTest, DiscardPropagationOfNonzeroDiscard)
190 TestTraceContainer
trace({
191 { { C::precomputed_first_row, 1 } },
193 { { C::execution_sel, 1 },
194 { C::execution_discard, 1 },
195 { C::execution_dying_context_id, 42 },
196 { C::execution_sel_exit_call, 0 },
197 { C::execution_has_parent_ctx, 1 },
198 { C::execution_sel_failure, 0 },
199 { C::execution_is_dying_context, 0 },
200 { C::execution_sel_enter_call, 0 },
201 { C::execution_enqueued_call_end, 0 },
202 { C::execution_resolves_dying_context, 0 },
203 { C::execution_nested_call_from_undiscarded_context, 0 } },
205 { { C::execution_sel, 1 },
206 { C::execution_discard, 1 },
207 { C::execution_dying_context_id, 42 },
208 { C::execution_enqueued_call_end, 0 },
209 { C::execution_resolves_dying_context, 0 },
210 { C::execution_nested_call_from_undiscarded_context, 0 } },
212 { { C::execution_sel, 1 }, { C::execution_discard, 1 }, { C::execution_dying_context_id, 42 } },
213 { { C::execution_sel, 0 } },
216 check_relation<execution_discard>(
217 trace, execution_discard::SR_DISCARD_PROPAGATION, execution_discard::SR_DYING_CONTEXT_PROPAGATION);
220 trace.
set(C::execution_discard, 2, 0);
222 "DISCARD_PROPAGATION");
225TEST(ExecutionDiscardConstrainingTest, DiscardPropagationLiftedEndOfEnqueuedCall)
228 TestTraceContainer
trace({
229 { { C::precomputed_first_row, 1 } },
231 { { C::execution_sel, 1 },
232 { C::execution_discard, 1 },
233 { C::execution_dying_context_id, 42 },
234 { C::execution_sel_exit_call, 1 },
235 { C::execution_has_parent_ctx, 0 },
236 { C::execution_enqueued_call_end, 1 },
237 { C::execution_resolves_dying_context, 0 },
238 { C::execution_nested_call_from_undiscarded_context, 0 } },
240 { { C::execution_sel, 1 }, { C::execution_discard, 0 }, { C::execution_dying_context_id, 0 } },
241 { { C::execution_sel, 1 } },
242 { { C::execution_sel, 0 } },
245 check_relation<execution_discard>(
246 trace, execution_discard::SR_DISCARD_PROPAGATION, execution_discard::SR_DYING_CONTEXT_PROPAGATION);
249TEST(ExecutionDiscardConstrainingTest, DiscardPropagationLiftedResolvesDyingContext)
252 TestTraceContainer
trace({
253 { { C::precomputed_first_row, 1 } },
255 { { C::execution_sel, 1 },
256 { C::execution_context_id, 42 },
257 { C::execution_discard, 1 },
258 { C::execution_dying_context_id, 42 },
259 { C::execution_sel_failure, 1 },
260 { C::execution_is_dying_context, 1 },
261 { C::execution_dying_context_diff_inv, 0 },
262 { C::execution_enqueued_call_end, 0 },
263 { C::execution_resolves_dying_context, 1 },
264 { C::execution_nested_call_from_undiscarded_context, 0 } },
266 { { C::execution_sel, 1 },
267 { C::execution_discard, 0 },
268 { C::execution_dying_context_id, 0 },
269 { C::execution_enqueued_call_end, 0 },
270 { C::execution_resolves_dying_context, 0 },
271 { C::execution_nested_call_from_undiscarded_context, 0 } },
272 { { C::execution_sel, 1 } },
273 { { C::execution_sel, 0 } },
276 check_relation<execution_discard>(
277 trace, execution_discard::SR_DISCARD_PROPAGATION, execution_discard::SR_DYING_CONTEXT_PROPAGATION);
280TEST(ExecutionDiscardConstrainingTest, DiscardPropagationLiftedNestedCallFromUndiscarded)
283 TestTraceContainer
trace({
284 { { C::precomputed_first_row, 1 } },
286 { { C::execution_sel, 1 },
287 { C::execution_discard, 0 },
288 { C::execution_dying_context_id, 0 },
289 { C::execution_sel_enter_call, 1 },
290 { C::execution_enqueued_call_end, 0 },
291 { C::execution_resolves_dying_context, 0 },
292 { C::execution_nested_call_from_undiscarded_context, 1 } },
294 { { C::execution_sel, 1 }, { C::execution_discard, 1 }, { C::execution_dying_context_id, 99 } },
296 { { C::execution_sel, 1 }, { C::execution_discard, 1 }, { C::execution_dying_context_id, 99 } },
297 { { C::execution_sel, 0 } },
301 check_relation<execution_discard>(
302 trace, execution_discard::SR_DISCARD_PROPAGATION, execution_discard::SR_DYING_CONTEXT_PROPAGATION);
305TEST(ExecutionDiscardConstrainingTest, DiscardDyingContextMustError)
308 TestTraceContainer
trace({
309 { { C::precomputed_first_row, 1 } },
311 { { C::execution_sel, 1 },
312 { C::execution_context_id, 42 },
313 { C::execution_discard, 1 },
314 { C::execution_dying_context_id, 42 },
315 { C::execution_is_dying_context, 1 },
316 { C::execution_sel_exit_call, 1 },
317 { C::execution_sel_error, 1 },
318 { C::execution_sel_execute_revert, 0 },
319 { C::execution_sel_failure, 1 },
320 { C::execution_dying_context_diff_inv, 0 } },
321 { { C::execution_sel, 1 } },
322 { { C::execution_sel, 0 } },
325 check_relation<execution_discard>(trace, execution_discard::SR_DYING_CONTEXT_MUST_FAIL);
328 trace.
set(C::execution_sel_failure, 1, 0);
329 trace.
set(C::execution_sel_error, 1, 0);
330 trace.
set(C::execution_sel_execute_revert, 1, 0);
332 "DYING_CONTEXT_MUST_FAIL");
335TEST(ExecutionDiscardConstrainingTest, DiscardComplexScenario)
338 TestTraceContainer
trace({
339 { { C::precomputed_first_row, 1 } },
341 { { C::execution_sel, 1 },
342 { C::execution_context_id, 1 },
343 { C::execution_discard, 0 },
344 { C::execution_dying_context_id, 0 },
345 { C::execution_dying_context_diff_inv,
FF(1 - 0).invert() },
346 { C::execution_is_dying_context, 0 },
347 { C::execution_enqueued_call_end, 0 },
348 { C::execution_resolves_dying_context, 0 },
349 { C::execution_nested_call_from_undiscarded_context, 0 } },
351 { { C::execution_sel, 1 },
352 { C::execution_context_id, 1 },
353 { C::execution_discard, 0 },
354 { C::execution_dying_context_id, 0 },
355 { C::execution_dying_context_id_inv, 0 },
356 { C::execution_dying_context_diff_inv,
FF(1 - 0).invert() },
357 { C::execution_sel_enter_call, 1 },
358 { C::execution_enqueued_call_end, 0 },
359 { C::execution_resolves_dying_context, 0 },
360 { C::execution_nested_call_from_undiscarded_context, 1 } },
362 { { C::execution_sel, 1 },
363 { C::execution_context_id, 2 },
364 { C::execution_discard, 1 },
365 { C::execution_dying_context_id, 2 },
366 { C::execution_is_dying_context, 1 },
367 { C::execution_dying_context_diff_inv, 0 },
368 { C::execution_enqueued_call_end, 0 },
369 { C::execution_resolves_dying_context, 0 },
370 { C::execution_nested_call_from_undiscarded_context, 0 } },
372 { { C::execution_sel, 1 },
373 { C::execution_context_id, 2 },
374 { C::execution_discard, 1 },
375 { C::execution_dying_context_id, 2 },
376 { C::execution_is_dying_context, 1 },
377 { C::execution_sel_exit_call, 1 },
378 { C::execution_sel_error, 1 },
379 { C::execution_sel_execute_revert, 0 },
380 { C::execution_sel_failure, 1 },
381 { C::execution_dying_context_diff_inv, 0 },
382 { C::execution_has_parent_ctx, 1 },
383 { C::execution_enqueued_call_end, 0 },
384 { C::execution_resolves_dying_context, 1 },
385 { C::execution_nested_call_from_undiscarded_context, 0 } },
387 { { C::execution_sel, 1 },
388 { C::execution_context_id, 1 },
389 { C::execution_discard, 0 },
390 { C::execution_dying_context_id, 0 },
391 { C::execution_dying_context_diff_inv,
FF(1 - 0).invert() },
392 { C::execution_is_dying_context, 0 },
393 { C::execution_enqueued_call_end, 0 },
394 { C::execution_resolves_dying_context, 0 },
395 { C::execution_nested_call_from_undiscarded_context, 0 } },
396 { { C::execution_sel, 0 } },
400 check_relation<execution_discard>(trace,
401 execution_discard::SR_IS_DYING_CONTEXT_CHECK,
402 execution_discard::SR_DISCARD_PROPAGATION,
403 execution_discard::SR_DYING_CONTEXT_PROPAGATION,
404 execution_discard::SR_DYING_CONTEXT_MUST_FAIL);
407TEST(ExecutionDiscardConstrainingTest, DiscardWithLastRow)
410 TestTraceContainer
trace(
411 { { { C::precomputed_first_row, 1 } },
412 { { C::execution_sel, 1 },
413 { C::execution_discard, 1 },
414 { C::execution_dying_context_id, 42 },
415 { C::execution_enqueued_call_end, 0 },
416 { C::execution_resolves_dying_context, 0 },
417 { C::execution_nested_call_from_undiscarded_context, 0 } },
419 { { C::execution_sel, 1 }, { C::execution_discard, 1 }, { C::execution_dying_context_id, 42 } },
420 { { C::execution_sel, 0 } } });
422 check_relation<execution_discard>(
423 trace, execution_discard::SR_DISCARD_PROPAGATION, execution_discard::SR_DYING_CONTEXT_PROPAGATION);
428TEST(ExecutionDiscardConstrainingTest, ExploitRaiseDiscardWithWrongDyingContext)
434 TestTraceContainer
trace({
435 { { C::precomputed_first_row, 1 } },
437 { { C::execution_sel, 1 },
438 { C::execution_context_id, 1 },
439 { C::execution_discard, 0 },
440 { C::execution_dying_context_id, 0 },
441 { C::execution_dying_context_diff_inv,
FF(1 - 0).invert() },
442 { C::execution_is_dying_context, 0 },
443 { C::execution_enqueued_call_end, 0 },
444 { C::execution_resolves_dying_context, 0 },
445 { C::execution_nested_call_from_undiscarded_context, 0 } },
447 { { C::execution_sel, 1 },
448 { C::execution_context_id, 1 },
449 { C::execution_discard, 0 },
450 { C::execution_dying_context_id, 0 },
451 { C::execution_dying_context_diff_inv,
FF(1 - 0).invert() },
452 { C::execution_sel_enter_call, 1 },
453 { C::execution_enqueued_call_end, 0 },
454 { C::execution_resolves_dying_context, 0 },
455 { C::execution_nested_call_from_undiscarded_context, 1 } },
457 { { C::execution_sel, 1 },
458 { C::execution_context_id, 2 },
459 { C::execution_discard, 1 },
460 { C::execution_dying_context_id, 3 },
461 { C::execution_dying_context_id_inv,
FF(3).invert() },
462 { C::execution_dying_context_diff_inv,
FF(2 - 3).invert() },
463 { C::execution_is_dying_context, 0 },
464 { C::execution_enqueued_call_end, 0 },
465 { C::execution_resolves_dying_context, 0 },
466 { C::execution_nested_call_from_undiscarded_context, 0 } },
468 { { C::execution_sel, 1 },
469 { C::execution_context_id, 2 },
470 { C::execution_discard, 1 },
471 { C::execution_dying_context_id, 3 },
472 { C::execution_dying_context_id_inv,
FF(3).invert() },
473 { C::execution_dying_context_diff_inv,
FF(2 - 3).invert() },
474 { C::execution_is_dying_context, 0 },
475 { C::execution_sel_enter_call, 1 },
476 { C::execution_enqueued_call_end, 0 },
477 { C::execution_resolves_dying_context, 0 },
478 { C::execution_nested_call_from_undiscarded_context, 0 } },
480 { { C::execution_sel, 1 },
481 { C::execution_context_id, 3 },
482 { C::execution_discard, 1 },
483 { C::execution_dying_context_id, 3 },
484 { C::execution_dying_context_id_inv,
FF(3).invert() },
485 { C::execution_dying_context_diff_inv, 0 },
486 { C::execution_is_dying_context, 1 },
487 { C::execution_sel_exit_call, 1 },
488 { C::execution_sel_error, 1 },
489 { C::execution_sel_failure, 1 },
490 { C::execution_has_parent_ctx, 1 },
491 { C::execution_enqueued_call_end, 0 },
492 { C::execution_resolves_dying_context, 1 },
493 { C::execution_nested_call_from_undiscarded_context, 0 } },
495 { { C::execution_sel, 1 },
496 { C::execution_context_id, 2 },
497 { C::execution_discard, 0 },
498 { C::execution_dying_context_id, 0 },
499 { C::execution_dying_context_diff_inv,
FF(2 - 0).invert() },
500 { C::execution_is_dying_context, 0 },
501 { C::execution_enqueued_call_end, 0 },
502 { C::execution_resolves_dying_context, 0 },
503 { C::execution_nested_call_from_undiscarded_context, 0 } },
505 { { C::execution_sel, 1 },
506 { C::execution_context_id, 2 },
507 { C::execution_discard, 0 },
508 { C::execution_dying_context_id, 0 },
509 { C::execution_dying_context_diff_inv,
FF(2 - 0).invert() },
510 { C::execution_sel_exit_call, 1 },
511 { C::execution_sel_error, 0 },
512 { C::execution_sel_failure, 0 },
513 { C::execution_has_parent_ctx, 1 },
514 { C::execution_enqueued_call_end, 0 },
515 { C::execution_resolves_dying_context, 0 },
516 { C::execution_nested_call_from_undiscarded_context, 0 } },
517 { { C::execution_sel, 1 } },
518 { { C::execution_sel, 0 } },
525TEST(ExecutionDiscardConstrainingTest, ExploitAvoidDiscardByDelayingRaise)
531 TestTraceContainer
trace({
532 { { C::precomputed_first_row, 1 } },
534 { { C::execution_sel, 1 },
535 { C::execution_context_id, 1 },
536 { C::execution_discard, 0 },
537 { C::execution_dying_context_id, 0 },
538 { C::execution_dying_context_diff_inv,
FF(1 - 0).invert() },
539 { C::execution_enqueued_call_end, 0 },
540 { C::execution_resolves_dying_context, 0 },
541 { C::execution_nested_call_from_undiscarded_context, 0 } },
543 { { C::execution_sel, 1 },
544 { C::execution_context_id, 1 },
545 { C::execution_discard, 0 },
546 { C::execution_dying_context_id, 0 },
547 { C::execution_dying_context_diff_inv,
FF(1 - 0).invert() },
548 { C::execution_sel_enter_call, 1 },
549 { C::execution_enqueued_call_end, 0 },
550 { C::execution_resolves_dying_context, 0 },
551 { C::execution_nested_call_from_undiscarded_context, 1 } },
553 { { C::execution_sel, 1 },
554 { C::execution_context_id, 2 },
555 { C::execution_discard, 0 },
556 { C::execution_dying_context_id, 0 },
557 { C::execution_dying_context_diff_inv,
FF(2 - 0).invert() },
558 { C::execution_is_dying_context, 0 },
559 { C::execution_enqueued_call_end, 0 },
560 { C::execution_resolves_dying_context, 0 },
561 { C::execution_nested_call_from_undiscarded_context, 0 } },
563 { { C::execution_sel, 1 },
564 { C::execution_context_id, 2 },
565 { C::execution_discard, 0 },
566 { C::execution_dying_context_id, 0 },
567 { C::execution_dying_context_diff_inv,
FF(2 - 0).invert() },
568 { C::execution_sel_enter_call, 1 },
569 { C::execution_enqueued_call_end, 0 },
570 { C::execution_resolves_dying_context, 0 },
571 { C::execution_nested_call_from_undiscarded_context, 1 } },
573 { { C::execution_sel, 1 },
574 { C::execution_context_id, 3 },
575 { C::execution_discard, 1 },
576 { C::execution_dying_context_id, 2 },
577 { C::execution_dying_context_id_inv,
FF(2).invert() },
578 { C::execution_dying_context_diff_inv,
FF(3 - 2).invert() },
579 { C::execution_is_dying_context, 0 },
580 { C::execution_enqueued_call_end, 0 },
581 { C::execution_resolves_dying_context, 0 },
582 { C::execution_nested_call_from_undiscarded_context, 0 } },
584 { { C::execution_sel, 1 },
585 { C::execution_context_id, 3 },
586 { C::execution_discard, 1 },
587 { C::execution_dying_context_id, 2 },
588 { C::execution_dying_context_id_inv,
FF(2).invert() },
589 { C::execution_dying_context_diff_inv,
FF(3 - 2).invert() },
590 { C::execution_is_dying_context, 0 },
591 { C::execution_sel_exit_call, 1 },
592 { C::execution_sel_error, 1 },
593 { C::execution_sel_failure, 1 },
594 { C::execution_has_parent_ctx, 1 },
595 { C::execution_enqueued_call_end, 0 },
596 { C::execution_resolves_dying_context, 0 },
597 { C::execution_nested_call_from_undiscarded_context, 0 } },
599 { { C::execution_sel, 1 },
600 { C::execution_context_id, 2 },
601 { C::execution_discard, 1 },
602 { C::execution_dying_context_id, 2 },
603 { C::execution_dying_context_id_inv,
FF(2).invert() },
604 { C::execution_dying_context_diff_inv, 0 },
605 { C::execution_is_dying_context, 1 },
606 { C::execution_enqueued_call_end, 0 },
607 { C::execution_resolves_dying_context, 0 },
608 { C::execution_nested_call_from_undiscarded_context, 0 } },
610 { { C::execution_sel, 1 },
611 { C::execution_context_id, 2 },
612 { C::execution_discard, 1 },
613 { C::execution_dying_context_id, 2 },
614 { C::execution_dying_context_id_inv,
FF(2).invert() },
615 { C::execution_dying_context_diff_inv, 0 },
616 { C::execution_is_dying_context, 1 },
617 { C::execution_sel_exit_call, 1 },
618 { C::execution_sel_error, 1 },
619 { C::execution_sel_failure, 1 },
620 { C::execution_has_parent_ctx, 1 },
621 { C::execution_enqueued_call_end, 0 },
622 { C::execution_resolves_dying_context, 1 },
623 { C::execution_nested_call_from_undiscarded_context, 0 } },
624 { { C::execution_sel, 1 } },
625 { { C::execution_sel, 0 } },
632TEST(ExecutionDiscardConstrainingTest, ExploitChangesDyingContextAfterResolution)
638 TestTraceContainer
trace({
639 { { C::precomputed_first_row, 1 } },
641 { { C::execution_sel, 1 },
642 { C::execution_context_id, 1 },
643 { C::execution_discard, 0 },
644 { C::execution_dying_context_id, 0 },
645 { C::execution_dying_context_diff_inv,
FF(1 - 0).invert() },
646 { C::execution_sel_enter_call, 1 },
647 { C::execution_enqueued_call_end, 0 },
648 { C::execution_resolves_dying_context, 0 },
649 { C::execution_nested_call_from_undiscarded_context, 1 } },
651 { { C::execution_sel, 1 },
652 { C::execution_context_id, 2 },
653 { C::execution_discard, 0 },
654 { C::execution_dying_context_id, 0 },
655 { C::execution_dying_context_diff_inv,
FF(2 - 0).invert() },
656 { C::execution_enqueued_call_end, 0 },
657 { C::execution_resolves_dying_context, 0 },
658 { C::execution_nested_call_from_undiscarded_context, 0 } },
660 { { C::execution_sel, 1 },
661 { C::execution_context_id, 2 },
662 { C::execution_discard, 0 },
663 { C::execution_dying_context_id, 0 },
664 { C::execution_dying_context_diff_inv,
FF(2 - 0).invert() },
665 { C::execution_sel_enter_call, 1 },
666 { C::execution_enqueued_call_end, 0 },
667 { C::execution_resolves_dying_context, 0 },
668 { C::execution_nested_call_from_undiscarded_context, 1 } },
670 { { C::execution_sel, 1 },
671 { C::execution_context_id, 3 },
672 { C::execution_discard, 1 },
673 { C::execution_dying_context_id, 3 },
674 { C::execution_dying_context_id_inv,
FF(3).invert() },
675 { C::execution_dying_context_diff_inv, 0 },
676 { C::execution_is_dying_context, 1 },
677 { C::execution_enqueued_call_end, 0 },
678 { C::execution_resolves_dying_context, 0 },
679 { C::execution_nested_call_from_undiscarded_context, 0 } },
681 { { C::execution_sel, 1 },
682 { C::execution_context_id, 3 },
683 { C::execution_discard, 1 },
684 { C::execution_dying_context_id, 3 },
685 { C::execution_dying_context_id_inv,
FF(3).invert() },
686 { C::execution_dying_context_diff_inv, 0 },
687 { C::execution_is_dying_context, 1 },
688 { C::execution_sel_exit_call, 1 },
689 { C::execution_sel_error, 1 },
690 { C::execution_sel_failure, 1 },
691 { C::execution_has_parent_ctx, 1 },
692 { C::execution_enqueued_call_end, 0 },
693 { C::execution_resolves_dying_context, 1 },
694 { C::execution_nested_call_from_undiscarded_context, 0 } },
696 { { C::execution_sel, 1 },
697 { C::execution_context_id, 2 },
698 { C::execution_discard, 1 },
699 { C::execution_dying_context_id, 2 },
700 { C::execution_dying_context_id_inv,
FF(2).invert() },
701 { C::execution_dying_context_diff_inv, 0 },
702 { C::execution_is_dying_context, 1 },
703 { C::execution_enqueued_call_end, 0 },
704 { C::execution_resolves_dying_context, 0 },
705 { C::execution_nested_call_from_undiscarded_context, 0 } },
707 { { C::execution_sel, 1 },
708 { C::execution_context_id, 2 },
709 { C::execution_discard, 1 },
710 { C::execution_dying_context_id, 2 },
711 { C::execution_dying_context_id_inv,
FF(2).invert() },
712 { C::execution_dying_context_diff_inv, 0 },
713 { C::execution_is_dying_context, 1 },
714 { C::execution_sel_exit_call, 1 },
715 { C::execution_sel_error, 1 },
716 { C::execution_sel_failure, 1 },
717 { C::execution_has_parent_ctx, 1 },
718 { C::execution_enqueued_call_end, 0 },
719 { C::execution_resolves_dying_context, 1 },
720 { C::execution_nested_call_from_undiscarded_context, 0 } },
721 { { C::execution_sel, 1 } },
722 { { C::execution_sel, 0 } },
void set(Column col, uint32_t row, const FF &value)
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessage)
TEST(TxExecutionConstrainingTest, WriteTreeValue)
TestTraceContainer empty_trace()