4

format not a string literal and no format arguments我在 Linux 上编译它时收到警告。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;
}
4

3 回答 3

4

没有错(这就是为什么它是警告而不是错误的原因),只是printf函数族最常见的用法是使用文字格式字符串。

喜欢:

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

在您的情况下,您可能应该使用 egmemcpy代替:

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

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

strncpy有可能会起作用,但在某些情况下它不会添加终止'\0'字符。

于 2013-04-15T09:07:13.203 回答
4

警告的后半部分(“并且没有格式参数”)意味着该字符串不包含任何%s,因此snprintf()像您正在做的那样使用没有意义。

值得警告的是,因为它可能存在安全风险,如果字符串参数在运行时可更改,则 a%可能会“潜入”,这将导致问题。因此,最好将格式化字符串硬编码为“做你想做的事”。

snprintf()如前所述,在这种情况下使用完全没有意义。

于 2013-04-15T09:11:26.953 回答
1

这只是一个警告,所以你可以忽略它。

snprintf 在你的情况下不值得使用,只是代码

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

这可能会运行得更快,更重要的是不要发出警告。如果您想确保名称以 null 结尾,请使用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. 这可能是一个libc标题问题<stdio.h>......

于 2013-04-15T09:08:08.293 回答