症状
AstEvaluatorCalculator は数値結果を legacy token-AST 評価器と照合し、不一致時に legacy を信頼する。しかし legacy は複数のバグを抱えており、正しい P4-typed 結果を誤った legacy 値で上書きしてしまう。
再現(AST_EVALUATOR backend, KnownP4BugsTest に @ignore で収録):
| 式 |
P4-typed(正) |
legacy(誤) |
返却値 |
min(3,5,1,9) |
1 |
3 |
3 |
max(3,5,1,9) |
9 |
5 |
5 |
if(1>0 | 0>1 & 1>2){1}else{0} |
1 |
0 |
0 |
abs(-3)+pow(2,3) |
11 |
3 |
3 |
ログ: P4-typed path did not handle formula ... reason=cross-check mismatch: p4=1.0 vs token=3.0
根本原因
- legacy 側の欠陥: variadic
min/max が3引数以上を無視、boolean がフラット左結合(優先順位無し)、関数項を含む算術で項が脱落。
- cross-check が「legacy = 正」前提で、不一致時に正しい P4 結果を破棄する。
修正案
手書き legacy を廃する方針なら cross-check を撤去、または不一致時に P4 を信頼する(legacy のバグに引きずられない)。ただし P4 マッパー側のバグ(別issue)も残るため、それらの修正と同時に行うのが安全。全数値式の挙動を変えるため、変更後は全スイートで回帰確認。
参照
docs/findings-2026-06-15-unlaxer-3.0.4-and-p4.md §6 (P4-BUG-3/4/5), KnownP4BugsTest
症状
AstEvaluatorCalculatorは数値結果を legacy token-AST 評価器と照合し、不一致時に legacy を信頼する。しかし legacy は複数のバグを抱えており、正しい P4-typed 結果を誤った legacy 値で上書きしてしまう。再現(AST_EVALUATOR backend,
KnownP4BugsTestに @ignore で収録):min(3,5,1,9)max(3,5,1,9)if(1>0 | 0>1 & 1>2){1}else{0}abs(-3)+pow(2,3)ログ:
P4-typed path did not handle formula ... reason=cross-check mismatch: p4=1.0 vs token=3.0根本原因
min/maxが3引数以上を無視、boolean がフラット左結合(優先順位無し)、関数項を含む算術で項が脱落。修正案
手書き legacy を廃する方針なら cross-check を撤去、または不一致時に P4 を信頼する(legacy のバグに引きずられない)。ただし P4 マッパー側のバグ(別issue)も残るため、それらの修正と同時に行うのが安全。全数値式の挙動を変えるため、変更後は全スイートで回帰確認。
参照
docs/findings-2026-06-15-unlaxer-3.0.4-and-p4.md§6 (P4-BUG-3/4/5),KnownP4BugsTest