今天调试项目中,遇到一个crash问题,和字符串末尾多一个\0有关,和write函数有关。
write() :
ssize_t write(int fd,const void*buf,size_t count);
参数说明:
fd:是文件描述符
buf:通常是一个字符串,需要写入的字符串
count:是每次写入的字节数
发生如下crash错误:
007640 0-01 00:04:13.716 2632 2632 F DEBUG : signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
007641 01-01 00:04:13.716 2632 2632 F DEBUG : Abort message: 'FORTIFY: write: prevented 4-byte read from 2-byte buffer'
007642 01-01 00:04:13.716 2632 2632 F DEBUG : r0 00000000 r1 0000015e r2 00000006 r3 00000008
有个关键性的报错提示:“write: prevented 4-byte read from 2-byte buffer'”。
大概可以知道是write函数的错误,错误提示大概意思 “阻止从2字节缓冲区读取4字节”
错误代码:
char buf[16]; // buf占有16个字节!!
int fd = open("xxx", O_WRONLY)
1. write(fd, "0", 4);
//以上crash就是这句话的错误,“0”占有2个字节(因为“”里面还有个‘\0’),后面4代表写入4字节,那往2个字节的缓存放4字节数据,导致内存泄露,所以直接crash了。(简单说,“0”只有2个字节数据怎么往文件写4字节?)
2. sprintf(buf, "%d", 255);
//这句话,只是把255存到buf中,没问题
write(fd, buf, 4);
//buf占有16个字节,往16字节的缓存存放4个字节数据,这是正确的
解决方法:减少写入的字节
write(fd, "0", 1); // 从写入4字节改为写入2字节或者1字节就可以了
后言:读书时很早就知道字符串末尾多一个‘\0’,那时也就记住了,知道这回事。若没有实际使用,还是不行啊。










网友评论