我有一个行为类似于 cp 的简单程序,它将内容从一个文件复制到另一个文件,包括漏洞。语义简单,实现简单,主要部分如下。问题是,如果我编译并运行(GCC 4.7.1 Arch Linux)而没有下面标记的行,它会用随机的字节序列填充第二个文件几秒钟,最后出现分段错误。但是,如果我插入标记的行(它只是将当前写入的字节数输出到 tty - 一切正常)。如果我使用 egprintf("Hello World!\n")
代替它,它仍然坏了。
这里发生了什么?某些与程序语义没有任何关系的库函数如何导致此错误?
#include "tlpi_hdr.h" //declares errExit and usageErr
#include <malloc.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#define BUF_SIZE 1024
int main(int argc, char **argv)
{
if ( argc != 3 )
usageErr("cp_self source dest");
int fd_source, fd_dest, bytes;
char *buf, *cur;
buf = malloc(BUF_SIZE);
FILE *str;
if ( ( fd_source = open(argv[1], O_RDONLY) ) == -1 )
errExit("open(%s)", argv[1]);
if ( ( fd_dest = open(argv[2], O_WRONLY | O_TRUNC | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO) ) == -1 )
errExit("open(%s)", argv[2]);
if ( ( str = fdopen(fd_dest, "w") ) == NULL )
errExit("fdopen(%d, 'w')", fd_dest);
while ( ( bytes = read(fd_source, buf, BUF_SIZE) ) != 0 )
{
int dbg_cntr = 0;
cur = buf;
while ( cur != buf + bytes )
{
//printf("%d\n", dbg_cntr++); this line
if ( *cur == '\0' )
{
if ( fflush(str) != 0 )
errExit("fflush(%d)", str);
if ( lseek(fd_dest, 1, SEEK_CUR) == (off_t) -1 )
errExit("lseek(%d, 1, SEEK_CUR)", fd_dest);
}
else
{
if ( fprintf(str, "%c", *cur) != 1 )
errExit("fprintf(%d, %c)", str, *cur);
}
++cur;
}
}
}
添加了整个代码。