solaris又玩我

solaris8下没有strerror_r,也就罢了。我忍。
我今天用readdir_r,程序总是莫名奇妙的core dump.
一步步的追踪,

while(1){
    int ret=readdir\_r(srcdir,&entry,&result);
    if(result==NULL) break;
    if(ret!=0){
        perror("遍历目录时失败");
        break;
    }
}

在进入到某个目录的时候,
执行readdir_r之前
(gdb) p *srcdir
$47 = {d_fd = 6, d_loc = 24, d_size = 264, d_buf = 0x80659d0 "\0043:"}
执行之后
(gdb) p *srcdir
$48 = {d_fd = 1853256494, d_loc = 2019914799, d_size = 1633824116, d_buf = 0x65\
73
}
(gdb) p ret
$49 = 0
(gdb) p result
$50 = (dirent *) 0x80471a0
很奇怪。尽管从返回值来看,readdir_r已经成功返回。(返回0,且 result指针也不是NULL)但是srcdir其内部的 d_buf字段已经被指向了一个无效的内存。
而尽管我用的是readdir_r,但是其实我的程序是单线程的。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥