fix(m53): r1 评审 P2 — 小数后缀时长、文档数字、信号失败告警
P2-1 时长解析:后缀乘数只作用在整数部分,nsec 没跟着乘。 0.05m 被算成 50ms(应 3s)、1.5m 算成 60.5s(应 90s)、0.5h 算成 0.5s。 修法:sec 与 nsec 都乘 mult(各自带溢出检查,mult==1 行为不变)。 --help 与头注释的示例改为逐个标出等价值(2.5s=2.5s、1.5m=90s、0.5h=1800s), 不再留文档写着、实际算错的例子。 新增 T11:宿主上编译 parser 单测(27 例,含 0.01m/0.05m/1.5m/0.5h)真跑, 并单独点名评审抓到的三条,防止回归。 P2-2 文档数字:§2 产物表 47 708 → 49 676,合计 2 189 472 → 2 191 440; 全表按 MANIFEST 重核(其余七项未漂移),§11.1 补上新的体积/md5/sha256。 P2-3 信号失败不静默:新增 kill_child()(kill(-pgid) 失败时 ESRCH 视为组已消失, 退化为 kill(pid),EPERM 等明确告警)、verify_process_group()(发信号前用 getpgid 核对建组是否生效)、父进程 setpgid 的异常 errno 告警;连兜底 kill 都失败时退出码 125 而不是谎报 124。新增 -DTIMEOUT_TEST_SETPGID_FAIL 故障注入 与 T12(a-d)验证告警路径可达且兜底真的杀掉子进程。 真机复验(md5 aded39e0,49 676 B):124/137/0/孙进程清零/保证挂住的命令 3.01s 被 124 结束/0.01m=0.61s、0.05m=3.01s、2.5s=2.51s/无参 125;收工 bt=0 sleep=0, Music 199164544。回归 44 通过 0 失败。
This commit is contained in:
1 parent
24f1d8a682
commit
c93814a78b
4 files changed
+314
-27
No files matched your search
@@ -12,6 +12,8 @@
|
||||
# M53 —— 本地源码路径:timeout 产物存在/静态/MIPS32r2/零 NEEDED、
|
||||
# MANIFEST 有 Apache-2.0 行、license 原文随附、
|
||||
# 源码纪律(独立实现、不调 clock_gettime、不用 timerfd、setpgid+kill(-pgid))
|
||||
# M53 r2 —— 时长解析真跑回归(宿主编译 parser,覆盖 0.01m/0.05m/1.5m/0.5h)
|
||||
# 与信号失败告警路径(注入 setpgid 失败,必须告警且兜底 kill(pid))
|
||||
#
|
||||
# 前置:MEOW_DEVKIT_WORK 里已有一次构建(脚本会先跑一次增量构建,命中则秒回;
|
||||
# 缓存缺失时会联网下载/编译,第一次运行约 1 分钟)。
|
||||
@@ -166,6 +168,52 @@ grep -q 'setpgid' "$SRC_T" && grep -q 'kill(-' "$SRC_T" \
|
||||
&& pass "T10d 进程组模型到位(setpgid + kill(-pgid))" \
|
||||
|| fail "T10d 缺进程组模型(孙进程会漏杀)"
|
||||
|
||||
echo "== 11) 时长解析回归(宿主编译,真跑 parser,不做 sleep)"
|
||||
if command -v cc >/dev/null 2>&1; then HOST_CC="cc"
|
||||
elif command -v gcc >/dev/null 2>&1; then HOST_CC="gcc"
|
||||
elif command -v clang >/dev/null 2>&1; then HOST_CC="clang"
|
||||
elif command -v zig >/dev/null 2>&1; then HOST_CC="zig cc"
|
||||
else HOST_CC=""; fi
|
||||
|
||||
if [ -z "$HOST_CC" ]; then
|
||||
echo " SKIP: 没有宿主 C 编译器(cc/gcc/clang/zig),时长解析回归未运行"
|
||||
elif $HOST_CC -O2 -Wno-unused-function -DTIMEOUT_UNIT_TEST -o "$TMP/dur-test" "$SRC_T" >"$TMP/hostcc.log" 2>&1; then
|
||||
if "$TMP/dur-test" > "$TMP/dur.log" 2>&1; then
|
||||
pass "T11a 时长解析 $(grep -c '^ok' "$TMP/dur.log") 例全过(含 0.01m/0.05m/1.5m/0.5h)"
|
||||
else
|
||||
fail "T11a 时长解析有用例失败"
|
||||
grep '^FAIL' "$TMP/dur.log" | sed 's/^/ | /'
|
||||
fi
|
||||
# 单独点名 r1 评审抓到的三条(防止将来又被改回"只乘整数部分")
|
||||
for c in "0.05m" "1.5m" "0.5h"; do
|
||||
grep -q "DURATION '$c" "$TMP/dur.log" && ! grep -q "^FAIL.*'$c" "$TMP/dur.log" \
|
||||
&& pass "T11b '$c' 用例存在且通过" || fail "T11b '$c' 用例缺失或失败"
|
||||
done
|
||||
else
|
||||
fail "T11 宿主编译失败($HOST_CC)"; sed 's/^/ | /' "$TMP/hostcc.log" | tail -5
|
||||
fi
|
||||
|
||||
echo "== 12) 信号失败告警路径(注入 setpgid 失败,验证不静默)"
|
||||
if [ -n "$HOST_CC" ] && \
|
||||
$HOST_CC -O2 -DTIMEOUT_TEST_SETPGID_FAIL -o "$TMP/timeout-pgfail" "$SRC_T" >"$TMP/hostcc2.log" 2>&1; then
|
||||
"$TMP/timeout-pgfail" 1 sleep 30 > "$TMP/pgfail.out" 2>&1
|
||||
PGRC=$?
|
||||
[ "$PGRC" = 124 ] && pass "T12a 建组失败时仍杀掉直接子进程(rc=124)" \
|
||||
|| fail "T12a rc=$PGRC(期望 124)"
|
||||
grep -q '未建立独立进程组' "$TMP/pgfail.out" \
|
||||
&& pass "T12b 建组失败有明确告警(不静默)" || fail "T12b 缺'未建立独立进程组'告警"
|
||||
grep -q '退化为只给直接子进程' "$TMP/pgfail.out" \
|
||||
&& pass "T12c 组信号失败后走 kill(pid) 兜底" || fail "T12c 缺兜底路径告警"
|
||||
# 直接子进程必须真死:注入场景下它没有进程组保护,只能靠 kill(pid) 兜底
|
||||
sleep 1
|
||||
ps -A -o args= 2>/dev/null | grep -q '^sleep 30$' \
|
||||
&& { fail "T12d 注入场景下 sleep 30 仍存活(兜底没生效)"
|
||||
command -v pkill >/dev/null 2>&1 && pkill -f '^sleep 30$' 2>/dev/null; } \
|
||||
|| pass "T12d 注入场景下没有残留 sleep 30"
|
||||
else
|
||||
echo " SKIP: 没有宿主 C 编译器,T12 未运行"
|
||||
fi
|
||||
|
||||
echo
|
||||
printf '== 结果: %d 通过, %d 失败\n' "$PASS" "$FAILN"
|
||||
[ "$FAILN" = 0 ]
|
||||
Reference in new issue
Block a user