繁体   English   中英

snprintf-格式不是字符串文字,并且没有格式参数警告

[英]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));

还有一个strncpy可能会起作用,但是在strncpy情况下,它不会添加终止的'\\0'字符。

这只是一个警告,因此您可以忽略它。

但是在您的情况下,不值得使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM