关于 verify
供准备提交代码或创建 PR 的贡献者使用的验证技能。它根据修改涉及 C、Rust 或两者,选择相应的构建、测试、格式和安全检查。
主要功能
- 01按修改语言选择检查项
- 02运行 C 构建和单元测试
- 03运行 Rust 格式、Lint 和测试
- 04用修复前代码验证内存安全修复
- 05按需运行行为和协调器测试
适用场景
- 01提交前验证 C 或 Rust 修改
- 02检查声称已修复的内存安全问题
- 03在集群环境验证协调器修改
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ redisearch/ redisearch --skill verify安装后在 Claude Code 中输入/verify确认已加载。
详细介绍
验证技能
提交或创建 PR 前,请执行完整验证。
用法
使用此技能在完成更改前运行全面检查。
说明
确定修改了哪些代码(C、Rust 或两者),并运行相应检查。
如果依赖项、.install/、引导目标、工具链版本或 CI 配置发生更改,
请先按照引导和依赖项更改操作。
如果修改了 C 代码
按以下顺序运行检查:
1. 构建
./build.sh
确保整个项目编译通过,且不会将警告视为错误。
2. C/C++ 单元测试
./build.sh RUN_UNIT_TESTS ENABLE_ASSERT=1
所有单元测试都必须通过。有关运行特定测试的详细信息,请参阅 /run-c-unit-tests。
3. 行为测试
./build.sh RUN_PYTEST ENABLE_ASSERT=1
如果更改涉及命令处理程序、查询执行、索引流水线或 RDB 序列化,则必须运行此项。
4. AddressSanitizer(建议用于内存相关更改)
./build.sh RUN_UNIT_TESTS SAN=address
如果更改声称修复了内存安全漏洞,还请遵循下文的 内存安全修复(任一语言)。
5. 协调器测试(如果修改了 coord/ 代码)
对协调器(src/coord/)、分布式混合模块(src/coord/hybrid/)或
Map-Reduce 层(src/coord/rmr/)的更改,必须在集群环境中进行测试:
./build.sh RUN_PYTEST ENABLE_ASSERT=1 REDIS_STANDALONE=0 SHARDS=3
此操作会启动一个包含 3 个分片的集群,并在其上运行完整测试套件。
如果修改了 Rust 代码
1. 格式检查
make fmt CHECK=1
如果失败,请运行 make fmt 修正格式。
2. Lint 检查
make lint
修复所有 clippy 警告或错误。
3. 构建
./build.sh
确保整个项目编译通过。
4. Rust 测试
cargo nextest run --manifest-path src/redisearch_rs/Cargo.toml
所有 Rust 测试都必须通过。
如果更改声称修复了内存安全漏洞,还请遵循下文的 内存安全修复(任一语言)。
如果同时修改了 C 和 Rust
运行以上两个部分中的所有检查。
内存安全修复(任一语言)
如果更改声称修复了内存安全漏洞(越界访问、释放后使用), 请在修复前的代码上执行一次 sanitizer 复现,以证明该漏洞存在—— 仅预测报告不算验证。修复前的代码应产生 sanitizer 报告, 修复后的代码则应干净运行。
对于 C,可使用一种无需构建 ASan 构建目录的简便方式:在修复前的 版本中提取受影响的文件,并针对它编译独立的复现程序,例如:
git show HEAD:src/<file>.c > /tmp/before_fix.c # fix not yet committed (the usual case)
git show <fix-commit>^:src/<file>.c > /tmp/before_fix.c # fix already committed
clang -fsanitize=address -g -O0 <repro.c> /tmp/before_fix.c -o repro && ./repro
大多数 src/ 文件无法直接独立编译:预计需要添加 -I 路径,并在
复现程序自己的目录中用最小定义替代较重的头文件(rm_malloc、RS_ABORT、
模块头文件)。这类替代通常只需几分钟,而非几小时。
复现程序必须基于一致的修复前版本构建。如果修复还涉及受提取文件依赖的
头文件、宏或内联辅助函数,也要在同一修复前版本中提取这些内容——用修复后
的头文件编译修复前的 .c 文件,会测试一个混合程序,可能掩盖漏洞,或因无关
原因失败。当依赖文件增至几个以上时,使用检出修复前版本的 worktree 会更简单。
对于 Rust,请在修复前的代码上使用 Miri 运行失败用例
(cargo +nightly miri test --manifest-path src/redisearch_rs/Cargo.toml -p <crate>);
对于 Miri 无法触及的漏洞(FFI、外部内存),请对受影响的测试使用 ASan 构建。
此处无法通过提取单个文件来实现——cargo 会构建整个 crate——而当前检出版本已包含
修复,因此在其中运行 Miri 只能证明修复后的代码运行正常。请先检出修复前的代码树:
git worktree add --detach /tmp/prefix_tree HEAD # fix not yet committed (the usual case)
git worktree add --detach /tmp/prefix_tree <fix-commit>^ # fix already committed
如果失败测试是在修复时一并添加的,请将该测试(且仅该测试)复制到该代码树中。
使用指向 worktree 的 --manifest-path 运行 Miri 或 ASan;预期该代码树中会失败,
而修复后的检出版本中会干净运行。然后使用
git worktree remove --force /tmp/prefix_tree 清理。
行为测试(适用于任一语言的重大更改)
./build.sh RUN_PYTEST ENABLE_ASSERT=1
在运行中的服务上展示行为
测试套件只能证明其断言的内容。要展示面向用户的变更在真实的 redis-server 上正常工作,或手动复现报告,请遵循 /drive-redisearch。
快速验证
对于仅涉及 Rust 的小改动(子 shell 让命令链更清晰——只切换一次工作目录,运行三条命令):
(cd src/redisearch_rs && cargo fmt --check && cargo clippy --all-targets && cargo nextest run)
对于仅涉及 C 的小改动:
./build.sh && ./build.sh RUN_UNIT_TESTS ENABLE_ASSERT=1