【问题标题】:lstat: Bad Addresslstat:错误地址
【发布时间】:2012-03-16 13:43:45
【问题描述】:

当我通过目录的多个条目运行此代码时,它通常返回 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,Segmentation fault。

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

【问题讨论】:

  • 最明显的检查是 this_lstat 实际上是明智的,但如果 valgrind 工作正常,那么听起来就是这样! Bad Address 不是我查看的手册页中列出的错误之一,可能是代码中较早的内容导致了问题并且它只是出于某种奇怪的原因出现在这里?
  • errno 在调用lstat() 之前有什么值?
  • 确切的错误信息是什么?如果程序崩溃,请在调试器下运行它并在崩溃时生成堆栈跟踪(gdb 中的backtrace 命令或 MS 调试器中的kb 命令,包括 Visual Studio 的“命令窗口”)。如果这不能告诉您问题是什么,请将跟踪发布到您的问题。我们可能还需要查看设置this_lstat 的代码。
  • 我在我丢失的每个 malloc 和 realloc 之后添加了对 null 的检查。我没有从这些检查中得到任何错误,但现在我的代码在 lstat() 调用本身上出现分段错误。不调用错误处理代码。 Valgrind 仍然没有错误。另外,我没有看到任何设置 this_lstat 值的代码。据我了解,该变量应由 lstat 调用设置。

标签: c


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 你了解指针的工作原理吗?是的,它是一个指针,但它不指向任何东西:你不能只声明一个指针并让它神奇地指向有效内存。您必须自己使用malloc 显式分配内存,或者将其指向现有对象的地址。
  • 这就解释了。我还有另一个问题,它解释了我也遇到的分段错误,但是将“&”添加到 &this_lstat 可以解决错误地址错误。谢谢
猜你喜欢
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
相关资源
最近更新 更多