Skip to content

fix(syscall-stat): improve builtin flow - #115

Open
yuKing123-king wants to merge 1 commit into
DKapture:mainfrom
yuKing123-king:test/add-syscall-stat-BUILTIN
Open

yuKing123-king wants to merge 1 commit into
DKapture:mainfrom
yuKing123-king:test/add-syscall-stat-BUILTIN

Conversation

@yuKing123-king

@yuKing123-king yuKing123-king commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

对本次 syscall-stat 工具修改的内容

  1. 补齐 BUILTIN 测试入口
    • 改为通过返回值处理参数解析结果,增强健壮性。

@rwenz2004

Copy link
Copy Markdown

注意提交信息,应该是fix不是test

@yuKing123-king
yuKing123-king force-pushed the test/add-syscall-stat-BUILTIN branch from 220b53c to c1c5e24 Compare July 28, 2026 01:37
@yuKing123-king

Copy link
Copy Markdown
Contributor Author

注意提交信息,应该是fix不是test

ok,后面统一会改成fix

@yuKing123-king
yuKing123-king force-pushed the test/add-syscall-stat-BUILTIN branch from c1c5e24 to 1cf902e Compare July 31, 2026 03:20
@yuKing123-king yuKing123-king changed the title test: add support syscall-stat builtin testing and improve runtime fe… fix(syscall-stat): improve builtin flow and fix stats iteration/top parsing Jul 31, 2026
Comment thread observe/syscall-stat.cpp
static std::atomic<bool> exit_flag(false); // Flag to signal exit
static std::atomic<bool> exit_flag(false);

#ifdef BUILTIN

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个宏的引入是不必要的,局部函数直接用static就行,没必要考虑这种兼容性

Comment thread observe/syscall-stat.cpp

// Parse command line arguments
void parse_args(int argc, char **argv)
static int parse_args(int argc, char **argv)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

其他局部函数也应该像这样修改,不要使用BUILTIN_LOCAL宏

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

所有局部函数已改成static

Comment thread observe/syscall-stat.cpp Outdated
int *log_fd,
int *stats_fd
){
test_name = "syscall-stat"; // 告诉 mock/test 框架当前正在运行哪个工具

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

中文注释只需要保留关键部分

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已压缩成简洁的英文

@yuKing123-king
yuKing123-king force-pushed the test/add-syscall-stat-BUILTIN branch from 1cf902e to 13a61c2 Compare July 31, 2026 03:37
Comment thread observe/syscall-stat.cpp Outdated
// stats

while (0 == bpf_map_get_next_key(stats_fd, &key, &nxt_key))
int ret = bpf_map_get_next_key(stats_fd, NULL, &nxt_key);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这儿为啥改动,没有必要的话,无关改动,不要引入进来

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这的改动是有必要的,因为原来的代码是

while (0 == bpf_map_get_next_key(stats_fd, &key, &nxt_key))
		{
			info sys_stat;
			bpf_map_lookup_elem(stats_fd, &nxt_key, &sys_stat);
			if (nxt_key >= sizeof(sys_tbl) / sizeof(sys_tbl[0]))
			{
				key = nxt_key;
				continue;
			}
			if (sys_stat.cnt == 0)
			{
				key = nxt_key;
				continue;
			}
			stats.push_back({nxt_key, sys_stat});
			total += sys_stat.cnt;
			memset(&sys_stat, 0, sizeof(sys_stat));
			bpf_map_update_elem(stats_fd, &nxt_key, &sys_stat, BPF_ANY);
			key = nxt_key;
		}

while (0 == bpf_map_get_next_key(stats_fd, &key, &nxt_key))这里循环条件一开始就调用next_key,但是key一开始是0,next_key就是1,并且后面用来查询stats_fd这个map一直都用的next_key,也就是说后面的代码永远都不会去获取key=0的stats_fd,所以最后的结果永远都不会有系统调用号为0的read,这个问题是我用syscall-stat去追踪ls的系统调用的时候发现没有read这个系统调用,ls是查询功能,所以理论上来说肯定会调用read这个系统调用的。后来我调整遍历逻辑,确保从代码可以从第一个 key 开始完整遍历。再去使用syscall-stat去追踪ls的系统调用时,结果中就有read这个系统调用了

Comment thread observe/syscall-stat.cpp Outdated
{
pr_error("Error polling ring buffer: %d\n", err);
sleep(5); // Sleep before retrying
std::this_thread::sleep_for(std::chrono::microseconds(5)); // Sleep before retrying

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

解释下,为什么改这

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

因为我觉得这里的sleep(5); 是ring_buffer__poll() 出错后,等待5秒之后再重新试一下,避免错误路径一直占用cpu,但是5s我觉得太久了,会影响使用性能所以改成了5微秒,如果感觉太短也可以改回5s

Comment thread observe/syscall-stat.cpp Outdated
{"pid2pathhash",{sizeof(pid_t), sizeof(u32), 1024, BPF_MAP_TYPE_LRU_HASH}},
{"logs", {0, 0, 1024 * 1024, BPF_MAP_TYPE_RINGBUF}},
};
static std::atomic<int> *condition;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这几个静态变量,都没有使用

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

condition这个使用了,这个是.cpp代码和test代码用来同步状态的
{"pid2pathhash",{sizeof(pid_t), sizeof(u32), 1024, BPF_MAP_TYPE_LRU_HASH}},
{"logs", {0, 0, 1024 * 1024, BPF_MAP_TYPE_RINGBUF}},这两个确实没使用,我现在删除

Comment thread observe/syscall-stat.cpp Outdated
// stats

while (0 == bpf_map_get_next_key(stats_fd, &key, &nxt_key))
int ret = bpf_map_get_next_key(stats_fd, NULL, &nxt_key);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

拆成两个提交,bug修复一个

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

好的

@xu-lang xu-lang left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

请先修复评审问题

@yuKing123-king
yuKing123-king force-pushed the test/add-syscall-stat-BUILTIN branch from 13a61c2 to fd937c9 Compare August 4, 2026 08:10
@yuKing123-king yuKing123-king changed the title fix(syscall-stat): improve builtin flow and fix stats iteration/top parsing fix(syscall-stat): improve builtin flow Aug 4, 2026
@yuKing123-king
yuKing123-king force-pushed the test/add-syscall-stat-BUILTIN branch from fd937c9 to e0ac09a Compare August 4, 2026 08:21
@yuKing123-king

Copy link
Copy Markdown
Contributor Author

请先修复评审问题

1.多余静态变量已删除
2.已经将修复bug部分,单独提出一个pr

@xu-lang xu-lang left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

问题还是很多,以上只是部分,更严重的是修改思路框架设计过于随意,过于依赖全局变量

Comment thread observe/syscall-stat.cpp
free(buf);
exit(0);
break;
return 1; // Indicate that help was displayed

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里为什么返回1,破坏了原来的逻辑

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. 原来这里是exit(0),exit和return的区别是,exit会立即终止当前线程,后续代码全部不执行,而return是终止当前函数,后面代码正常执行。
  2. 如何这里还是exit的话,线程终止后面代码不执行,没有相关状态变量传到syscall-stat-test.cpp中,syscall-stat-test.cpp会正常执行,但是无法区分测试失败是因为"用户请求了帮助"还是"程序崩溃",所以每个地方都需要一个返回值参数返回给syscall-stat-test.cpp区分是什么原因引起的测试失败。
  3. 如果这里一定需要exit(0)这样的语义,这里可以通过定义BUILTIN这个宏来继续使用exit(0)。

Comment thread observe/syscall-stat.cpp Outdated
stats_fd = bpf_get_map_fd(obj->obj, "syscall_stat", goto err_out);

#ifdef BUILTIN
*filter_fdp = filter_fd;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

为什么把fd传出去,外面保证fd的生命周期了吗?是否导致fd泄漏

Comment thread observe/syscall-stat.cpp Outdated
*condition = 1;
while(!exit_flag)
{
std::this_thread::sleep_for(std::chrono::microseconds(5));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

???空转?

Comment thread observe/syscall-stat.cpp Outdated
}

#ifdef BUILTIN
*conditionPrint = 1;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

不要这样传参出去,一堆这种出参,极其ugly

std::atomic<int> *conditionp,
std::atomic<int> *conditionPrintP,
std::atomic<bool> **exit_flagp,
int *filter_fd,
int *stats_fd

@yuKing123-king
yuKing123-king force-pushed the test/add-syscall-stat-BUILTIN branch from e0ac09a to 20d00b5 Compare August 6, 2026 06:41
Comment thread observe/syscall-stat.cpp
local_map_info = {
{"filter", {sizeof(u32), sizeof(struct Rule), 1, BPF_MAP_TYPE_HASH}},
{"syscall_stat",{sizeof(u32), sizeof(struct info), 453, BPF_MAP_TYPE_ARRAY}},
{"logs", {0, 0, 1024 * 1024, BPF_MAP_TYPE_RINGBUF}},

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里的filter和syscall_stat和logs,虽然在当前代码中没有使用,这个local_map_info是传给mock.cpp去生成3个伪map供syscall-stat-test.cpp中使用

Comment thread observe/syscall-stat.cpp Outdated
char *end = nullptr;
errno = 0;
long val = strtol(optarg, &end, 10);
if (end == optarg || *end != '\0' || errno == ERANGE || val < 0 || (unsigned long)val > UINT32_MAX)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里的修改是为了检验用户输入负数,字母等非法参数,例如-1,12abc,abc这样的参数,可以提示用户参数输错

Comment thread observe/syscall-stat.cpp
free(buf);
exit(0);
break;
return 1; // Indicate that help was displayed

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. 原来这里是exit(0),exit和return的区别是,exit会立即终止当前线程,后续代码全部不执行,而return是终止当前函数,后面代码正常执行。
  2. 如何这里还是exit的话,线程终止后面代码不执行,没有相关状态变量传到syscall-stat-test.cpp中,syscall-stat-test.cpp会正常执行,但是无法区分测试失败是因为"用户请求了帮助"还是"程序崩溃",所以每个地方都需要一个返回值参数返回给syscall-stat-test.cpp区分是什么原因引起的测试失败。
  3. 如果这里一定需要exit(0)这样的语义,这里可以通过定义BUILTIN这个宏来继续使用exit(0)。

Comment thread observe/syscall-stat.cpp
Usage(argv[0]);
free(buf);
exit(-1);
return -1;

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里与上述问题一致

Comment thread observe/syscall-stat.cpp
int slen = strlen(sys_tbl[i]);
if (!sys_tbl[i])
continue;
int slen = strlen(sys_tbl[i]);

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里的修改是防止sys_tbl[i]是NULL,导致strlen(NULL)

Comment thread observe/syscall-stat.cpp
if (total)
{
printf("\ntotal: %d\n", total);
printf("\ntotal: %u\n", total);

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里的修改是因为上面定义的total是u32 total = 0;,是u32类型不是int类型

Comment thread observe/syscall-stat.cpp
if (0 != syscall_stat_bpf::attach(obj))
{
exit(-1); // Attach BPF program
goto err_out; // Attach BPF program

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里不使用exit(-1)是因为如果上面的syscall_stat_bpf::open_and_load();成功了,但是syscall_stat_bpf::attach(obj)失败了,但是使用exit(-1)的话,会终止整个程序,导致后面的obj释放无法执行,造成泄露

Comment thread observe/syscall-stat.cpp
stats_fd = bpf_get_map_fd(obj->obj, "syscall_stat", goto err_out);

#ifdef BUILTIN
runtime_state->fds_promise.set_value(SyscallStatFds{filter_fd, stats_fd});

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. 这里向外传filter_fd和stat_fd的原因是,syscall-stat-test.cpp需要这两个fd去查询mock.cpp生成的rule和stat 这两个map的数据,以便向 map 中注入测试事件(bpf_map_update_elem(stats_fd, ...))并验证过滤规则(bpf_for_each_map_elem(filter_fd, ...))。
  2. 这里只是传了两个整数值(fd 的拷贝),filter_fd和stat_fd的生命周期依旧还是本程序中控制,在 err_out 标签处通过 syscall_stat_bpf::destroy(obj) 统一释放,测试线程仅持有 fd 的整数副本用于读写操作,不负责关闭,因此不会造成 fd 泄漏或双重释放。

@xu-lang

xu-lang commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

/oc

1 similar comment
@rwenz2004

Copy link
Copy Markdown

/oc

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown

User rwenz2004 does not have write permissions

github run

@rwenz2004

Copy link
Copy Markdown

/review 检视一下

@rwenz2004

Copy link
Copy Markdown

/review

@github-actions

Copy link
Copy Markdown

Preparing review...

1 similar comment
@github-actions

Copy link
Copy Markdown

Preparing review...

@rwenz2004

Copy link
Copy Markdown

/review

@github-actions

Copy link
Copy Markdown

Preparing review...

@rwenz2004

Copy link
Copy Markdown

/review

@github-actions

Copy link
Copy Markdown

Persistent review updated to latest commit 967e9da

@yuKing123-king
yuKing123-king force-pushed the test/add-syscall-stat-BUILTIN branch from 967e9da to 026ce7f Compare August 11, 2026 07:45
@yuKing123-king

Copy link
Copy Markdown
Contributor Author

/review 检查一下当前代码存在哪些安全风险的问题,代码不规范的地方

@github-actions

Copy link
Copy Markdown

Persistent review updated to latest commit 026ce7f

@yuKing123-king
yuKing123-king force-pushed the test/add-syscall-stat-BUILTIN branch from 026ce7f to cb5591a Compare August 11, 2026 08:40
@yuKing123-king

Copy link
Copy Markdown
Contributor Author

/review 检查一下当前代码存在哪些安全风险的问题,代码不规范的地方

@github-actions

Copy link
Copy Markdown

Preparing review...

@yuKing123-king

Copy link
Copy Markdown
Contributor Author

/review 检查一下当前代码存在哪些安全风险的问题,代码不规范的地方

@github-actions

Copy link
Copy Markdown

Preparing review...

@yuKing123-king
yuKing123-king force-pushed the test/add-syscall-stat-BUILTIN branch from cb5591a to c87fcf2 Compare August 13, 2026 08:22
Signed-off-by: Wang Yu <wangyu6@uniontech.com>
@dkapture-ci-bot

Copy link
Copy Markdown
Contributor

你好,这是对 libdkapture#115 fix(syscall-stat): improve builtin flow 的评审。

本轮为 DKapture 两仓(libdkapture / dkapture-bpf)全部以 fix 开头 open PR 的批量评审,共 17 个;汇总表如下,本 PR 加粗。逐项详评见分隔线下方。

PR 标题 作者 规模 结论 主要风险
#149 fix(net-traffic): initialize rules before loadin yuKing123-king +19/-9 可合并 规则安装顺序与其它工具约定不一致;本仓改动无正确性缺陷
#147 fix(net-filter): abort rule loading on invalid c yuKing123-king +9/-3 需修改 失败时 clear_rules() 波及 add_rule() 装入的规则;空白注释行导致整个加载失败
#141 fix(dkapture): honor parsed pid in read(vector<p JoeSergen +23/-2 需修改 unsafe_find 单记录语义使 /proc//fd 只回调一次;返回值语义漂移
#140 fix(dkapture): return bytes read, not remaining JoeSergen +10/-4 可合并 无阻塞风险;与文档契约对齐,仓内无调用方依赖旧语义
#114 fix: replace manual destructor calls in construc JoeSergen +28/-7 需修改 捆绑了与 open PR #112 逐字节相同的 fs_watch 修复,跨 PR 重复
#125 fix(lsof): start ringbuf consumer before iterato yuKing123-king +17/-3 需修改 线程启动后错误路径仍 goto err_out → 释放运行中 rb(UAF)+ 线程泄漏
#112 fix: fs_watch calls trace_file_init instead of m JoeSergen +1/-1 可合并 无;仅修一处复制粘贴错误
#103 fix: make power-snoop internal symbols static fo yuKing123-king +3/-2 可合并 改动无害;但 PR 描述的 multiple definition 在当前构建配置下无法复现
#119 fix(syscall-stat): stop skipping syscall key 0 d yuKing123-king +18/-6 可合并 循环终止四条路径已逐一核实;缩进与提交拆分小问题
#115 fix(syscall-stat): improve builtin flow yuKing123-king +204/-41 需修改 三处 bpf_get_map_fd 错误路径未设 ret,最终 return ret 误报成功
#117 fix(trace-signal): validate invalid command line yuKing123-king +190/-29 需修改 BUILTIN 测试入口未接入 test/Makefile,不可达;register_signal 残留
#102 fix(trace-exec): reject invalid command line arg yuKing123-king +135/-22 需修改 BUILTIN 入口同样未接入构建;-h 退出码 0→1 属未说明的行为变更
#97 fix(so): reuse pinned dkapture bpf objects corre yuKing123-king +1/-1 需修改 test mock 仍按 map- 前缀命名 pin,合并后 gtest FindMap 用例失败
#35 fix(pagefault): add max_entries and value_size f yuKing123-king +7/-3 可合并 修复真实,但已被 main 上等效修复 1e90486 取代,建议确认后关闭
#32 fix(peek-fd): correct args field name from mvlen yuKing123-king +1/-1 可合并 无功能风险;标题/描述与实际改动方向不符
#30 fix(trace-signal): avoid inflight event key coll yuKing123-king +36/-22 需修改 sys_exit_kill 的 !rule 早退路径仍泄漏 inflight 条目
#29 fix(syscall-stat): replace exec fexit with kprob yuKing123-king +93/-13 阻塞 exec 路径从 struct filename* 本身读字符串,-f 过滤将完全失效

本 PR 评审详情

总体结论: 参数校验强化(:203-241)、handle_event 越界加固(:251-265)、exit 改返回值方向正确;作者已按评审把 key-0 修复拆出为 #119、删未用静态变量、去掉 BUILTIN_LOCAL 宏。已通读全部 24 条 issue 评论与 25 条行级评论,以下为增量意见。

主要问题:

  • (P1) observe/syscall-stat.cpp:512-513,525 (新) — 三处 bpf_get_map_fd(obj->obj, ..., goto err_out) 失败经 com.h:67-77 宏直接 goto err_out 未设置 ret,最终 return ret(:572)返回 parse_args 的 0,map fd 获取失败被误报为成功;作者已给 attach(:507)/update(:520)/ring_buffer__new(:529)/pthread_create(:537,545) 补 ret=-1,唯独漏这三个宏路径。
  • (P2) :557-558 (新) — BUILTIN 主线程 cv.wait(exit_requested) 无超时无其他退出条件:SIGINT handler(register_signal :313-323,:493 在 BUILTIN 下同样注册)只置 exit_flag;:501-508(open_and_load/attach 失败)在任何通知(promise :515、init_done :552-555)之前 goto err_out,等待 fds_promise 或 init_done 的测试线程永久挂起;建议仿 elfverify_init 加超时并在所有 err_out 路径前置 exit_requested/notify。
  • (P2) :345-352 (新) — syscall_stat_deinit 只 reset runtime_state、恢复 stdout/Log,不置 exit_flag 不等线程:builtin 主线程未退出时被调用则 timer_task(:456-460)解引用已 reset 的 runtime_state 为空指针解引用,stdout 恢复与 ringbuf 线程 fwrite 竞争。
  • (P2) :240 (新) — interval 校验只挡 val<=0 无上限:val=2^31 时 (int)val 回绕 INT_MIN,sleep((unsigned)) 变约 68 年;应加 INT_MAX 上界(pid 路径 :214 已有 UINT32_MAX 上界)。

次要建议:

  • :217 (新) rule.pid=(u32)val 赋 pid_t,val>INT_MAX 为实现定义负值,建议上界改 INT_MAX;
  • :335 (新) stdout=output 直接赋值仅 glibc 可行且非线程安全,deinit 将 Log 恢复到 stderr(:351)而非原 sink 不对称;风格 :494 if(ret<0){、:103/:287/:534/:540 行尾空格、:322-335 混用空格+tab、#ifdef 顶格,建议跑 script/format-all.sh;sys_tbl 空指针防护(:386-388、:441)实为死代码(syscall-tbl.h 0..453 连续无空洞,实测)。

亮点: handle_event 三重校验(:251-265)消除基线越界读;pthread_create 失败处理与 t1 清理(:534-546)、attach 失败不再 exit(:505-508)修复基线资源泄漏。

commit message: 问题说明——最终 commit 仍为 "test: improve builtin flow"(9b69265e),rwenz2004 07-27 已指出应为 fix,作者 07-31 答应改但未兑现,且与 PR 标题 fix(syscall-stat) 不一致,仓库近期提交均为 fix(scope): 格式。

已有讨论: 共识——BUILTIN_LOCAL 宏去掉改 static(rwenz2004 07-31,已改);无用静态变量删除(xu-lang 08-04,已删);key-0 修复拆独立 PR(xu-lang 08-04,即 #119)。未决——xu-lang 08-05 对 help 返回 1 的异议作者仅解释未回退;fd 传出泄漏疑虑作者已解释(整数副本、destroy 统一释放);xu-lang 对 cv.wait 的“空转”质疑未获直接回复(cv.wait 实为阻塞非忙等,真正问题是无超时);bot persistent review 指出的错误路径返回值未设置,作者部分修复,残留见上 P1。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants