2013-04-15 2 views
1

Linux에서 컴파일 할 때 경고 메시지가 표시되는 경우 format not a string literal and no format arguments이 표시됩니다. snprintf은 세 번째 매개 변수에 대해 const char*을 표시합니다. const char *INTERFACE = "wlan0"을 정의하는 것이 잘못 되었습니까?snprintf - 형식이 문자열 리터럴이 아니며 형식 인수가 없음 경고 :

#include <stdio.h> 
#include <net/if.h> 
#include <string.h> 

int main(int argc,char *argv[]){ 
    const char *INTERFACE  = "wlan0"; 
    struct ifreq ifr; 

    memset(&ifr, 0, sizeof(ifr)); 
    snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), INTERFACE); 

    return 0; 
} 
+1

나는 경고를받지 못한다. http://ideone.com/BdSQF2 OK 일 것이다. – duDE

+0

"const char * format"이 "% s"처럼 보입니다. – MYMNeo

+0

GCC의 버전은 무엇입니까? ('gcc -v' 만 실행하면 알 수있다). –

답변

3

그것은 아무 문제 (이것은 경고가 아닌 오류입니다 그 이유는),이 함수의 printf 가족의 가장 일반적인 사용은 문자 형식 문자열을 사용하여 그냥 것이 없다.

처럼 :

snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", INTERFACE); 

귀하의 경우에 당신은 아마 예를 들어, 사용되어야한다 memcpy 대신 :

#define MIN(a, b) ((a) < (b) ? (a) : (b)) 

memcpy(ifr.ifr_name, INTERFACE, MIN(strlen(INTERFACE) + 1, sizeof(ifr.ifr_name)); 

도 작동 할 수 있습니다 strncpy있다, 그러나이 종료 '\0' 문자를 추가하지 않습니다 경우가있다.

1

경고 일 뿐이므로 무시해도됩니다.

그러나이 빠르게 실행할 수 있으며 더 중요한 경고를 제공하지 않습니다

strncpy (ifd.ifr_name, sizeof(ifr.ifre_name), INTERFACE); 

단지 코드, 귀하의 경우 snprintf 를 사용하여 가치가 없다. 이름이 null로 끝나고 싶다면, 강제로 ifd.ifr_name[sizeof(ifr.ifre_name)-1] = (char)0;

BTW, 최근 GCC 4.8, 컴파일 중 gcc-4.8 -Wall sven.c -o sven 경고가 표시되지 않습니다. 심지어 gcc-4.7 -Wall도 있습니다. 그것은

4

경고 ("없고 형식 인수")의 후반 부분 문자열이 어떤 %의를 포함하지 않는 것을 의미합니다 ... <stdio.h>에서 libc 헤더 문제가 될 수 있으며, 따라서 아무 소용 사용하여이 없다 너 같은거야 snprintf().

보안 상 위험 할 수 있으므로 경고 할 가치가 있습니다. 런타임시 문자열 인수가 변경 가능하면 %이 문제가 될 수 있습니다. 따라서 형식 문자열이 "원하는 것을 수행하십시오"하드 코드 된 경우 더 좋습니다.

이 경우에도 snprintf()을 전혀 사용하지 않아도됩니다.

+1

+1을 보내 주셔서 감사합니다. 관용적 인 사용 (정말로 snprintf를 사용해야하는 경우)은'snprintf (str, sizeof (str), "% s", foo);' – Roddy

관련 문제