[英]snprintf - format not a string literal and no format arguments warning
在Linux上编译时,我得到的format not a string literal and no format arguments
警告。 snprintf为第三个参数显示const char*
。 定义const char *INTERFACE = "wlan0"
然后将其传递给函数有什么问题?
#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;
}
警告的后半部分(“且无格式参数”)表示该字符串不包含任何%
s,因此像执行此操作那样使用snprintf()
没有意义。
值得警告的是,因为这可能存在安全风险,如果字符串参数在运行时可更改,则可能会“插入” %
,这将导致问题。 因此,最好将格式化字符串硬编码为“做您想做的事”。
如前所述,在这种情况下根本没有必要使用snprintf()
。
没错(这就是警告而不是错误的原因),只是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));
这只是一个警告,因此您可以忽略它。
但是在您的情况下,不值得使用snprintf
,只需编写代码即可
strncpy (ifd.ifr_name, sizeof(ifr.ifre_name), INTERFACE);
这可能会运行得更快,更重要的是不要发出警告。 如果要确保名称以null结尾,请使用ifd.ifr_name[sizeof(ifr.ifre_name)-1] = (char)0;
强制使用该名称ifd.ifr_name[sizeof(ifr.ifre_name)-1] = (char)0;
顺便说一句,使用最新的GCC 4.8,并使用gcc-4.8 -Wall sven.c -o sven
我没有收到任何警告。 甚至使用gcc-4.7 -Wall
。 可能是<stdio.h>
的libc
标头问题...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.