我正在尝试学习C,但我已经遇到了问题。我认为它是微不足道的,但我需要知道它。我写了:
#include <stdio.h>
#include <string.h>
int main()
{
char str_a[20];
strcpy(str_a, "Hello, world!\n");
printf(str_a);
}
一旦我尝试使用以下命令编译它:gcc -g -o char_array2 char_array2.c我收到一条错误消息:
char_array2.c: In function ‘main’:
char_array2.c:9:2: warning: format not a string literal and no format arguments [-Wformat-security]
有人可以帮忙吗?
答案 0 :(得分:59)
使用printf时,格式字符串最好是字符串文字,而不是变量:
printf("%s", str_a);
答案 1 :(得分:17)
只是为了给其他答案添加一些东西,你最好这样做是因为很久以前人们写了这样的printf,黑客找到了一种读写堆栈的方式,更多here。登记/> 例如,一个像这样的简单程序:
blackbear@blackbear-laptop:~$ cat format_vul.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
char text[1024];
static int test_var = -1;
if(argc < 2) {
printf("Use: %s <input>\n", argv[0]);
exit(-1);
}
strcpy(text, argv[1]);
printf("The correct way:\n");
printf("%s", text);
printf("\nThe wrong way:\n");
printf(text);
printf("\n[*]: test_var @ %8p = %d ( 0x%x )\n", &test_var, test_var, test_var);
}
blackbear@blackbear-laptop:~$ ./format_vul AAAA
The correct way:
AAAA
The wrong way:
AAAA
[*]: test_var @ 0x804a024 = -1 ( 0xffffffff )
可用于将test_var的值从0xffffff更改为其他值,例如0xaabbccdd:
blackbear@blackbear-laptop:~$ ./format_vul $(printf "\x24\xa0\x04\x08JUNK\x2
5\xa0\x04\x08JUNK\x26\xa0\x04\x08JUNK\x27\xa0\x04\x08").%8x.%8x.%8x.%8x.%8x.
%8x.%8x.%8x.%8x.%110x.%n%239x%n%239x%n%239x%n
The correct way:
$�JUNK%�JUNK&�JUNK'�.%8x.%8x.%8x.%8x.%8x.%8x.%8x.%8x.%8x.%110x.%n%239x%n%239
x%n%239x%n
The wrong way:
$�JUNK%�JUNK&�JUNK'�.bfffefec. 154d7c. 155d7c. 155d7c. f0. f0.b
ffff4a4. 4. 4.
174.
50415243
50415243
50415243
[*]: test_var @ 0x804a024 = -1430532899 ( 0xaabbccdd )
答案 2 :(得分:5)
警告是由编译器希望printf
的第一个参数为字符串文字引起的。它希望你写这个:
printf("%s\n", str_a);
这是因为printf
的第一个参数是格式字符串。然后在那之后传递格式参数。
注意:您实际上可以将变量用作格式字符串,但您可能不应该这样做。这就是编译器发出警告而不是错误的原因。
答案 3 :(得分:2)
错误来自printf(str_a);
。您的代码应为printf("%s",str_a);
有关printf的更多信息,请查看以下链接。 http://www.cprogramming.com/tutorial/printf-format-strings.html
答案 4 :(得分:1)
printf()
期望它的格式是字符串文字,而不是动态创建的字符串。要解决此问题,请尝试以下操作:
printf("%s", str_a); // %s denotes a string
或使用puts
puts(str_a);
答案 5 :(得分:1)
请阅读警告'无格式参数' - 即字符串中没有%。
尝试printf("%s", str_a);