c++ - 使用 vfprintf() 时出现段错误

标签 c++ c segmentation-fault

下面的程序遇到了段错误,我不知道是什么问题。

  1 #include<stdio.h>
  2 #include<stdarg.h>
  3 void writeformat(FILE*,char*, ...);
  4 int main()
  5 {
  6   FILE *fp;
  7   fp=fopen("file1.txt","w");
  8   writeformat(fp,"/modules.php?name=Top&querylang=%20WHERE%201=2%20ALL%20SELECT%201,pwd,1,1%20FROM%20nuke_authors/*");
  9   fclose(fp);
 10   return(0);
 11 }
 12 
 13 void writeformat(FILE *stream,char *format, ...)
 14 {
 15   va_list args;
 16   va_start(args,format);
 17   vfprintf(stream,format,args);
 18   va_end(args);
 19 }

我在 gdb 中试过,它告诉我问题出在 vfprintf() 中:

(gdb) run
Starting program: /ws/anaganes-sjc/junk 
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x2aaaaaaab000

Program received signal SIGSEGV, Segmentation fault.
0x0000003c44c7fb30 in wcslen () from /lib64/libc.so.6
(gdb) bt
#0  0x0000003c44c7fb30 in wcslen () from /lib64/libc.so.6
#1  0x0000003c44c80b27 in wcsrtombs () from /lib64/libc.so.6
#2  0x0000003c44c464b2 in vfprintf () from /lib64/libc.so.6
#3  0x0000000000400649 in writeformat (stream=0x601010, format=0x400758 "/modules.php?name=Top&querylang=%20WHERE%201=2%20ALL%20SELECT%201,pwd,1,1%20FROM%20nuke_authors/*") at junk.c:20
#4  0x0000000000400556 in main () at junk.c:9

你能帮我找出问题吗?

最佳答案

您的格式字符串包含转义空格字符。转义是用百分号完成的,HTML 样式:

"querylang=%20WHERE%201=2%20ALL%20SELECT%201..."

这些百分号在 printf 风格的格式字符串中有意义。您必须逐字呈现空格:

"querylang= WHERE 1=2 ALL SELECT 1..."

或者使用printf自带的转义来打印百分号,即%%:

"querylang=%%20WHERE%%201=2%%20ALL%%20SELECT%%201..."

或者,正如 alk 在评论中指出的那样,使用字符串格式并将您的字符串打印为参数:

writeformat(fp, "%s", "/modules.php?name=");

这是逐字打印具有或可能具有格式说明符的字符串的最佳方式。

您会遇到分段冲突,因为使用 % 指定的每个格式(%% 除外)都需要一个额外的参数。例如 %20A 打印宽度为 20 的 float 的二进制表示。因此它需要一个双参数,但您没有指定任何参数,因此 vprintf 尝试访问超出可变参数列表范围的内存。

许多编译器可以警告您著名的 printf 函数的格式不匹配。一些编译器允许您将自己函数的参数标记为格式字符串之类的 printf。 Microsoft 的 SAL 或 gcc 风格的属性可以让您做到这一点。

关于c++ - 使用 vfprintf() 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31408253/

相关文章:

java - Java 或 C++ 中的 API,用于读取机读区旅行证件(护照)代码

c++ - 由下划线开头的标识符导致的错误的真实示例

c - 如何修复段错误 : 11 compiler error

c - timer_create 在 i386 系统上导致段错误,但在 x86_64 系统(linux)上没有

c++ - 如何测试 Audio Session 的相等性

c++ - 如何多态地使用数组或指针 vector ?

c++ - 如果我在 C++ 中使用堆,我做错了什么吗?

c - 在运行时提供数组大小与动态内存分配之间的区别

c - 如何在终端中与我刚刚编写的 C 程序进行交互

c - 我在双向链表中查找最后一个元素的代码抛出段错误