You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

依赖、特征等无关变更致Rust测试异常失败求助

诡异的SQLite3 Rust绑定测试问题

在大型Rust仓库中发现,向Cargo.toml添加未被引用的依赖后,部分测试开始失败,该问题已在一个仓库稳定复现。核心代码如下:

mod test {
    pub fn b<T>(db: *mut libsqlite3_sys::sqlite3, _: T) {
        let rc = unsafe {
            libsqlite3_sys::sqlite3_create_function(
                db,                   // db
                "x".as_ptr() as _,    // zFunction
                0,                    // nArg
                0,                    // eTextRep
                std::ptr::null_mut(), // pApp
                None,                 // xFunc
                None,                 // xStep
                None,                 // xFinal
            )
        };
        match rc {
            libsqlite3_sys::SQLITE_MISUSE => (),
            x => panic!("Wanted SQLITE_MISUSE, got {:?}", x),
        }
    }
}

#[test]
#[ignore]
fn z() {
    format!("{:?}", &[1, 2, 3, 4]);
    panic!("not run");
}

#[test]
fn a() {
    const FILENAME: &[u8] = b":memory:\0";
    let mut db: *mut libsqlite3_sys::sqlite3 = std::ptr::null_mut();
    let rc = unsafe { libsqlite3_sys::sqlite3_open(FILENAME.as_ptr() as _, &mut db) };
    assert_eq!(rc, libsqlite3_sys::SQLITE_OK);
    test::b(db, 0);
}

在MacOS设备上,执行cargo test --lib --features=static时测试通过(sqlite3_create_function返回SQLITE_MISUSE):

$ cargo test --lib --features=static
    Finished test [unoptimized + debuginfo] target(s) in 0.52s
     Running unittests src/lib.rs (target/debug/deps/sqlite3_ext-5449511dde1f34ef)

running 2 tests
test z ... ignored
test a ... ok

test result: ok. 1 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.01s

但按代码逻辑,sqlite3_create_function不应返回SQLITE_MISUSE,且存在诸多诡异现象:

  • 不使用--features=static时测试失败(该特征未被任何代码引用)
  • 删除未执行的format!代码行时测试失败
  • 增删Cargo.toml中未被引用的依赖时测试失败
  • 重命名“static”特征为其他名称时测试失败
  • 重命名“test”模块为其他名称时测试失败
  • 在Linux系统运行时测试失败

添加[features] joke = []到Cargo.toml后,表现为:

  • cargo test --lib --features=joke测试失败(无SQLITE_MISUSE返回)
  • cargo test --lib --features=static测试通过(返回SQLITE_MISUSE)
  • cargo test --lib --features=static,joke测试失败(无SQLITE_MISUSE返回)

使用的环境为MacOS 10.14.6 (18G9323)、rustc 1.61.0 (fe5b13d68 2022-05-18),已上传二进制文件至GitHub。

内容的提问来源于stack exchange,提问作者Ryan Patterson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 15:06:29