gpt4 book ai didi

c - fprintf 上的段错误(假定)有效的 FILE 指针

转载 作者:行者123 更新时间:2023-11-30 20:58:13 28 4
gpt4 key购买 nike

因此,在这个相当大的源文件中,我有以下部分,假设在函数 foo 中,从 main 调用:

FILE *logfile = NULL
if (log_engabled) {
char fname[30];
snprintf(fname, 30, ".logs/%d.txt", time(NULL));
logfile = fopen(fname, "w");
}
fprintf(logfile, "test\n");

执行没有问题。 (是的,我应该警惕logfile == NULL,但为了简洁我省略了它)。在我的测试运行中,log_file == 0x840fa50&log_file == 0x7ffffffedca8 .

然后我调用另一个函数 bar它需要一堆参数,包括 FILE **log_stream 。它的 body 看起来像这样:

if (*log_stream)
fprintf(*log_stream, "test\n");
/*a bunch of other stuff, including more fprintf calls*/

现在这是奇怪的部分。如果我打电话bar来自foo紧接着上面的代码段,一切就顺利进行了。然而,稍后foo , bar再次调用,使用其他参数,但相同 logfile指针。然后我得到一个SIGSEGV就在fprintf称呼。我用gdb检查过,指针的位置以及它指向的值都是完全相同的(并且我从未在其间调用fclose)。

什么可能导致此行为?它一定与我在调用 bar 之间运行的代码有关。 ,但这些语句都不包括 logfile除了 fprintf 之外的任何内容来电。

也许我在fprintf以外的地方导致了段错误。 call 和 gdb 给了我错误的行号,但我用 gcc -O0 和 -g 进行编译,当我移动 print 语句时,错误指示也是如此。

我还尝试声明 logfile作为全局变量而不将其传递给 bar ,无济于事。在此感谢任何帮助。

编辑:

我做了一些挖掘,*鼓声* - 问题是由无符号整数下溢引起的,导致数组写入超出范围。更具体地说:

foo() {
FILE *logfile = fopen("log.txt", "w");
fprintf(logfile, "test1");
memory_corrupting_function();
fprintf(logfile, "test2");
}

第一个fprintf再次顺利进行,第二个触发 SIGSEGV 。因此,重新表述我原来的问题:如果我不调用fprintf,看看程序如何继续正常执行。再说一遍,为什么当我调用 fprintf 时会出现段错误?而不是当我写入无效的内存位置时?

是否有答案,或者只是在实现过程中发生变化的未定义行为?

最佳答案

您无法返回局部变量的地址。最有可能的是,logfile 将存在于堆栈中。一旦 foo 返回,logfile 所保存的值很有可能会被覆盖。 fopen() 返回的文件指针将一直有效,直到您 fclose() 文件为止。但是一旦函数返回,变量 logfile 将超出范围。

只需返回日志文件的值:

FILE * foo() {
FILE *logfile = NULL;
//....
return logfile;
}

void bar() {
FILE *alsoLogfile = foo();
// ...
}

在您的问题中,您指出:如果我在上述代码段之后直接从 foo 调用 bar,一切都会顺利进行。这很可能发生,因为堆栈的部分 logfile 存在尚未被覆盖。使用超出范围的变量的地址是未定义的行为,因此任何事情都可能发生。

关于c - fprintf 上的段错误(假定)有效的 FILE 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53482463/

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