网易首页 > 网易号 > 正文 申请入驻

C++最危险的代码,未做准备,请勿使用。不然只会在最后害了自己

0
分享至

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

  Fred[8472] = 8743872;

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

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

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

  

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

  #include

   int main(void) { int Fred [505] = {0}; Fred[634] = 87592; printf(“ Fred [634] =%d \ n”,Fred [634]); return 0; }

  在我的系统上,即使带有沉重的警告标志,我的编译器(gcc / g ++)也会在没有错误或警告的情况下进行编译!而且它运行时没有错误或警告,并给出了预期的结果!但是源代码正在提交非法的内存访问,并命令覆盖它实际上并不拥有的内存!

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

  

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

  #include

   int main(void) { int Fred [500]; int i for(i = 0; i <100000; ++ i) { Fred [i] = i; } printf(“ Fred [34927] =%d \ n”,Fred [34927]); return 0; }

  编译字符串:

  g ++ -I / rhe / include -D PLATFORM_IS_WIN64 -Wall -Wextra -Wfloat-equal -Wshadow -Wcast-qual -Wcast-align -Wconversion -Wcomments -Wundef -Wunused-macros -Wold-style-cast -Woverloaded-virtual -finput -charset = UTF-8 -std = gnu ++ 14 -s -O2 evil-test-2.cpp -L / rhe / lib64 -L / lib -L
/ usr / lib -lm -o / rhe / bin64 / test /evil-test-2.exe

  编译器警告问题:

  evil-test-2.cpp: In function ‘int main()’: evil-test-2.cpp:9:15: warning: iteration 500 invokes undefined behavior [-Waggressive-loop-optimizations] Fred[i] = i; ~~~~~~~~^~~ evil-test-2.cpp:7:20: note: within this loop for ( i = 0 ; i < 100000 ; ++i ) ~~^~~~~~~~ evil-test-2.cpp:11:10: warning: array subscript is above array bounds [-Warray-bounds] printf("Fred[34927] = %d\n", Fred[34927]); ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  运行时结果:

  $ evil-test-2 Segmentation fault (core dumped)

  这次,编译器无法优化问题,一切都崩溃了。

  

  所以,千万不能指望总是能逃脱马虎代码!没有任何编程语言!出于各种原因,您也许可以在短期内摆脱困境(例如,如上例所示,通过编译器优化为您修复错误),但从长期来看,它会再次咬住您,以非常糟糕的方式(程序崩溃,系统崩溃,硬件损坏,数据丢失,财务损失或甚至更糟)。所以不要那样做!

  特别地,在C ++编程语言中,除非绝对需要,否则您根本不应该使用数组或指针,除非您知道自己在做什么并且正在使用仔细且频繁的边界检查。而是使用“标准模板库”(简称“ STL”)提供的“容器”,“迭代器”和“算法”。STL存在,可以使用,如果您使用C ++编写,则应大量使用它。具体来说,在C中要使用数组的大多数事物都使用“矢量”模板。对矢量对象(而不是[花括号])使用“ .at()”方法来调用自动边界检查。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐

迪丽热巴的剧为何总扑街?采访暴露问题,网友:她根本看不懂剧本

全球娱乐趣事君
2021-04-15 09:26:50

德防长质问俄军事行动,想插手乌克兰,俄网友:天然气还要不要?

票姚校尉
2021-04-15 11:57:29

原来,奉贤新城才是五大新城房价涨幅最大的区域!

易眼看房
2021-04-15 07:05:02

自然界交尾时间最长的动物是哪个?人类为什么不能像它们一样?

钟铭聊科学
2021-04-15 13:42:12

你绝对没有听说过太平天国还有这些荒唐的事

书兰娱乐厅
2021-04-13 15:34:04

双杀篮网,双杀爵士,双杀掘金,NBA最可怕的鱼腩诞生了

体育课副班长
2021-04-14 21:58:10

如果一次性缴纳6万元,每月领取1500元,你愿意这样做吗?

杂事妙谈
2021-04-15 08:24:31

张凯丽和大山是什么关系?网曝两人曾有一段甜蜜的婚姻

李森说娱乐
2021-04-15 00:49:05

数据告诉你,凌晨三点不睡觉的中国人都在搜什么?

DT财经
2021-04-14 13:27:36

连续下雨49天!被雨逼疯的长沙人民也太好笑了……

TOP旅行杂志
2021-04-15 13:35:11

迎接新海后,王思聪都膜拜的“高端玩家”,网红项思醒彻底火了

八姐论八卦
2021-04-14 23:39:20

人工智能都开始拒绝内卷了,AI狼:抓羊太累,我选择自杀

果壳
2021-04-15 00:29:05

广东:一司机因为没帮女子拿行李,被当面取消订单,网友:公主病

青色幻想听梦雨
2021-04-15 10:52:46

武侠小说告诉我们:江湖从来没有为难店小二的“人上人”

生活直通车
2021-04-15 01:01:43

特斯拉model y首台原座椅升级太空舱液晶屏触控版

专属定制财经日报
2021-04-15 10:30:06

不好意思,这是我见过的最虚荣的一群女人

当代广播站
2021-04-14 11:04:12

“老夫少妻,你是舒服了,可我怎么办呢”

无忧故事会
2021-04-12 20:21:46

误认为肩周炎,竟确诊肝癌,医生忠告:肩膀这1症状,是肝癌前兆

健康白皮书
2021-04-14 14:12:14

“全球最强护照”排行榜:日本第一,澳洲第9,中国跃升22位

五彩斑斓的世界
2021-04-15 01:38:53

姚策遗嘱内容曝光,亲生父母狼狈为奸,义工团队:一定严查真相

金牌办事员
2021-04-14 16:30:45
2021-04-15 15:29:08
编程重度爱好者
编程重度爱好者
一个喜欢C/C++的人儿
134文章数 592关注度
往期回顾 全部

科技要闻

输掉JAVA官司,买TikTok不成,甲骨文怎么了

头条要闻

雪地策马女县长升任文旅局副局长:我是网红 但没飘

头条要闻

雪地策马女县长升任文旅局副局长:我是网红 但没飘

体育要闻

淘汰红军晋级 皇马残阵闯过魔鬼赛程

娱乐要闻

张彬彬空降网易大楼 喊话景甜二搭

财经要闻

汽车要闻

3.8秒破百/续航超700公里 ZEEKR 001今晚上市

态度原创

数码
家居
教育
公开课
军事航空

数码要闻

撼迅发布RX 6900 XT红魔终极版、超频11%

家居要闻

港男月入过万只能带妻儿住7平蜗居 在洗衣机上做饭

教育要闻

莫言获颁第13个荣誉博士学位

公开课

记者卧底精神病院,震惊发现正常人不在少数

军事要闻

俯拍解放军重装部队家底:阵容强盛