Ana*_*san 3 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 }
Run Code Online (Sandbox Code Playgroud)
我试过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
Run Code Online (Sandbox Code Playgroud)
能帮我找到问题吗?
您的格式字符串包含转义空格字符.使用百分号,HTML样式完成转义:
"querylang=%20WHERE%201=2%20ALL%20SELECT%201..."
Run Code Online (Sandbox Code Playgroud)
这些百分号在printf样式格式字符串中有意义.您必须逐字渲染空格:
"querylang= WHERE 1=2 ALL SELECT 1..."
Run Code Online (Sandbox Code Playgroud)
或使用printf自己的逃生印刷百分号,即%%:
"querylang=%%20WHERE%%201=2%%20ALL%%20SELECT%%201..."
Run Code Online (Sandbox Code Playgroud)
或者,正如注释中指出的那样,使用字符串格式并将字符串作为参数打印:
writeformat(fp, "%s", "/modules.php?name=");
Run Code Online (Sandbox Code Playgroud)
这是打印字符串的最佳方式,这些字符串具有或可能具有格式说明符.
您会收到分段违规,因为指定的每种格式%都%%需要额外的参数.例如,%20A打印宽度为20的浮点数的二进制表示.因此,它需要一个double参数,但是您没有指定任何参数,因此vprintf尝试在变量参数列表的边界之外访问内存.
许多编译器可以警告您有关众所周知的printf函数的格式不匹配.有些编译器允许您将自己函数的参数标记为printf格式字符串.Microsoft的SAL或gcc样式属性将允许您这样做.