如何测试程序正确处理了部分read()和write()?

时间:2020-07-25 20:51:09

标签: testing posix system-calls partial

众所周知,readwrite的系统调用可以使用的字节数少于请求的字节数。但这是相对罕见的,并且通常无法很好地测试。考虑这个越野车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个字符。我有什么方法可以在测试期间允许的任何时候对readwrite进行悲观的分析以进行部分写入,从而可以更容易地发现这些错误?一些必备功能:

  • 使用现有的二进制文件而不需要重新编译
  • 处理静态链接/非libc(例如Go)二进制文件
  • 除了Linux以外,还可以在更多操作系统上工作
  • 不破坏使用/proc/self/uid_map,inotify,eventfd或需要(并保证能够)在一个系统调用中读取或写入多个字节的其他特殊FD的程序

0 个答案:

没有答案