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 },
165 { { C::execution_sel, 1 },
166 { C::execution_discard, 0 },
167 { C::execution_dying_context_id, 0 },
168 { C::execution_dying_context_id_inv, 0 },
169 { C::execution_enqueued_call_end, 0 } },
171 { { C::execution_sel, 1 }, { C::execution_discard, 0 }, { C::execution_dying_context_id, 0 } },
172 { { C::execution_sel, 0 } },
175 check_relation<execution_discard>(
176 trace, execution_discard::SR_DISCARD_IFF_DYING_CONTEXT, execution_discard::SR_DYING_CONTEXT_PROPAGATION);
179 trace.
set(C::execution_discard, 2, 42);
181 execution_discard::SR_DISCARD_IFF_DYING_CONTEXT,
182 execution_discard::SR_DYING_CONTEXT_PROPAGATION),
183 "DISCARD_IFF_DYING_CONTEXT");
186 trace.
set(C::execution_dying_context_id, 2, 1);
187 trace.
set(C::execution_dying_context_id_inv, 2, 1);
189 execution_discard::SR_DISCARD_IFF_DYING_CONTEXT,
190 execution_discard::SR_DYING_CONTEXT_PROPAGATION),
191 "DYING_CONTEXT_PROPAGATION");
194TEST(ExecutionDiscardConstrainingTest, DiscardPropagationOfNonzeroDiscard)
196 TestTraceContainer
trace({
197 { { C::precomputed_first_row, 1 } },
199 { { C::execution_sel, 1 },
200 { C::execution_discard, 1 },
201 { C::execution_dying_context_id, 42 },
202 { C::execution_dying_context_id_inv,
FF(42).invert() },
203 { C::execution_sel_exit_call, 0 },
204 { C::execution_has_parent_ctx, 1 },
205 { C::execution_sel_failure, 0 },
206 { C::execution_is_dying_context, 0 },
207 { C::execution_sel_enter_call, 0 },
208 { C::execution_enqueued_call_end, 0 } },
210 { { C::execution_sel, 1 },
211 { C::execution_discard, 1 },
212 { C::execution_dying_context_id, 42 },
213 { C::execution_dying_context_id_inv,
FF(42).invert() },
214 { C::execution_enqueued_call_end, 0 } },
216 { { C::execution_sel, 1 },
217 { C::execution_discard, 1 },
218 { C::execution_dying_context_id, 42 },
219 { C::execution_dying_context_id_inv,
FF(42).invert() } },
220 { { C::execution_sel, 0 } },
223 check_relation<execution_discard>(
224 trace, execution_discard::SR_DISCARD_IFF_DYING_CONTEXT, execution_discard::SR_DYING_CONTEXT_PROPAGATION);
227 trace.
set(C::execution_discard, 2, 0);
229 execution_discard::SR_DISCARD_IFF_DYING_CONTEXT,
230 execution_discard::SR_DYING_CONTEXT_PROPAGATION),
231 "DISCARD_IFF_DYING_CONTEXT");
234 trace.
set(C::execution_dying_context_id, 2, 0);
235 trace.
set(C::execution_dying_context_id_inv, 2, 0);
237 execution_discard::SR_DISCARD_IFF_DYING_CONTEXT,
238 execution_discard::SR_DYING_CONTEXT_PROPAGATION),
239 "DYING_CONTEXT_PROPAGATION");
242TEST(ExecutionDiscardConstrainingTest, DiscardPropagationLiftedEndOfEnqueuedCall)
245 TestTraceContainer
trace({
246 { { C::precomputed_first_row, 1 } },
248 { { C::execution_sel, 1 },
249 { C::execution_discard, 1 },
250 { C::execution_dying_context_id, 42 },
251 { C::execution_dying_context_id_inv,
FF(42).invert() },
252 { C::execution_sel_exit_call, 1 },
253 { C::execution_has_parent_ctx, 0 },
254 { C::execution_enqueued_call_end, 1 } },
256 { { C::execution_sel, 1 }, { C::execution_discard, 0 }, { C::execution_dying_context_id, 0 } },
257 { { C::execution_sel, 1 } },
258 { { C::execution_sel, 0 } },
261 check_relation<execution_discard>(
262 trace, execution_discard::SR_DISCARD_IFF_DYING_CONTEXT, execution_discard::SR_DYING_CONTEXT_PROPAGATION);
265TEST(ExecutionDiscardConstrainingTest, DiscardPropagationLiftedResolvesDyingContext)
268 TestTraceContainer
trace({
269 { { C::precomputed_first_row, 1 } },
271 { { C::execution_sel, 1 },
272 { C::execution_context_id, 42 },
273 { C::execution_discard, 1 },
274 { C::execution_dying_context_id, 42 },
275 { C::execution_dying_context_id_inv,
FF(42).invert() },
276 { C::execution_sel_failure, 1 },
277 { C::execution_is_dying_context, 1 },
278 { C::execution_dying_context_diff_inv, 0 },
279 { C::execution_enqueued_call_end, 0 } },
281 { { C::execution_sel, 1 },
282 { C::execution_discard, 0 },
283 { C::execution_dying_context_id, 0 },
284 { C::execution_enqueued_call_end, 0 } },
285 { { C::execution_sel, 1 } },
286 { { C::execution_sel, 0 } },
289 check_relation<execution_discard>(
290 trace, execution_discard::SR_DISCARD_IFF_DYING_CONTEXT, execution_discard::SR_DYING_CONTEXT_PROPAGATION);
293TEST(ExecutionDiscardConstrainingTest, DiscardPropagationLiftedNestedCallFromUndiscarded)
296 TestTraceContainer
trace({
297 { { C::precomputed_first_row, 1 } },
299 { { C::execution_sel, 1 },
300 { C::execution_discard, 0 },
301 { C::execution_dying_context_id, 0 },
302 { C::execution_sel_enter_call, 1 },
303 { C::execution_enqueued_call_end, 0 } },
305 { { C::execution_sel, 1 },
306 { C::execution_discard, 1 },
307 { C::execution_dying_context_id, 99 },
308 { C::execution_dying_context_id_inv,
FF(99).invert() } },
310 { { C::execution_sel, 1 },
311 { C::execution_discard, 1 },
312 { C::execution_dying_context_id, 99 },
313 { C::execution_dying_context_id_inv,
FF(99).invert() } },
314 { { C::execution_sel, 0 } },
318 check_relation<execution_discard>(
319 trace, execution_discard::SR_DISCARD_IFF_DYING_CONTEXT, execution_discard::SR_DYING_CONTEXT_PROPAGATION);
322TEST(ExecutionDiscardConstrainingTest, DiscardDyingContextMustError)
325 TestTraceContainer
trace({
326 { { C::precomputed_first_row, 1 } },
328 { { C::execution_sel, 1 },
329 { C::execution_context_id, 42 },
330 { C::execution_discard, 1 },
331 { C::execution_dying_context_id, 42 },
332 { C::execution_is_dying_context, 1 },
333 { C::execution_sel_exit_call, 1 },
334 { C::execution_sel_error, 1 },
335 { C::execution_sel_execute_revert, 0 },
336 { C::execution_sel_failure, 1 },
337 { C::execution_dying_context_diff_inv, 0 } },
338 { { C::execution_sel, 1 } },
339 { { C::execution_sel, 0 } },
342 check_relation<execution_discard>(trace, execution_discard::SR_DYING_CONTEXT_MUST_FAIL);
345 trace.
set(C::execution_sel_failure, 1, 0);
346 trace.
set(C::execution_sel_error, 1, 0);
347 trace.
set(C::execution_sel_execute_revert, 1, 0);
351 trace.
set(C::execution_sel_execute_return, 1, 1);
354 "DYING_CONTEXT_MUST_FAIL");
357TEST(ExecutionDiscardConstrainingTest, DiscardComplexScenario)
360 TestTraceContainer
trace({
361 { { C::precomputed_first_row, 1 } },
363 { { C::execution_sel, 1 },
364 { C::execution_context_id, 1 },
365 { C::execution_discard, 0 },
366 { C::execution_dying_context_id, 0 },
367 { C::execution_dying_context_diff_inv,
FF(1 - 0).invert() },
368 { C::execution_is_dying_context, 0 },
369 { C::execution_enqueued_call_end, 0 } },
371 { { C::execution_sel, 1 },
372 { C::execution_context_id, 1 },
373 { C::execution_discard, 0 },
374 { C::execution_dying_context_id, 0 },
375 { C::execution_dying_context_id_inv, 0 },
376 { C::execution_dying_context_diff_inv,
FF(1 - 0).invert() },
377 { C::execution_sel_enter_call, 1 },
378 { C::execution_enqueued_call_end, 0 } },
380 { { C::execution_sel, 1 },
381 { C::execution_context_id, 2 },
382 { C::execution_discard, 1 },
383 { C::execution_dying_context_id, 2 },
384 { C::execution_dying_context_id_inv,
FF(2).invert() },
385 { C::execution_is_dying_context, 1 },
386 { C::execution_dying_context_diff_inv, 0 },
387 { C::execution_enqueued_call_end, 0 } },
389 { { C::execution_sel, 1 },
390 { C::execution_context_id, 2 },
391 { C::execution_discard, 1 },
392 { C::execution_dying_context_id, 2 },
393 { C::execution_dying_context_id_inv,
FF(2).invert() },
394 { C::execution_is_dying_context, 1 },
395 { C::execution_sel_exit_call, 1 },
396 { C::execution_sel_error, 1 },
397 { C::execution_sel_execute_revert, 0 },
398 { C::execution_sel_failure, 1 },
399 { C::execution_dying_context_diff_inv, 0 },
400 { C::execution_has_parent_ctx, 1 },
401 { C::execution_enqueued_call_end, 0 } },
403 { { C::execution_sel, 1 },
404 { C::execution_context_id, 1 },
405 { C::execution_discard, 0 },
406 { C::execution_dying_context_id, 0 },
407 { C::execution_dying_context_diff_inv,
FF(1 - 0).invert() },
408 { C::execution_is_dying_context, 0 },
409 { C::execution_enqueued_call_end, 0 } },
410 { { C::execution_sel, 0 } },
414 check_relation<execution_discard>(trace,
415 execution_discard::SR_IS_DYING_CONTEXT_CHECK,
416 execution_discard::SR_DISCARD_IFF_DYING_CONTEXT,
417 execution_discard::SR_DYING_CONTEXT_PROPAGATION,
418 execution_discard::SR_DYING_CONTEXT_MUST_FAIL);
421TEST(ExecutionDiscardConstrainingTest, DiscardWithLastRow)
424 TestTraceContainer
trace({ { { C::precomputed_first_row, 1 } },
425 { { C::execution_sel, 1 },
426 { C::execution_discard, 1 },
427 { C::execution_dying_context_id, 42 },
428 { C::execution_dying_context_id_inv,
FF(42).invert() },
429 { C::execution_enqueued_call_end, 0 } },
431 { { C::execution_sel, 1 },
432 { C::execution_discard, 1 },
433 { C::execution_dying_context_id, 42 },
434 { C::execution_dying_context_id_inv,
FF(42).invert() } },
435 { { C::execution_sel, 0 } } });
437 check_relation<execution_discard>(
438 trace, execution_discard::SR_DISCARD_IFF_DYING_CONTEXT, execution_discard::SR_DYING_CONTEXT_PROPAGATION);
443TEST(ExecutionDiscardConstrainingTest, ExploitRaiseDiscardWithWrongDyingContext)
449 TestTraceContainer
trace({
450 { { C::precomputed_first_row, 1 } },
452 { { C::execution_sel, 1 },
453 { C::execution_context_id, 1 },
454 { C::execution_discard, 0 },
455 { C::execution_dying_context_id, 0 },
456 { C::execution_dying_context_diff_inv,
FF(1 - 0).invert() },
457 { C::execution_is_dying_context, 0 },
458 { C::execution_enqueued_call_end, 0 } },
460 { { C::execution_sel, 1 },
461 { C::execution_context_id, 1 },
462 { C::execution_discard, 0 },
463 { C::execution_dying_context_id, 0 },
464 { C::execution_dying_context_diff_inv,
FF(1 - 0).invert() },
465 { C::execution_sel_enter_call, 1 },
466 { C::execution_enqueued_call_end, 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_enqueued_call_end, 0 } },
477 { { C::execution_sel, 1 },
478 { C::execution_context_id, 2 },
479 { C::execution_discard, 1 },
480 { C::execution_dying_context_id, 3 },
481 { C::execution_dying_context_id_inv,
FF(3).invert() },
482 { C::execution_dying_context_diff_inv,
FF(2 - 3).invert() },
483 { C::execution_is_dying_context, 0 },
484 { C::execution_sel_enter_call, 1 },
485 { C::execution_enqueued_call_end, 0 } },
487 { { C::execution_sel, 1 },
488 { C::execution_context_id, 3 },
489 { C::execution_discard, 1 },
490 { C::execution_dying_context_id, 3 },
491 { C::execution_dying_context_id_inv,
FF(3).invert() },
492 { C::execution_dying_context_diff_inv, 0 },
493 { C::execution_is_dying_context, 1 },
494 { C::execution_sel_exit_call, 1 },
495 { C::execution_sel_error, 1 },
496 { C::execution_sel_failure, 1 },
497 { C::execution_has_parent_ctx, 1 },
498 { C::execution_enqueued_call_end, 0 } },
500 { { C::execution_sel, 1 },
501 { C::execution_context_id, 2 },
502 { C::execution_discard, 0 },
503 { C::execution_dying_context_id, 0 },
504 { C::execution_dying_context_diff_inv,
FF(2 - 0).invert() },
505 { C::execution_is_dying_context, 0 },
506 { C::execution_enqueued_call_end, 0 } },
508 { { C::execution_sel, 1 },
509 { C::execution_context_id, 2 },
510 { C::execution_discard, 0 },
511 { C::execution_dying_context_id, 0 },
512 { C::execution_dying_context_diff_inv,
FF(2 - 0).invert() },
513 { C::execution_sel_exit_call, 1 },
514 { C::execution_sel_error, 0 },
515 { C::execution_sel_failure, 0 },
516 { C::execution_has_parent_ctx, 1 },
517 { C::execution_enqueued_call_end, 0 } },
518 { { C::execution_sel, 1 } },
519 { { C::execution_sel, 0 } },
526TEST(ExecutionDiscardConstrainingTest, ExploitAvoidDiscardByDelayingRaise)
532 TestTraceContainer
trace({
533 { { C::precomputed_first_row, 1 } },
535 { { C::execution_sel, 1 },
536 { C::execution_context_id, 1 },
537 { C::execution_discard, 0 },
538 { C::execution_dying_context_id, 0 },
539 { C::execution_dying_context_diff_inv,
FF(1 - 0).invert() },
540 { C::execution_enqueued_call_end, 0 } },
542 { { C::execution_sel, 1 },
543 { C::execution_context_id, 1 },
544 { C::execution_discard, 0 },
545 { C::execution_dying_context_id, 0 },
546 { C::execution_dying_context_diff_inv,
FF(1 - 0).invert() },
547 { C::execution_sel_enter_call, 1 },
548 { C::execution_enqueued_call_end, 0 } },
550 { { C::execution_sel, 1 },
551 { C::execution_context_id, 2 },
552 { C::execution_discard, 0 },
553 { C::execution_dying_context_id, 0 },
554 { C::execution_dying_context_diff_inv,
FF(2 - 0).invert() },
555 { C::execution_is_dying_context, 0 },
556 { C::execution_enqueued_call_end, 0 } },
558 { { C::execution_sel, 1 },
559 { C::execution_context_id, 2 },
560 { C::execution_discard, 0 },
561 { C::execution_dying_context_id, 0 },
562 { C::execution_dying_context_diff_inv,
FF(2 - 0).invert() },
563 { C::execution_sel_enter_call, 1 },
564 { C::execution_enqueued_call_end, 0 } },
566 { { C::execution_sel, 1 },
567 { C::execution_context_id, 3 },
568 { C::execution_discard, 1 },
569 { C::execution_dying_context_id, 2 },
570 { C::execution_dying_context_id_inv,
FF(2).invert() },
571 { C::execution_dying_context_diff_inv,
FF(3 - 2).invert() },
572 { C::execution_is_dying_context, 0 },
573 { C::execution_enqueued_call_end, 0 } },
575 { { C::execution_sel, 1 },
576 { C::execution_context_id, 3 },
577 { C::execution_discard, 1 },
578 { C::execution_dying_context_id, 2 },
579 { C::execution_dying_context_id_inv,
FF(2).invert() },
580 { C::execution_dying_context_diff_inv,
FF(3 - 2).invert() },
581 { C::execution_is_dying_context, 0 },
582 { C::execution_sel_exit_call, 1 },
583 { C::execution_sel_error, 1 },
584 { C::execution_sel_failure, 1 },
585 { C::execution_has_parent_ctx, 1 },
586 { C::execution_enqueued_call_end, 0 } },
588 { { C::execution_sel, 1 },
589 { C::execution_context_id, 2 },
590 { C::execution_discard, 1 },
591 { C::execution_dying_context_id, 2 },
592 { C::execution_dying_context_id_inv,
FF(2).invert() },
593 { C::execution_dying_context_diff_inv, 0 },
594 { C::execution_is_dying_context, 1 },
595 { C::execution_enqueued_call_end, 0 } },
597 { { C::execution_sel, 1 },
598 { C::execution_context_id, 2 },
599 { C::execution_discard, 1 },
600 { C::execution_dying_context_id, 2 },
601 { C::execution_dying_context_id_inv,
FF(2).invert() },
602 { C::execution_dying_context_diff_inv, 0 },
603 { C::execution_is_dying_context, 1 },
604 { C::execution_sel_exit_call, 1 },
605 { C::execution_sel_error, 1 },
606 { C::execution_sel_failure, 1 },
607 { C::execution_has_parent_ctx, 1 },
608 { C::execution_enqueued_call_end, 0 } },
609 { { C::execution_sel, 1 } },
610 { { C::execution_sel, 0 } },
617TEST(ExecutionDiscardConstrainingTest, ExploitChangesDyingContextAfterResolution)
623 TestTraceContainer
trace({
624 { { C::precomputed_first_row, 1 } },
626 { { C::execution_sel, 1 },
627 { C::execution_context_id, 1 },
628 { C::execution_discard, 0 },
629 { C::execution_dying_context_id, 0 },
630 { C::execution_dying_context_diff_inv,
FF(1 - 0).invert() },
631 { C::execution_sel_enter_call, 1 },
632 { C::execution_enqueued_call_end, 0 } },
634 { { C::execution_sel, 1 },
635 { C::execution_context_id, 2 },
636 { C::execution_discard, 0 },
637 { C::execution_dying_context_id, 0 },
638 { C::execution_dying_context_diff_inv,
FF(2 - 0).invert() },
639 { C::execution_enqueued_call_end, 0 } },
641 { { C::execution_sel, 1 },
642 { C::execution_context_id, 2 },
643 { C::execution_discard, 0 },
644 { C::execution_dying_context_id, 0 },
645 { C::execution_dying_context_diff_inv,
FF(2 - 0).invert() },
646 { C::execution_sel_enter_call, 1 },
647 { C::execution_enqueued_call_end, 0 } },
649 { { C::execution_sel, 1 },
650 { C::execution_context_id, 3 },
651 { C::execution_discard, 1 },
652 { C::execution_dying_context_id, 3 },
653 { C::execution_dying_context_id_inv,
FF(3).invert() },
654 { C::execution_dying_context_diff_inv, 0 },
655 { C::execution_is_dying_context, 1 },
656 { C::execution_enqueued_call_end, 0 } },
658 { { C::execution_sel, 1 },
659 { C::execution_context_id, 3 },
660 { C::execution_discard, 1 },
661 { C::execution_dying_context_id, 3 },
662 { C::execution_dying_context_id_inv,
FF(3).invert() },
663 { C::execution_dying_context_diff_inv, 0 },
664 { C::execution_is_dying_context, 1 },
665 { C::execution_sel_exit_call, 1 },
666 { C::execution_sel_error, 1 },
667 { C::execution_sel_failure, 1 },
668 { C::execution_has_parent_ctx, 1 },
669 { C::execution_enqueued_call_end, 0 } },
671 { { C::execution_sel, 1 },
672 { C::execution_context_id, 2 },
673 { C::execution_discard, 1 },
674 { C::execution_dying_context_id, 2 },
675 { C::execution_dying_context_id_inv,
FF(2).invert() },
676 { C::execution_dying_context_diff_inv, 0 },
677 { C::execution_is_dying_context, 1 },
678 { C::execution_enqueued_call_end, 0 } },
680 { { C::execution_sel, 1 },
681 { C::execution_context_id, 2 },
682 { C::execution_discard, 1 },
683 { C::execution_dying_context_id, 2 },
684 { C::execution_dying_context_id_inv,
FF(2).invert() },
685 { C::execution_dying_context_diff_inv, 0 },
686 { C::execution_is_dying_context, 1 },
687 { C::execution_sel_exit_call, 1 },
688 { C::execution_sel_error, 1 },
689 { C::execution_sel_failure, 1 },
690 { C::execution_has_parent_ctx, 1 },
691 { C::execution_enqueued_call_end, 0 } },
692 { { C::execution_sel, 1 } },
693 { { C::execution_sel, 0 } },
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessageRegex)
void set(Column col, uint32_t row, const FF &value)
TEST(AvmFixedVKTests, FixedVKCommitments)
Test that the fixed VK commitments agree with the ones computed from precomputed columns.
TestTraceContainer empty_trace()