编译链接实战(17)编译选项-fpermissive部分错误降低为警告--谨慎使用

man手册该选项的说明如下:

   -fpermissive
           Downgrade some diagnostics about nonconformant code from errors to warnings.  Thus, using -fpermissive will allow some nonconforming code to compile.

该选项会将不一致代码的诊断从错误降级为警告。

该选项最好不要使用,因为会降低对于代码检查的严格性。

例子:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

const static char *source = "source";

int main(int argc, char *argv[])
{
	char buf[512];
	snprintf(buf, "%s", source);
	return 0;
}

在该代码中,snprintf并没有使用第二个参数sizeof(buf),如果不使用该选项,编译结果如下所示:

syrius@AI-MACHINE:~ $ g++ g.cc     
g.cc: In function ‘int main(int, char**)’:
g.cc:10:23: error: invalid conversion from ‘const char*’ to ‘size_t’ {aka ‘long unsigned int’} [-fpermissive]
   10 |         snprintf(buf, "%s", source);
      |                       ^~~~
      |                       |
      |                       const char*
In file included from g.cc:1:
/usr/include/stdio.h:378:51: note:   initializing argument 2 of ‘int snprintf(char*, size_t, const char*, ...)378 | extern int snprintf (char *__restrict __s, size_t __maxlen,
      |                                            ~~~~~~~^~~~~~~~
g.cc:10:17: warning: format not a string literal and no format arguments [-Wformat-security]
   10 |         snprintf(buf, "%s", source);
      |         ~~~~~~~~^~~~~~~~~~~~~~~~~~~
syrius@AI-MACHINE:~ $                                                                                                             
syrius@AI-MACHINE:~ $ g++ g.cc -fpermissive                                                                                       
g.cc: In function ‘int main(int, char**)’:
g.cc:10:23: warning: invalid conversion from ‘const char*’ to ‘size_t’ {aka ‘long unsigned int’} [-fpermissive]
   10 |         snprintf(buf, "%s", source);
      |                       ^~~~
      |                       |
      |                       const char*
In file included from g.cc:1:
/usr/include/stdio.h:378:51: note:   initializing argument 2 of ‘int snprintf(char*, size_t, const char*, ...)378 | extern int snprintf (char *__restrict __s, size_t __maxlen,
      |                                            ~~~~~~~^~~~~~~~
g.cc:10:17: warning: format not a string literal and no format arguments [-Wformat-security]
   10 |         snprintf(buf, "%s", source);
      |         ~~~~~~~~^~~~~~~~~~~~~~~~~~~
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值