已关闭
[L2] gen_output_json.py:continue 之后的 _failed.json 清理与 raise FileNotFoundError 永不执行(缺 json 只打日志不失败) #6334
eieiei创建于 27 天前关闭于 15 天前
yuning_chen
21 天前 评论:
21 天前 评论:
20 天前 将 cong-jiyu 设为负责人
丛吉钰
20 天前 评论:
20 天前 评论:
此处为历史遗留问题,为了保证算子编译缺失不会导致编包失败,所以在此处提前跳过了报错逻辑。我会将报错的逻辑注释并补充说明。感谢您的反馈!


15 天前 关闭了 issue
14 天前 添加了label:resolved
级别判断
L2(构建期脚本对"算子没产出 json"这种情况的处理被写成永不执行,实际效果是只打印错误继续构建)
位置
scripts/kernel/binary_script/gen_output_json.py:86-102(这段脚本在两仓内容一致):opc_json_outputs = list(filter(lambda fname: os.path.isfile(fname), expect_outputs)) if len(opc_json_outputs) == 0: print(f"[ERROR]the kernel {{opc_json_file_name}} not generate output json") ... print(message) continue # ← 从这里就跳走了 failed_json_file_name = opc_json_file_name + "_failed" # 以下 5 行永不执行 failed_json_file = kernel_output + failed_json_file_name + ".json" if os.path.exists(failed_json_file): os.remove(failed_json_file) raise FileNotFoundError()现象(静态即可判定)
continue之后的语句不可达,所以:*_failed.json的清理逻辑从未运行(我 grep 过全仓,_failed.json这个名字只出现在这 5 行里,没有别的生产者/消费者 —— 也就是说这本来就是半成品的失败标记逻辑);raise FileNotFoundError()从未生效 → 算子缺 json 时脚本只打印一段[ERROR]就继续处理下一个,最终以成功退出码结束(我确认脚本没有set -e之类,Python 侧也不会有非零退出)。也就是说:这段代码的作者显然想在"没有 output json"时把构建判失败(还准备了失败标记文件),实际行为却变成"打日志后继续"。这类差异在 CI 上表现为"日志里有 ERROR 但流水线是绿的",很容易漏。
判据:AST 上
continue是块内终止语句,其后同一 suite 的语句永不执行(我用脚本全仓扫,这类命中在两仓各 4 处,就是这里的这 5 行)。建议(要维护者定,因为会改变 CI 行为)
continue移到raise之前不成立(raise 后不会继续),所以应该是删掉continue,让 5 行落盘 +raise FileNotFoundError()按原意执行:print(message) - continue failed_json_file_name = opc_json_file_name + "_failed" failed_json_file = kernel_output + failed_json_file_name + ".json" if os.path.exists(failed_json_file): os.remove(failed_json_file) raise FileNotFoundError()[ERROR]措辞改成[WARN],避免让人以为构建失败了;continue,但把raise换成"写一个*_failed.json标记",让上层自己去判定。我倾向 1(
raise、失败标记文件都是专门为这个分支写的代码),但这会把目前静默通过的构建变成失败,所以没直接提 PR。选一个口径我马上提。判据与自查边界
raise/sys.exit在整个脚本里只出现在第 102 行(也就是不可达那段里),所以"缺 output json"这条路径不会让脚本以非零码结束;