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 }, { C::execution_last, 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 }, { C::execution_last, 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_last, 1 },
128 { C::execution_context_id, 7 },
129 { C::execution_discard, 0 },
130 { C::execution_dying_context_id, 0 },
131 { C::execution_is_dying_context, 0 },
132 { C::execution_dying_context_diff_inv,
FF(7 - 0).invert() } },
133 { { C::execution_sel, 0 } },
136 check_relation<execution_discard>(
trace, execution_discard::SR_IS_DYING_CONTEXT_CHECK);
139 trace.
set(C::execution_is_dying_context, 1, 0);
141 "IS_DYING_CONTEXT_CHECK");
144 trace.
set(C::execution_is_dying_context, 1, 1);
145 trace.
set(C::execution_is_dying_context, 2, 1);
147 "IS_DYING_CONTEXT_CHECK");
150TEST(ExecutionDiscardConstrainingTest, DiscardPropagationOfZeroDiscard)
152 TestTraceContainer
trace({
153 { { 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 },
165 { C::execution_propagate_discard, 1 } },
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 },
174 { C::execution_propagate_discard, 1 } },
176 { { C::execution_sel, 1 },
177 { C::execution_discard, 0 },
178 { C::execution_dying_context_id, 0 },
179 { C::execution_last, 1 } },
180 { { C::execution_sel, 0 } },
183 check_relation<execution_discard>(
184 trace, execution_discard::SR_DISCARD_PROPAGATION, execution_discard::SR_DYING_CONTEXT_PROPAGATION);
187 trace.
set(C::execution_discard, 2, 42);
189 "DISCARD_PROPAGATION");
192TEST(ExecutionDiscardConstrainingTest, DiscardPropagationOfNonzeroDiscard)
194 TestTraceContainer
trace({
195 { { C::precomputed_first_row, 1 } },
197 { { C::execution_sel, 1 },
198 { C::execution_discard, 1 },
199 { C::execution_dying_context_id, 42 },
200 { C::execution_sel_exit_call, 0 },
201 { C::execution_has_parent_ctx, 1 },
202 { C::execution_sel_failure, 0 },
203 { C::execution_is_dying_context, 0 },
204 { C::execution_sel_enter_call, 0 },
205 { C::execution_enqueued_call_end, 0 },
206 { C::execution_resolves_dying_context, 0 },
207 { C::execution_nested_call_from_undiscarded_context, 0 },
208 { C::execution_propagate_discard, 1 } },
210 { { C::execution_sel, 1 },
211 { C::execution_discard, 1 },
212 { C::execution_dying_context_id, 42 },
213 { C::execution_enqueued_call_end, 0 },
214 { C::execution_resolves_dying_context, 0 },
215 { C::execution_nested_call_from_undiscarded_context, 0 },
216 { C::execution_propagate_discard, 1 } },
218 { { C::execution_sel, 1 },
219 { C::execution_discard, 1 },
220 { C::execution_dying_context_id, 42 },
221 { C::execution_last, 1 } },
222 { { C::execution_sel, 0 } },
225 check_relation<execution_discard>(
226 trace, execution_discard::SR_DISCARD_PROPAGATION, execution_discard::SR_DYING_CONTEXT_PROPAGATION);
229 trace.
set(C::execution_discard, 2, 0);
231 "DISCARD_PROPAGATION");
234TEST(ExecutionDiscardConstrainingTest, DiscardPropagationLiftedEndOfEnqueuedCall)
237 TestTraceContainer
trace({
238 { { C::precomputed_first_row, 1 } },
240 { { C::execution_sel, 1 },
241 { C::execution_discard, 1 },
242 { C::execution_dying_context_id, 42 },
243 { C::execution_sel_exit_call, 1 },
244 { C::execution_has_parent_ctx, 0 },
245 { C::execution_enqueued_call_end, 1 },
246 { C::execution_resolves_dying_context, 0 },
247 { C::execution_nested_call_from_undiscarded_context, 0 } },
249 { { C::execution_sel, 1 }, { C::execution_discard, 0 }, { C::execution_dying_context_id, 0 } },
250 { { C::execution_sel, 1 }, { C::execution_last, 1 } },
251 { { C::execution_sel, 0 } },
254 check_relation<execution_discard>(
255 trace, execution_discard::SR_DISCARD_PROPAGATION, execution_discard::SR_DYING_CONTEXT_PROPAGATION);
258TEST(ExecutionDiscardConstrainingTest, DiscardPropagationLiftedResolvesDyingContext)
261 TestTraceContainer
trace({
262 { { C::precomputed_first_row, 1 } },
264 { { C::execution_sel, 1 },
265 { C::execution_context_id, 42 },
266 { C::execution_discard, 1 },
267 { C::execution_dying_context_id, 42 },
268 { C::execution_sel_failure, 1 },
269 { C::execution_is_dying_context, 1 },
270 { C::execution_dying_context_diff_inv, 0 },
271 { C::execution_enqueued_call_end, 0 },
272 { C::execution_resolves_dying_context, 1 },
273 { C::execution_nested_call_from_undiscarded_context, 0 } },
275 { { C::execution_sel, 1 },
276 { C::execution_discard, 0 },
277 { C::execution_dying_context_id, 0 },
278 { C::execution_enqueued_call_end, 0 },
279 { C::execution_resolves_dying_context, 0 },
280 { C::execution_nested_call_from_undiscarded_context, 0 },
281 { C::execution_propagate_discard, 1 } },
282 { { C::execution_sel, 1 }, { C::execution_last, 1 } },
283 { { C::execution_sel, 0 } },
286 check_relation<execution_discard>(
287 trace, execution_discard::SR_DISCARD_PROPAGATION, execution_discard::SR_DYING_CONTEXT_PROPAGATION);
290TEST(ExecutionDiscardConstrainingTest, DiscardPropagationLiftedNestedCallFromUndiscarded)
293 TestTraceContainer
trace({
294 { { C::precomputed_first_row, 1 } },
296 { { C::execution_sel, 1 },
297 { C::execution_discard, 0 },
298 { C::execution_dying_context_id, 0 },
299 { C::execution_sel_enter_call, 1 },
300 { C::execution_enqueued_call_end, 0 },
301 { C::execution_resolves_dying_context, 0 },
302 { C::execution_nested_call_from_undiscarded_context, 1 } },
304 { { C::execution_sel, 1 }, { C::execution_discard, 1 }, { C::execution_dying_context_id, 99 } },
306 { { C::execution_sel, 1 },
307 { C::execution_discard, 1 },
308 { C::execution_dying_context_id, 99 },
309 { C::execution_last, 1 } },
310 { { C::execution_sel, 0 } },
314 check_relation<execution_discard>(
315 trace, execution_discard::SR_DISCARD_PROPAGATION, execution_discard::SR_DYING_CONTEXT_PROPAGATION);
318TEST(ExecutionDiscardConstrainingTest, DiscardDyingContextMustError)
321 TestTraceContainer
trace({
322 { { C::precomputed_first_row, 1 } },
324 { { C::execution_sel, 1 },
325 { C::execution_context_id, 42 },
326 { C::execution_discard, 1 },
327 { C::execution_dying_context_id, 42 },
328 { C::execution_is_dying_context, 1 },
329 { C::execution_sel_exit_call, 1 },
330 { C::execution_sel_error, 1 },
331 { C::execution_sel_execute_revert, 0 },
332 { C::execution_sel_failure, 1 },
333 { C::execution_dying_context_diff_inv, 0 } },
334 { { C::execution_sel, 1 }, { C::execution_last, 1 } },
335 { { C::execution_sel, 0 } },
338 check_relation<execution_discard>(
trace, execution_discard::SR_DYING_CONTEXT_MUST_FAIL);
341 trace.
set(C::execution_sel_failure, 1, 0);
342 trace.
set(C::execution_sel_error, 1, 0);
343 trace.
set(C::execution_sel_execute_revert, 1, 0);
345 "DYING_CONTEXT_MUST_FAIL");
348TEST(ExecutionDiscardConstrainingTest, DiscardComplexScenario)
351 TestTraceContainer
trace({
352 { { C::precomputed_first_row, 1 } },
354 { { C::execution_sel, 1 },
355 { C::execution_context_id, 1 },
356 { C::execution_discard, 0 },
357 { C::execution_dying_context_id, 0 },
358 { C::execution_dying_context_diff_inv,
FF(1 - 0).invert() },
359 { C::execution_is_dying_context, 0 },
360 { C::execution_enqueued_call_end, 0 },
361 { C::execution_resolves_dying_context, 0 },
362 { C::execution_nested_call_from_undiscarded_context, 0 },
363 { C::execution_propagate_discard, 1 } },
365 { { C::execution_sel, 1 },
366 { C::execution_context_id, 1 },
367 { C::execution_discard, 0 },
368 { C::execution_dying_context_id, 0 },
369 { C::execution_dying_context_id_inv, 0 },
370 { C::execution_dying_context_diff_inv,
FF(1 - 0).invert() },
371 { C::execution_sel_enter_call, 1 },
372 { C::execution_enqueued_call_end, 0 },
373 { C::execution_resolves_dying_context, 0 },
374 { C::execution_nested_call_from_undiscarded_context, 1 },
375 { C::execution_propagate_discard, 0 } },
377 { { C::execution_sel, 1 },
378 { C::execution_context_id, 2 },
379 { C::execution_discard, 1 },
380 { C::execution_dying_context_id, 2 },
381 { C::execution_is_dying_context, 1 },
382 { C::execution_dying_context_diff_inv, 0 },
383 { C::execution_enqueued_call_end, 0 },
384 { C::execution_resolves_dying_context, 0 },
385 { C::execution_nested_call_from_undiscarded_context, 0 },
386 { C::execution_propagate_discard, 1 } },
388 { { C::execution_sel, 1 },
389 { C::execution_context_id, 2 },
390 { C::execution_discard, 1 },
391 { C::execution_dying_context_id, 2 },
392 { C::execution_is_dying_context, 1 },
393 { C::execution_sel_exit_call, 1 },
394 { C::execution_sel_error, 1 },
395 { C::execution_sel_execute_revert, 0 },
396 { C::execution_sel_failure, 1 },
397 { C::execution_dying_context_diff_inv, 0 },
398 { C::execution_has_parent_ctx, 1 },
399 { C::execution_enqueued_call_end, 0 },
400 { C::execution_resolves_dying_context, 1 },
401 { C::execution_nested_call_from_undiscarded_context, 0 },
402 { C::execution_propagate_discard, 0 } },
404 { { C::execution_sel, 1 },
405 { C::execution_context_id, 1 },
406 { C::execution_discard, 0 },
407 { C::execution_dying_context_id, 0 },
408 { C::execution_dying_context_diff_inv,
FF(1 - 0).invert() },
409 { C::execution_is_dying_context, 0 },
410 { C::execution_enqueued_call_end, 0 },
411 { C::execution_resolves_dying_context, 0 },
412 { C::execution_nested_call_from_undiscarded_context, 0 },
413 { C::execution_propagate_discard, 1 } },
414 { { C::execution_sel, 0 } },
418 check_relation<execution_discard>(
trace,
419 execution_discard::SR_IS_DYING_CONTEXT_CHECK,
420 execution_discard::SR_DISCARD_PROPAGATION,
421 execution_discard::SR_DYING_CONTEXT_PROPAGATION,
422 execution_discard::SR_DYING_CONTEXT_MUST_FAIL);
425TEST(ExecutionDiscardConstrainingTest, DiscardWithLastRow)
428 TestTraceContainer
trace({
429 { { C::precomputed_first_row, 1 } },
430 { { C::execution_sel, 1 },
431 { C::execution_discard, 1 },
432 { C::execution_dying_context_id, 42 },
433 { C::execution_enqueued_call_end, 0 },
434 { C::execution_resolves_dying_context, 0 },
435 { C::execution_nested_call_from_undiscarded_context, 0 },
436 { C::execution_propagate_discard, 1 } },
438 { { C::execution_sel, 1 },
439 { C::execution_discard, 1 },
440 { C::execution_dying_context_id, 42 },
441 { C::execution_last, 1 } },
442 { { C::execution_sel, 0 } },
445 check_relation<execution_discard>(
446 trace, execution_discard::SR_DISCARD_PROPAGATION, execution_discard::SR_DYING_CONTEXT_PROPAGATION);
451TEST(ExecutionDiscardConstrainingTest, ExploitRaiseDiscardWithWrongDyingContext)
457 TestTraceContainer
trace({
458 { { C::precomputed_first_row, 1 } },
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_is_dying_context, 0 },
466 { C::execution_enqueued_call_end, 0 },
467 { C::execution_resolves_dying_context, 0 },
468 { C::execution_nested_call_from_undiscarded_context, 0 },
469 { C::execution_propagate_discard, 1 } },
471 { { C::execution_sel, 1 },
472 { C::execution_context_id, 1 },
473 { C::execution_discard, 0 },
474 { C::execution_dying_context_id, 0 },
475 { C::execution_dying_context_diff_inv,
FF(1 - 0).invert() },
476 { C::execution_sel_enter_call, 1 },
477 { C::execution_enqueued_call_end, 0 },
478 { C::execution_resolves_dying_context, 0 },
479 { C::execution_nested_call_from_undiscarded_context, 1 },
480 { C::execution_propagate_discard, 0 } },
482 { { C::execution_sel, 1 },
483 { C::execution_context_id, 2 },
484 { C::execution_discard, 1 },
485 { C::execution_dying_context_id, 3 },
486 { C::execution_dying_context_id_inv,
FF(3).invert() },
487 { C::execution_dying_context_diff_inv,
FF(2 - 3).invert() },
488 { C::execution_is_dying_context, 0 },
489 { C::execution_enqueued_call_end, 0 },
490 { C::execution_resolves_dying_context, 0 },
491 { C::execution_nested_call_from_undiscarded_context, 0 },
492 { C::execution_propagate_discard, 1 } },
494 { { C::execution_sel, 1 },
495 { C::execution_context_id, 2 },
496 { C::execution_discard, 1 },
497 { C::execution_dying_context_id, 3 },
498 { C::execution_dying_context_id_inv,
FF(3).invert() },
499 { C::execution_dying_context_diff_inv,
FF(2 - 3).invert() },
500 { C::execution_is_dying_context, 0 },
501 { C::execution_sel_enter_call, 1 },
502 { C::execution_enqueued_call_end, 0 },
503 { C::execution_resolves_dying_context, 0 },
504 { C::execution_nested_call_from_undiscarded_context, 0 },
505 { C::execution_propagate_discard, 0 } },
507 { { C::execution_sel, 1 },
508 { C::execution_context_id, 3 },
509 { C::execution_discard, 1 },
510 { C::execution_dying_context_id, 3 },
511 { C::execution_dying_context_id_inv,
FF(3).invert() },
512 { C::execution_dying_context_diff_inv, 0 },
513 { C::execution_is_dying_context, 1 },
514 { C::execution_sel_exit_call, 1 },
515 { C::execution_sel_error, 1 },
516 { C::execution_sel_failure, 1 },
517 { C::execution_has_parent_ctx, 1 },
518 { C::execution_enqueued_call_end, 0 },
519 { C::execution_resolves_dying_context, 1 },
520 { C::execution_nested_call_from_undiscarded_context, 0 },
521 { C::execution_propagate_discard, 0 } },
523 { { C::execution_sel, 1 },
524 { C::execution_context_id, 2 },
525 { C::execution_discard, 0 },
526 { C::execution_dying_context_id, 0 },
527 { C::execution_dying_context_diff_inv,
FF(2 - 0).invert() },
528 { C::execution_is_dying_context, 0 },
529 { C::execution_enqueued_call_end, 0 },
530 { C::execution_resolves_dying_context, 0 },
531 { C::execution_nested_call_from_undiscarded_context, 0 },
532 { C::execution_propagate_discard, 1 } },
534 { { C::execution_sel, 1 },
535 { C::execution_context_id, 2 },
536 { C::execution_discard, 0 },
537 { C::execution_dying_context_id, 0 },
538 { C::execution_dying_context_diff_inv,
FF(2 - 0).invert() },
539 { C::execution_sel_exit_call, 1 },
540 { C::execution_sel_error, 0 },
541 { C::execution_sel_failure, 0 },
542 { C::execution_has_parent_ctx, 1 },
543 { C::execution_enqueued_call_end, 0 },
544 { C::execution_resolves_dying_context, 0 },
545 { C::execution_nested_call_from_undiscarded_context, 0 },
546 { C::execution_propagate_discard, 0 } },
547 { { C::execution_sel, 1 }, { C::execution_last, 1 } },
548 { { C::execution_sel, 0 } },
555TEST(ExecutionDiscardConstrainingTest, ExploitAvoidDiscardByDelayingRaise)
561 TestTraceContainer
trace({
562 { { C::precomputed_first_row, 1 } },
564 { { C::execution_sel, 1 },
565 { C::execution_context_id, 1 },
566 { C::execution_discard, 0 },
567 { C::execution_dying_context_id, 0 },
568 { C::execution_dying_context_diff_inv,
FF(1 - 0).invert() },
569 { C::execution_enqueued_call_end, 0 },
570 { C::execution_resolves_dying_context, 0 },
571 { C::execution_nested_call_from_undiscarded_context, 0 },
572 { C::execution_propagate_discard, 1 } },
574 { { C::execution_sel, 1 },
575 { C::execution_context_id, 1 },
576 { C::execution_discard, 0 },
577 { C::execution_dying_context_id, 0 },
578 { C::execution_dying_context_diff_inv,
FF(1 - 0).invert() },
579 { C::execution_sel_enter_call, 1 },
580 { C::execution_enqueued_call_end, 0 },
581 { C::execution_resolves_dying_context, 0 },
582 { C::execution_nested_call_from_undiscarded_context, 1 },
583 { C::execution_propagate_discard, 0 } },
585 { { C::execution_sel, 1 },
586 { C::execution_context_id, 2 },
587 { C::execution_discard, 0 },
588 { C::execution_dying_context_id, 0 },
589 { C::execution_dying_context_diff_inv,
FF(2 - 0).invert() },
590 { C::execution_is_dying_context, 0 },
591 { C::execution_enqueued_call_end, 0 },
592 { C::execution_resolves_dying_context, 0 },
593 { C::execution_nested_call_from_undiscarded_context, 0 },
594 { C::execution_propagate_discard, 1 } },
596 { { C::execution_sel, 1 },
597 { C::execution_context_id, 2 },
598 { C::execution_discard, 0 },
599 { C::execution_dying_context_id, 0 },
600 { C::execution_dying_context_diff_inv,
FF(2 - 0).invert() },
601 { C::execution_sel_enter_call, 1 },
602 { C::execution_enqueued_call_end, 0 },
603 { C::execution_resolves_dying_context, 0 },
604 { C::execution_nested_call_from_undiscarded_context, 1 },
605 { C::execution_propagate_discard, 0 } },
607 { { C::execution_sel, 1 },
608 { C::execution_context_id, 3 },
609 { C::execution_discard, 1 },
610 { C::execution_dying_context_id, 2 },
611 { C::execution_dying_context_id_inv,
FF(2).invert() },
612 { C::execution_dying_context_diff_inv,
FF(3 - 2).invert() },
613 { C::execution_is_dying_context, 0 },
614 { C::execution_enqueued_call_end, 0 },
615 { C::execution_resolves_dying_context, 0 },
616 { C::execution_nested_call_from_undiscarded_context, 0 },
617 { C::execution_propagate_discard, 1 } },
619 { { C::execution_sel, 1 },
620 { C::execution_context_id, 3 },
621 { C::execution_discard, 1 },
622 { C::execution_dying_context_id, 2 },
623 { C::execution_dying_context_id_inv,
FF(2).invert() },
624 { C::execution_dying_context_diff_inv,
FF(3 - 2).invert() },
625 { C::execution_is_dying_context, 0 },
626 { C::execution_sel_exit_call, 1 },
627 { C::execution_sel_error, 1 },
628 { C::execution_sel_failure, 1 },
629 { C::execution_has_parent_ctx, 1 },
630 { C::execution_enqueued_call_end, 0 },
631 { C::execution_resolves_dying_context, 0 },
632 { C::execution_nested_call_from_undiscarded_context, 0 },
633 { C::execution_propagate_discard, 0 } },
635 { { C::execution_sel, 1 },
636 { C::execution_context_id, 2 },
637 { C::execution_discard, 1 },
638 { C::execution_dying_context_id, 2 },
639 { C::execution_dying_context_id_inv,
FF(2).invert() },
640 { C::execution_dying_context_diff_inv, 0 },
641 { C::execution_is_dying_context, 1 },
642 { C::execution_enqueued_call_end, 0 },
643 { C::execution_resolves_dying_context, 0 },
644 { C::execution_nested_call_from_undiscarded_context, 0 },
645 { C::execution_propagate_discard, 1 } },
647 { { C::execution_sel, 1 },
648 { C::execution_context_id, 2 },
649 { C::execution_discard, 1 },
650 { C::execution_dying_context_id, 2 },
651 { C::execution_dying_context_id_inv,
FF(2).invert() },
652 { C::execution_dying_context_diff_inv, 0 },
653 { C::execution_is_dying_context, 1 },
654 { C::execution_sel_exit_call, 1 },
655 { C::execution_sel_error, 1 },
656 { C::execution_sel_failure, 1 },
657 { C::execution_has_parent_ctx, 1 },
658 { C::execution_enqueued_call_end, 0 },
659 { C::execution_resolves_dying_context, 1 },
660 { C::execution_nested_call_from_undiscarded_context, 0 },
661 { C::execution_propagate_discard, 0 } },
662 { { C::execution_sel, 1 }, { C::execution_last, 1 } },
663 { { C::execution_sel, 0 } },
670TEST(ExecutionDiscardConstrainingTest, ExploitChangesDyingContextAfterResolution)
676 TestTraceContainer
trace({
677 { { C::precomputed_first_row, 1 } },
679 { { C::execution_sel, 1 },
680 { C::execution_context_id, 1 },
681 { C::execution_discard, 0 },
682 { C::execution_dying_context_id, 0 },
683 { C::execution_dying_context_diff_inv,
FF(1 - 0).invert() },
684 { C::execution_sel_enter_call, 1 },
685 { C::execution_enqueued_call_end, 0 },
686 { C::execution_resolves_dying_context, 0 },
687 { C::execution_nested_call_from_undiscarded_context, 1 },
688 { C::execution_propagate_discard, 0 } },
690 { { C::execution_sel, 1 },
691 { C::execution_context_id, 2 },
692 { C::execution_discard, 0 },
693 { C::execution_dying_context_id, 0 },
694 { C::execution_dying_context_diff_inv,
FF(2 - 0).invert() },
695 { C::execution_enqueued_call_end, 0 },
696 { C::execution_resolves_dying_context, 0 },
697 { C::execution_nested_call_from_undiscarded_context, 0 },
698 { C::execution_propagate_discard, 1 } },
700 { { C::execution_sel, 1 },
701 { C::execution_context_id, 2 },
702 { C::execution_discard, 0 },
703 { C::execution_dying_context_id, 0 },
704 { C::execution_dying_context_diff_inv,
FF(2 - 0).invert() },
705 { C::execution_sel_enter_call, 1 },
706 { C::execution_enqueued_call_end, 0 },
707 { C::execution_resolves_dying_context, 0 },
708 { C::execution_nested_call_from_undiscarded_context, 1 },
709 { C::execution_propagate_discard, 0 } },
711 { { C::execution_sel, 1 },
712 { C::execution_context_id, 3 },
713 { C::execution_discard, 1 },
714 { C::execution_dying_context_id, 3 },
715 { C::execution_dying_context_id_inv,
FF(3).invert() },
716 { C::execution_dying_context_diff_inv, 0 },
717 { C::execution_is_dying_context, 1 },
718 { C::execution_enqueued_call_end, 0 },
719 { C::execution_resolves_dying_context, 0 },
720 { C::execution_nested_call_from_undiscarded_context, 0 },
721 { C::execution_propagate_discard, 1 } },
723 { { C::execution_sel, 1 },
724 { C::execution_context_id, 3 },
725 { C::execution_discard, 1 },
726 { C::execution_dying_context_id, 3 },
727 { C::execution_dying_context_id_inv,
FF(3).invert() },
728 { C::execution_dying_context_diff_inv, 0 },
729 { C::execution_is_dying_context, 1 },
730 { C::execution_sel_exit_call, 1 },
731 { C::execution_sel_error, 1 },
732 { C::execution_sel_failure, 1 },
733 { C::execution_has_parent_ctx, 1 },
734 { C::execution_enqueued_call_end, 0 },
735 { C::execution_resolves_dying_context, 1 },
736 { C::execution_nested_call_from_undiscarded_context, 0 },
737 { C::execution_propagate_discard, 0 } },
739 { { C::execution_sel, 1 },
740 { C::execution_context_id, 2 },
741 { C::execution_discard, 1 },
742 { C::execution_dying_context_id, 2 },
743 { C::execution_dying_context_id_inv,
FF(2).invert() },
744 { C::execution_dying_context_diff_inv, 0 },
745 { C::execution_is_dying_context, 1 },
746 { C::execution_enqueued_call_end, 0 },
747 { C::execution_resolves_dying_context, 0 },
748 { C::execution_nested_call_from_undiscarded_context, 0 },
749 { C::execution_propagate_discard, 1 } },
751 { { C::execution_sel, 1 },
752 { C::execution_context_id, 2 },
753 { C::execution_discard, 1 },
754 { C::execution_dying_context_id, 2 },
755 { C::execution_dying_context_id_inv,
FF(2).invert() },
756 { C::execution_dying_context_diff_inv, 0 },
757 { C::execution_is_dying_context, 1 },
758 { C::execution_sel_exit_call, 1 },
759 { C::execution_sel_error, 1 },
760 { C::execution_sel_failure, 1 },
761 { C::execution_has_parent_ctx, 1 },
762 { C::execution_enqueued_call_end, 0 },
763 { C::execution_resolves_dying_context, 1 },
764 { C::execution_nested_call_from_undiscarded_context, 0 },
765 { C::execution_propagate_discard, 0 } },
766 { { C::execution_sel, 1 }, { C::execution_last, 1 } },
767 { { 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()