c - lstat : Bad Address

标签 c

当我通过一个目录的多个条目运行此代码时,它通常返回 0,但是在两个目录中(一个 Windows 一个在 Unix 中)我不断收到“错误地址”错误消息。 lstat 和 relative_path 不为空,并且 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

最佳答案

据我所知,错误是由于您未能初始化作为第二个参数传递给 lstatthis_lstat 造成的。

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

您似乎正在传递一个未初始化的指针,它几乎肯定指向无效内存。 Valgrind 不会提示,因为在系统调用之前,您没有做错任何事情——只有当内核尝试访问内存时,它才会意识到它是无效的。

要解决此问题,请使用 mallocstruct stat 分配内存,或者只传递指向堆栈上变量的指针而不是使用指针:

struct stat this_lstat;
lstat(..., &this_lstat);

关于c - lstat : Bad Address,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9459023/

相关文章:

c - 使用AES算法加密不规则大小的大文件

c - 将数组传递给 void 函数

c - c语言如何将其转为大写

c - 是否可以使用预处理器指令来验证表达式?比如 #if (a == b)

c - 使用 XCB 检测窗口焦点变化

c - 添加更多线程在什么时候停止帮助?

c - 读者 - C 语言的作者 - 我哪里错了?

用于计算文件中行数和单词数的 C 程序给出错误的单词输出

c - 线程安全位数组?

c - MXE 和 SDL2 出现多个 "Undefined reference"错误