96 lines
4.2 KiB
JSON
96 lines
4.2 KiB
JSON
{
|
||
"_meta": {
|
||
"name": "铸渊错题本",
|
||
"version": "1.0",
|
||
"copyright": "国作登字-2026-A-00037559",
|
||
"description": "记录反复出错的模式 · 自动预警 · 每次开发前必查",
|
||
"created": "2026-03-31T03:34:00Z",
|
||
"last_updated": "2026-03-31T03:34:00Z"
|
||
},
|
||
"alert_rules": {
|
||
"high_frequency_threshold": 3,
|
||
"high_frequency_message": "⚠️ 此错误已出现{count}次 · 每一步都要多验证",
|
||
"recent_threshold_days": 7,
|
||
"recent_message": "🔴 最近7天内刚犯过此错误 · 务必警惕"
|
||
},
|
||
"total_patterns": 3,
|
||
"patterns": [
|
||
{
|
||
"id": "ERR-001",
|
||
"pattern": "set -e + grep无匹配 = 静默退出",
|
||
"category": "bash-scripting",
|
||
"severity": "high",
|
||
"occurrence_count": 1,
|
||
"first_seen": "2026-03-31",
|
||
"last_seen": "2026-03-31",
|
||
"description": "在bash脚本中使用set -euo pipefail时,如果grep命令没有匹配到任何行,grep返回exit code 1。配合pipefail,整个pipeline的退出码变为1,导致set -e触发脚本静默退出——没有任何错误信息输出。",
|
||
"trigger_conditions": [
|
||
"脚本使用 set -e 或 set -euo pipefail",
|
||
"pipeline中使用grep但目标字符串可能不存在",
|
||
"awk/sed后面跟的grep可能无匹配"
|
||
],
|
||
"prevention": [
|
||
"在grep命令后添加 || true",
|
||
"改用手动错误处理替代set -e",
|
||
"使用grep -c统计匹配数而非直接grep",
|
||
"将grep结果先存变量再判断是否为空"
|
||
],
|
||
"code_example": {
|
||
"wrong": "RESULT=$(echo \"$DATA\" | grep \"pattern\" | awk '{print $3}')",
|
||
"right": "RESULT=$(echo \"$DATA\" | grep \"pattern\" | awk '{print $3}') || true"
|
||
},
|
||
"related_experiences": ["EXP-20260331-001"],
|
||
"risk_level": "⚠️ 高频陷阱 · 每次写bash脚本时检查"
|
||
},
|
||
{
|
||
"id": "ERR-002",
|
||
"pattern": "openssl text格式解析密钥 · 字符串长度不可靠",
|
||
"category": "cryptography",
|
||
"severity": "medium",
|
||
"occurrence_count": 1,
|
||
"first_seen": "2026-03-31",
|
||
"last_seen": "2026-03-31",
|
||
"description": "使用openssl pkey -text -noout输出密钥的十六进制文本,然后用grep+tr解析。不同openssl版本的输出格式可能不同(行数、缩进、冒号间距),导致解析结果长度不一致。",
|
||
"trigger_conditions": [
|
||
"使用openssl pkey -text -noout提取密钥",
|
||
"用grep -A和tail解析十六进制行",
|
||
"依赖固定行数(如tail -4)来截取数据"
|
||
],
|
||
"prevention": [
|
||
"优先使用DER二进制格式: openssl pkey -outform DER | tail -c <字节数>",
|
||
"用base64编码后检查长度是否符合预期",
|
||
"避免依赖text格式的行数和缩进"
|
||
],
|
||
"code_example": {
|
||
"wrong": "openssl pkey -text -noout | grep -A5 priv: | tail -4 | tr -d ' :\\n' | head -c 43",
|
||
"right": "openssl pkey -outform DER | tail -c 32 | base64 | tr '+/' '-_' | tr -d '='"
|
||
},
|
||
"related_experiences": ["EXP-20260331-001"],
|
||
"risk_level": "⚠️ 中频陷阱 · 处理密钥时优先用DER格式"
|
||
},
|
||
{
|
||
"id": "ERR-003",
|
||
"pattern": "命令行工具版本更新导致输出格式变化",
|
||
"category": "compatibility",
|
||
"severity": "medium",
|
||
"occurrence_count": 1,
|
||
"first_seen": "2026-03-31",
|
||
"last_seen": "2026-03-31",
|
||
"description": "CLI工具(如xray、openssl、node等)的新版本可能改变命令的输出格式、子命令名称或退出码行为。依赖特定输出格式的脚本在工具更新后可能静默失败。",
|
||
"trigger_conditions": [
|
||
"脚本依赖CLI工具的stdout输出格式(用grep/awk/sed解析)",
|
||
"CLI工具版本可能自动更新",
|
||
"安装脚本使用latest版本而非固定版本"
|
||
],
|
||
"prevention": [
|
||
"解析输出时使用灵活匹配(如grep -i大小写不敏感)",
|
||
"提供多种解析方式作为回退",
|
||
"捕获stdout和stderr分别处理",
|
||
"增加解析结果的验证(检查长度、格式)"
|
||
],
|
||
"related_experiences": ["EXP-20260331-001"],
|
||
"risk_level": "⚠️ 中频陷阱 · 解析CLI输出时要灵活"
|
||
}
|
||
]
|
||
}
|