2 个版本

0.1.2 2022 年 7 月 28 日
0.1.1 2022 年 7 月 23 日
0.1.0 2022 年 7 月 23 日

#395 in 测试

MITNFA 许可证

33KB
577 代码行

IO check

一个 Rust crate,用于彻底检查 std::io::Readstd::io::Write 的使用。

关于

它们各自特质的 readwrite 方法并不保证使用整个提供的缓冲区。正确应用必须处理这些情况。这通常是通过使用 read_exactwrite_all 来实现的,但人们可能会忘记这些,或者有特殊的原因避免使用它们,但未能正确编写代码。

此 crate 提供了一个工具,可以自动测试此类实现,甚至找到未正确处理的调用位置!

用法

接口非常简单:有两个函数,一个用于读取测试,另一个用于写入测试。 test_read 接受应从 Read 返回的字节和一个实现测试的闭包。闭包接受一个读取器作为参数,应调用你的解码函数。然后你应该将解码值与预期值进行比较,如果不相等则 panic - 就像在测试中一样。同样,test_write 接受预期字节作为参数和一个实现测试的闭包。闭包接受一个写入器,需要将其写入数据。写入的数据与预期值内部进行比较。

如果你的代码由于不正确处理分割而存在错误,此 crate 将找到它,甚至找到未正确处理的调用位置。找到原因需要 backtrace 功能,该功能默认开启。

请注意,如果有多个此类错误,该 crate 一次只能找到一个 - 对应于输入最左侧部分的那个。一旦修复它,就可以重新运行测试,它会报告下一个错误。重复此过程,直到修复所有错误。

请注意,此 crate 应正常用作 dev-dependency。

它的工作原理

读取

首先使用逐字节返回数据的读取器调用关闭。如果存在导致依赖整个缓冲区读取的 read 的错误,除非代码非常特殊,否则这将触发它。然而,人们通常首先用零填充缓冲区,如果输入也包含零,则错误不会触发。为了避免这种情况,缓冲区未使用部分被混淆,以确保数据无效。

如果错误触发,则使用 catch_unwind 捕获恐慌并运行搜索以找到发生的确切位置。闭包多次被调用,每次调用都使用另一个将输入分成两部分的读取器。每次调用中两部分的大小都会变化一个单位。一旦调用恐慌,我们就可以知道问题在输入中的位置。

要找到实际函数调用,读取器在 read 调用提供与分割位置重叠的缓冲区时捕获堆栈跟踪。每次迭代中只有一个 read 调用可以触发此操作。如果闭包恐慌,捕获的堆栈跟踪将用于错误报告。

写入

与读取相反,写入可以实时检测错误,因此它可以更快地找到错误和可能的错误位置。然而,它可以报告错误的位置,因此计划是使其更像读取。有关更多信息,请参阅问题 #1

除此之外,它与读取非常相似 - 在每个位置分割写入,如果写入的数据不匹配,则报告错误。堆栈跟踪捕获也与读取相似 - 捕获最后一个调用,如果当前调用写入意外的数据,则报告上一个调用为可能的罪魁祸首。

MSRV

1.41.1 无 backtrace 功能,1.48 有 backtrace 功能。

许可

MITNFA

依赖项

~2.5–3.5MB
~73K SLoC