testing - 如何测试程序是否正确处理部分读取()和写入()?
问题描述
众所周知,read
和write
系统调用可以在比请求更少的字节上运行。但这种情况比较少见,而且通常没有经过很好的测试。考虑这个有缺陷的 C 程序:
#include <unistd.h>
int main(void) {
const char *buf = "Hello, World!\n";
size_t count = 14;
do {
ssize_t written = write(STDOUT_FILENO, buf, count);
if(written < 0) return 1;
/* whoops, forgot to do `buf += written;`! */
count -= written;
} while(count);
return 0;
}
由于它忘记调整buf
,如果第一个write
只写 7 个字符,它最终会打印Hello, Hello,
而不是Hello, World!
. 不过,在正常测试中你真的不太可能发现这个错误,因为它几乎总是会在一次调用中写入所有 14 个字符。有什么方法可以让我在测试时允许read
s 和write
s 进行部分写入,以便更容易找到这些类型的错误?一些不错的选择:
- 处理现有的二进制文件,而不需要重新编译
- 处理静态链接/非 libc(例如 Go)二进制文件
- 在更多的操作系统上工作,而不仅仅是 Linux
- 不破坏使用
/proc/self/uid_map
、inotify、eventfd 或其他需要(并且保证能够)在一个系统调用中读取或写入多个字节的特殊 FD 的程序