ARM开发板上跑如下测试程序的时候会概率性出现“Write Failed Bad address”:

/* Write test */
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

int main(int argc,char* argv[]){
 int i = 0;
 int w_rw = 0;
 int fd = -1;
 int bw = -1;
 int nob = 0;
 char* file_name = "testfile";
 char buff[30] = "Testing";

 w_rw = 1;       // 1 - write , 2 - rewrite
 nob = 1024;  // No of bytes to write

 for(i = 0; i < w_rw; i++){
        if((fd = open(file_name,O_CREAT | O_RDWR))< 0){
                perror("Open failed!");
                return -1;
        }

        printf("fd:%d",fd);
        if((bw = write(fd,buff,nob)) < 0){
                perror("Write failed!");
                return -1;
        }
        printf("\n Bytes written : %d \n",bw);
 }

 return 0;
}

尝试跟踪代码一直找不到具体原因,于是查看write()函数的man手册,该函数的说明如下:

函数定义:ssize_t write (int fd, const void * buf, size_t count); 
函数说明:write()会把参数buf所指的内存写入count个字节到参数fd所指的文件内。
返回值:如果成功write()会返回实际写入的字节数(len)。当有错误发生时则返回-1,错误代码存入errno中。

这里从buf里面写入fd文件的字节是由count决定的,而不是buf的实际分配内存决定。这样就存在一种访问无效地址(Bad address)的情况:如果count的值大于buf的实际分配内存大小,write()函数就有可能尝试访问超出buf实际内存空间的无效地址。

上述测试代码的问题是buf比较小,只有30字节,write()试图写的是1024字节,这样就会概率性访问到无效地址。只需要修改如下代码即可解决该问题:

        if((bw = write(fd,buff,sizeof(buf))) < 0){
                perror("Write failed!");
                return -1;
        }
Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐