lstat:地址不好

时间:2012-02-27 01:33:28

标签: c

当我通过目录的几个条目运行此代码时,它通常返回0,但在两个目录(Unix中的一个Windows)中,我不断收到“错误地址”错误消息。 lstat和relative_path不为null,relative_path确实指向有效目录。此代码适用于其他目录。目录没有任何RWX限制。在此之前,我能够调用opendir和readdir而不会在这些问题目录上获得错误或NULL响应。 Valgrind没有显示内存泄漏或其他错误。

struct stat *this_lstat; 
...
DIR *dir = opendir(path); 
...
dptr = readdir(dir);
...

注意:此时为relative_path ==“。/ bin / Debug”。

int return_code = lstat(relative_path, this_lstat);

if (return_code < 0) {
        fprintf(stderr, "find: ");
        perror(dptr->d_name); //printf("3"); //Error reading the file or directory
        return NULL;
}

更新:我在malloc和realloc上添加了检查,现在我在lstat行本身上出现了分段错误。不调用错误处理代码。这是堆栈跟踪: 程序接收信号SIGSEGV,分段故障。

0xb76f2779 in ?? () from /lib/tls/i686/cmov/libc.so.6 
(gdb) backtrace
#0  0xb76f2779 in ?? () from /lib/tls/i686/cmov/libc.so.6
#1  0xb76ead47 in __lxstat () from /lib/tls/i686/cmov/libc.so.6
#2  0x0804959c in lstat ()
#3  0x0804903c in walk_directory_tree (path=0x805b058 "./testmine",
   findme=0x0, type_str=0x0, base_dir_searched=1, dirs_later_array=0x805b0d0)
   at pfind.c:266
#4  0x08049106 in walk_directory_tree (path=0xbfa5cca3 ".", findme=0x0,
   type_str=0x0, base_dir_searched=1, dirs_later_array=0x804b018)
   at pfind.c:282
#5  0x08048c2a in main (ac=2, av=0xbfa5c8a4) at pfind.c:143

1 个答案:

答案 0 :(得分:3)

据我所知,错误是由于您未能初始化作为第二个参数传递给this_lstat的{​​{1}}。

错误字符串“Bad address”对应于错误代码lstat,它来自将无效指针传递给系统调用。因此,传递给EFAULT的路径名称不会指向可读内存中有效的以空字符结尾的字符串,或者传递lstat,因为第二个参数未指向有效的可写内存

您似乎正在传递一个单位指针,这几乎肯定会指向无效的内存。 Valgrind没有抱怨,因为直到系统调用,你没有做错任何事情 - 只有当内核试图访问内存时它才意识到它是无效的。

要解决这个问题,可以使用struct statstruct stat分配内存,或者只是将指针传递给堆栈上的变量而不是使用指针:

malloc