当我尝试在Ubuntu上编译fprintf(stderr,用法)时,我得到这个错误:
error: format not a string literal and no format arguments [-Werror=format-security
但是当我在其他正在编译的linux发行版(RedHat,Fedora,SUSE)上编译时.
任何人都有想法?
解决方法
你应该使用fputs(用法,stderr);
如果您不进行格式化,则不需要使用fprintf.如果要使用fprintf,请使用fprintf(stderr,“%s”,Usage);
Ubuntu上的default compiler flags包括-Wformat -Wformat-security,这是什么给出了这个错误.
那个标志被用来防止引入安全相关的bug,想象一下
如果你以某种方式做到这一点会发生:
char *Usage = "Usage %s,[options] ... "; ... fprintf(stderr,Usage);
这将是一样的
fprintf(stderr,“Usage%s,[options] …]”);这是错的.
现在,Usage字符串包含格式说明符%s,但是您不能为fprintf提供该参数,从而导致未定义的行为,可能会导致程序崩溃或允许其被利用.如果您传递给fprintf的字符串来自用户输入,则更为相关.
但是如果你做了fprintf(stderr,“使用%s,[options] …]”);没有这样的问题. 2.%s不会被解释为格式指定器.gcc可以警告这一点,默认的Ubuntu编译器标志使它成为编译器错误.