Testing 如何测试程序是否正确处理部分读()和写()呢?

Testing 如何测试程序是否正确处理部分读()和写()呢?,testing,posix,system-calls,partial,Testing,Posix,System Calls,Partial,众所周知,read和write系统调用的字节数比请求的字节数少。但这是相对罕见的,而且往往没有得到很好的测试。考虑这个错误的C程序: #包括 内部主(空){ const char*buf=“你好,世界!\n”; 大小/计数=14; 做{ ssize_t write=写入(标准文件号、buf、计数); 如果(写入

众所周知,
read
write
系统调用的字节数比请求的字节数少。但这是相对罕见的,而且往往没有得到很好的测试。考虑这个错误的C程序:

#包括
内部主(空){
const char*buf=“你好,世界!\n”;
大小/计数=14;
做{
ssize_t write=写入(标准文件号、buf、计数);
如果(写入<0),则返回1;
/*哎呀,忘了写了*/
计数-=写入;
}同时(计数);
返回0;
}
由于它忘记了调整
buf
,如果第一次
写入
仅写入7个字符,它将最终打印
你好,你好,
,而不是
你好,世界。不过,在正常测试中,您不太可能发现这个bug,因为它几乎总是在一次调用中写入所有14个字符。有没有什么方法可以让我在测试过程中允许的任何时候对
read
s和
write
s进行部分写入,从而更容易发现这些类型的bug?有几个很好的选择:

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