Rust:一个不再有 C/C+的,实现安全实时软件的未来( 七 )
C++ 的类型系统不会对对象模型的生命周期进行建模,因此在运行时是无法检查释放后重引用的问题。C++ 的智能指针只是加在旧系统上的一个库,而这个库会以 Rust 中不被允许的方式滥用和误用。
下面是作者在工作中编写的一些经过简化后的代码,代码中存在误用的问题。
这段代码的作用是,通过字符串 dataCheckStrs 定义对某些数据的检查,例如一个特定范围内的值,然后再通过解析这个字符串创建一个用于检查对象的向量。
首先创建一个引用捕捉的 lambda 表达式,由 & 标识,这个智能指针(unique_ptr)指向的对象在这个 lambda 内被移动,因此是非法的。
然后用被移动的数据构建的检查填充向量,但问题是它只能完成第一步。unique_ptr 和被指向对象表示一种独自占有的关系,不能被拷贝。所以在 std::transform 的第一个循环之后,unique_ptr 很有可能被清空,官方声明是它会处于一种有效但是未知的状态,但是以作者对 Clang 的经验来看它通常会被清空。
后续使用这个空指针时会导致未定义行为,作者运行之后得到了一个空指针错误,在大多数托管系统的空指针解引用都会报这种错误,因为零内存页面通常会被保留。但当然这种情况并不会百分百发生,这种 bug 在理论上可能会被暂时搁置一段时间,然后等着你的就是程序的突然崩溃。
推荐阅读
- 雷神|原神:曾经有一个强力五星角色,却因各种“流言蜚语”,擦肩而过
- 次世代|韩国战队全军覆没,斗鱼选手实力强大,一人击溃一个队
- 手机游戏|LOL手游第一个世界赛,破晓杯火热开战,DKG能紧随EDG夺冠吗?
- xyg|月光败给XYG不敢去采访,怕主持人问他一个问题!根本没办法解释
- 卡牌|王者峡谷最难抓的五个英雄,暗信算一个,榜首玩起来非常快乐
- 传奇世界|传奇世界:盘点当年出现过哪些漏洞,有一个至今都存在?
- 扁鹊|裴擒虎虎年限定有变,嫦娥拒霜思配音引热议,扁鹊有一个好消息
- 绝地求生|不播绝地求生,跑去玩双马尾少女?PDD后又一个主播“沉迷”幻塔
- 光·遇|光遇:追光季复刻盘点,下一个返场先祖,可能是笛子或者灯泡斗篷
- 地下城与勇士|DNF:“全民云上”时代到来,一个过气小副本,究竟有何魅力?