programing

warning: 문자열 리터럴이 아닌 형식 인수 및 no format 인수

itsource 2022. 7. 14. 20:35
반응형

warning: 문자열 리터럴이 아닌 형식 인수 및 no format 인수

이 코드 줄에 걸려있는 경고를 없애고 싶은데

FILE *fil;
char *imp;
(...)
fprintf(fil,imp);

문제는 이 작업을 하면 파일에 원하는 대로 쓰이지만 %s 형식을 적용하면 이렇게 쓰이지 않는다는 것입니다.

fprintf(fil, "%s", imp);

이 경고는 printf style 함수(printf, fprintf...)에 대한 format string 인수를 확인할 수 없음을 gcc가 알려주는 방법입니다.기타) 이 경고는 컴파일러가 수동으로 문자열을 엿볼 수 없고 런타임 중에 모든 것이 의도한 대로 진행되도록 할 수 없는 경우에 발생합니다.몇 가지 예를 들어 보겠습니다.

케이스 1. 이 문자열은 컴파일 시 검증할 수 있으며 컴파일러는 경고 없이 허용합니다.

printf("This string has no format");

케이스 2: 이 경우 컴파일러는 포맷 지정자가 있음을 검출하여 다른 경고를 발생시킵니다.내 기계에는 "경고: 형식에 대한 인수가 너무 적다"라고 쓰여 있었다.

// This will most probably crash your machine
printf("Not a safe string to %s"); 

사례 3. 이건 어느 정도 당신의 경우입니다.런타임에 생성된 문자열을 인쇄하려고 합니다.이 경고는 문자열에 형식 지정자가 있을 수 있음을 컴파일러가 경고하는 경고입니다.예를 들어 "bad%sdata"라고 입력합니다.이 경우 런타임은 %s과(와) 일치하도록 존재하지 않는 인수에 액세스하려고 합니다.게다가 이것은, 유저가 프로그램을 부정 이용하는 경우가 있습니다(읽기 안전하지 않은 데이터를 읽게 합니다.

char str[200];
scanf("%s", str)
printf(str)

기술적으로 printf와 같은 함수를 문자열로 호출하는 것은 문제가 없지만 문자열에 다음과 같은 형식 토큰이 포함될 수 있기 때문에 여전히 잘못된 관행입니다.%s.한다면imp%s test예를 들어, 나쁜 일들이 일어날 것이다.

인쇄를 원하시면imp포맷하지 않고fputs(imp, fil)(반대의 인수에 주의해 주세요).

인정된 답변이 아주 잘 설명해 준 것 같아요.기본적으로 이 문서에서도 나타나 있듯이 컴파일러는 문자열 변수(이 경우)를 보증할 수 없습니다.imp)는 문자열 리터럴입니다.이 경고를 해제할 수 있습니다. 안전성이 확보되지 않은 경우,

#ifdef _WIN32
#pragma warning (disable : 4774)
#endif

코드 머리글 또는 CMake에서 다음을 수행합니다.

if (CMAKE_C_COMPILER_ID STREQUAL "MSVC")
  set(CMAKE_C_FLAGS "/wd4774") 
endif()

언급URL : https://stackoverflow.com/questions/4419293/warning-format-not-a-string-literal-and-no-format-arguments

반응형