【蜗牛黑板报】write函数和字符串

2020-06-01  本文已影响0人  技术是神奇的

今天调试项目中,遇到一个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’,那时也就记住了,知道这回事。若没有实际使用,还是不行啊。

书读百遍,其义也不会自现,要靠实践。

上一篇 下一篇

猜你喜欢

热点阅读