【问题标题】:Is there a length limit for fprintf? [duplicate]fprintf 有长度限制吗? [复制]
【发布时间】:2016-10-25 19:12:37
【问题描述】:

A 有下一个 c ansi 代码,在 Linux 版本 2.6.32-431.11.2.el6.x86_64

    fprintf(fpOut, "%s",cBuffer);

其中cBuffer是一个指向char的指针,如

    int bfnAddOutputFile(FILE *fpOut, char *cBuffer){/**/

        fprintf(fpOut, "%s",cBuffer);

        //code

        return ( TRUE );
    }

当它执行 fprintf 时,会生成一个核心转储

    Program received signal SIGSEGV, Segmentation fault.
    0x00000038b2e6723e in fputs () from /lib64/libc.so.6

有一个最大长度的字符可以发送到 fprintf,如果是这个数字是多少?

【问题讨论】:

  • 是cBuffer ASCIIZ 字符串吗?
  • 不清楚你为什么会崩溃,因此你为什么认为这是一个长度问题?
  • 看看这个相关的帖子printf/fprintf maximum size according to c99。
  • 您的字符串可能没有以空字节终止。将fprintf(fpOut, "%s",cBuffer); 替换为printf("%zd\n",strlen(cBuffer));,看看错误是否仍然存在。
  • 你的意思是strlen,@squeamishossifrage?如果是这样,(1)strlen() 可能会遇到同样的问题,并且(2)正确的字段描述符将是 %zx,而不是 %xd。

标签: c linux core


【解决方案1】:

cBuffer 可能不包含空终止符,这会使fprintf 超出内存边界。

在输出 C 字符串时,printf-family 函数仅在遇到 null-terminator ('\0') 时停止,否则可以继续,直到它们尝试输出一段不属于您的程序的内存,这会导致分段错误。

【讨论】:

  • 虽然不是 OP 的情况,但如果给定字段宽度,[f|s]printf 可以在遇到字符串终止符之前停止。
  • cBuffer 太小,fprintf 中不包含空终止符。
  • @JohnBollinger 怀疑你的意思是 precision,而不是 field width。
  • 没错,@chux。 printf-family 函数不会输出比字段 precision 更多的字符串参数字符,而不是宽度。例如,可能会使用如下内容:fprintf(fpOut, "%.255s",cBuffer);.
猜你喜欢
  • 2015-10-22
  • 2011-01-17
  • 2014-04-28
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 2010-11-05
  • 2012-01-10
  • 2012-07-25
相关资源
最近更新 更多