IT이야기

c 어레이 - 경고: 문자열 리터럴이 아닌 형식

cyworld 2022. 5. 2. 21:22
반응형

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

반응형