C最危险的代码,未做准备,请勿使用

我认为C++中最危险的代码行是这样的:

Fred[]=;这看起来平平无奇,但是如果Fred定义为具有个元素,那么该行代码将尝试将整数写入RAM中的某个未知位置。从中得出的结果几乎可以是任何东西。

如果幸运的话,操作系统(或程序本身)将识别出已尝试进行非法的内存访问,它将在屏幕上显示一条错误消息,并且程序将终止。

如果您不走运,可以将整数写在随后执行的代码之上,几乎任何事情都可能发生。伪造的代码可能会损坏关键的操作系统文件,或者广播对某人的侮辱性侮辱。将存储在你电脑的任何东西公布在外等等。

所以不要那样做。如果您觉得必须在C或C++中使用数组,请务必仔细检查边界。无论您做什么,都不要编写这样的程序:

#includestdio.hintmain(void){intFred[]={0};Fred[]=;printf(“Fred[]=%d\n”,Fred[]);return0;}在我的系统上,即使带有沉重的警告标志,我的编译器(gcc/g++)也会在没有错误或警告的情况下进行编译!而且它运行时没有错误或警告,并给出了预期的结果!但是源代码正在提交非法的内存访问,并命令覆盖它实际上并不拥有的内存!

那么,为什么不引起编译器警告和/或运行时错误呢?因为优化!编译器看到我甚至没有接近填充数组,便默默地将“”的索引从“”更改为“0”。

但,如果几年后有人更改了程序怎么办?所做的更改可能会带来灾难性的后果,导致编译器无法进行优化:

#includecstdiointmain(void){intFred[];intifor(i=0;i;++i){Fred[i]=i;}printf(“Fred[]=%d\n”,Fred[]);return0;}编译字符串:

g++-I/rhe/include-DPLATFORM_IS_WIN64-Wall-Wextra-Wfloat-equal-Wshadow-Wcast-qual-Wcast-align-Wconversion-W


转载请注明:http://www.aierlanlan.com/rzfs/1858.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了