/click-path-audit — 行动流审计¶
发现静态代码阅读容易遗漏的缺陷:状态交互的副作用、有序调用之间的竞态条件,以及相互静默取消的处理器。
本方案解决的问题¶
传统调试检查: - 函数是否存在?(缺少接线) - 是否会崩溃?(运行时错误) - 是否返回正确的类型?(数据流)
然而,它不会检查: - 最终 UI 状态是否与按钮标签所承诺的一致? - 函数 B 是否静默地撤销了函数 A 刚刚完成的操作? - 共享状态(Zustand/Redux/context)中是否存在会取消预期操作的副作用?
实际示例:“新邮件”按钮先调用 setComposeMode(true),然后调用 selectThread(null)。两者单独看都能正常工作。但 selectThread 有一个副作用,会重置为 composeMode: false。按钮最终没有产生任何效果。通过系统性调试发现了 54 个缺陷 —— 这个缺陷被遗漏了。
工作原理¶
针对目标区域中的所有交互式触点:
1. ハンドラーを特定(onClick、onSubmit、onChangeなど)
2. ハンドラーのすべての関数呼び出しを**順序で**追跡
3. 各関数呼び出し**について**:
a. どの状態を読んでいますか?
b. どの状態を書き込んでいますか?
c. 共有状態に副作用がありますか?
d. 副作用として状態をリセット/クリアしますか?
4. チェック:後の呼び出しが以前の呼び出しからの状態変更を取り消しますか?
5. チェック:最終状態はユーザーがボタンラベルから期待するもの?
6. チェック:競合状態がありますか(非同期呼び出しが間違った順序で解決される)?
执行步骤¶
步骤 1:映射状态存储¶
在审计任何触点之前,构建所有状态存储操作的副作用映射:
範囲内の各Zustand ストア / React コンテキストについて:
各アクション/セッター:
- どのフィールドをセットしますか?
- 副作用として他のフィールドをリセットしますか?
- ドキュメント:actionName → {sets: [...], resets: [...]}
这是一个重要参考。如果不了解 selectThread 会重置 composeMode,“新邮件”缺陷就会难以发现。
输出格式:
STORE: emailStore
setComposeMode(bool) → sets: {composeMode}
selectThread(thread|null) → sets: {selectedThread, selectedThreadId, messages, drafts, selectedDraft, summary} RESETS: {composeMode: false, composeData: null, redraftOpen: false}
setDraftGenerating(bool) → sets: {draftGenerating}
...
DANGEROUS RESETS(所有していない状態をクリアするアクション):
selectThread → composeMode をリセット(setComposeModeで所有)
reset → すべてをリセット
步骤 2:审计每个触点¶
针对目标区域中的每个按钮/切换控件/表单提交:
有关详细信息,请参阅文档。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 ev/ECC