c 어레이 - 경고: 문자열 리터럴이 아닌 형식
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]
누구 좀 도와주시겠습니까?
사용시printf
, 형식 문자열은 변수가 아니라 문자열 리터럴이 더 낫다.
printf("%s", str_a);
단지 다른 답에 무언가를 덧붙이기 위해, 당신은 이것을 하는 것이 더 낫다. 왜냐하면 오래 전에 사람들은 그렇게 인쇄물을 썼고 해커들은 여기서 더 많이 읽고 스택에 쓰는 방법을 발견했기 때문이다.
예를 들어 다음과 같은 간단한 프로그램을 참조하십시오.
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의 값을 0xffffffff에서 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 )
printf()
형식은 동적으로 생성된 문자열이 아니라 문자열 리터럴일 것으로 예상한다.해결하려면 다음을 수행하십시오.
printf("%s", str_a); // %s denotes a string
또는 사용puts
puts(str_a);
경고는 컴파일러가 첫 번째 주장을 원해서 발생한다.printf
문자 그대로의 끈이다다음과 같은 내용을 쓰길 원한다.
printf("%s\n", str_a);
의 첫 번째 매개 변수 때문이다.printf
형식 문자열.그런 다음 형식 인수는 그 후에 전달된다.
참고: 사실 변수를 형식 문자열로 사용할 수 있지만, 그렇게 하면 안 될 겁니다.그래서 컴파일러는 오류가 아닌 경고를 하는 것이다.
'포맷 인수 없음' 경고, 즉 문자열에서 %를 읽으십시오.
해보다printf("%s", str_a);
오류는 에서 온다.printf(str_a);
당신의 코드는printf("%s",str_a);
인쇄물에 대한 자세한 내용은 다음 링크를 참조하십시오.http://www.cprogramming.com/tutorial/printf-format-strings.html
참조URL: https://stackoverflow.com/questions/9707569/c-array-warning-format-not-a-string-literal
'IT이야기' 카테고리의 다른 글
내 경로에서 Vue'x getter를 사용할 때 "state.user가 null임" (0) | 2022.05.02 |
---|---|
vue-cli를 사용하여 중첩된 html을 구축하는 데 오래 걸림 (0) | 2022.05.02 |
Axios - 한 번의 호출만으로 헤더 권한 부여 제거 (0) | 2022.05.02 |
Java에서 일반 매개 변수 유형 가져오기(반영 포함) (0) | 2022.05.02 |
axi 및 Symfony를 사용하여 개체를 삭제할 때 상태 코드 500이 삭제되지만 삭제는 작동함 (0) | 2022.05.02 |