gpt4 book ai didi

c - 为什么 string.h 函数会出现段错误?

转载 作者:太空宇宙 更新时间:2023-11-04 04:21:54 24 4
gpt4 key购买 nike

在我同事的 PC 上使用相同的命令,我的程序运行没有问题。但是在我的电脑上,程序因段错误而崩溃;

核心的 GDB 回溯如下:

#0 strrchr () at ../sysdeps/x86_64/strrchr.S:32
32 ../sysdeps/x86_64/strrchr.S: no such file or directory
(gdb) bt
#0 strrchr () at ../sysdeps/x86_64/strrchr.S:32
#1 0x00007f10961236d7 in dirname (path=0x324a47a0 <error: Cannot access memory at address 0x324a47a0>) at dirname.c:31

我已经在使用 -g -ggdb 选项编译可执行文件。

奇怪的是..使用 valgrind 程序在我的 PC 上也能正常运行。

我该如何解决这个问题?我观察到错误仅发生在 strrchr、strcmp、strlen、... string.h 函数中。

+编辑:gdb 回溯表明程序在这里崩溃了:

char* base_dir = dirname(get_abs_name(test_dir));

其中 get_abs_name 定义为

char* get_abs_name(char* dir) {
char abs_path[PATH_MAX];
char* c = malloc(PATH_MAX*sizeof(char));
realpath(dir, abs_path);
strcpy(c, abs_path);
return c;
}

+Edit2: 'dir'是某个文件的路径,比如'../program/blabla.jpg'。

使用 valgrind,

printf("%s\n", dir)

通常打印'/home/frozenca/path_to_program'。我猜不出为什么程序在没有 valgrind 的情况下崩溃。

最佳答案

如果没有 Minimal, Complete, and Verifiable example,我们无法确定.你的代码看起来大部分是正确的(尽管很复杂),除了你不检查错误。

char* get_abs_name(char* dir) {
char abs_path[PATH_MAX];
char* c = malloc(PATH_MAX*sizeof(char)); /* this may return NULL */
realpath(dir, abs_path); /* this may return NULL */
strcpy(c, abs_path);
return c;
}

现在,这怎么会导致您看到的错误呢?好吧,如果 malloc 返回 NULL,您将在 strcpy 中立即崩溃。但是如果 realpath 失败了:

  • abs_path 的内容仍未定义。
  • 所以 strcpy(c, abs_path) 将复制未定义的内容。如果 abs_path[0] 恰好是 \0,这可能导致它只复制一个字节。但也可能导致大量堆损坏。这取决于不相关的条件,例如程序是如何编译的,以及是否附加了一些调试工具,例如 valgrind

TL;DR:养成检查每个可能失败的功能的习惯。

char* get_abs_name(char* dir) {
char abs_path[PATH_MAX];
char* c = malloc(PATH_MAX*sizeof(char));
if (!c) { return NULL; }
if (!realpath(dir, abs_path)) {
free(c);
return NULL;
}
strcpy(c, abs_path);
return c;
}

或者,在这里,你可以假设一个 GNU 系统或 POSIX.1-2008 系统来简化它:

char * get_abs_name(const char * dir) {
return realpath(dir, NULL);
}

但请注意,无论哪种方式,在您的主程序中,您还必须检查 get_abs_name() 没有返回 NULL,否则 dirname() 会崩溃。

关于c - 为什么 string.h 函数会出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45994566/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com