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
'programing' 카테고리의 다른 글
현장 주입이란 정확히 무엇이며, 이를 피하는 방법은 무엇입니까? (0) | 2022.07.14 |
---|---|
Vue SPA - 사용자가 인증되었는지 확인하고 인증되지 않은 경우 로그인으로 수정합니다. (0) | 2022.07.14 |
글로벌 변수와 스태틱 변수가 기본값으로 초기화되는 이유는 무엇입니까? (0) | 2022.07.14 |
VUE 감시가 무한 루프를 트리거했습니다. (0) | 2022.07.05 |
C에서 int를 문자열로 변환하려면 어떻게 해야 합니까? (0) | 2022.07.05 |