请选择 进入手机版 | 继续访问电脑版

专注代码检测 - 阅镜

 找回密码
 立即注册
热搜: 安装 代码
查看: 80|回复: 0

智能指针使用安全

[复制链接]

70

主题

70

帖子

230

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
230
发表于 2021-9-10 20:51:46 | 显示全部楼层 |阅读模式
在使用智能指针时,防止其和原始指针的混用,否则可能导致对象生命周期问题,例如 UAF 等安全风险。

错误例子:
  1. class Foo {
  2. public:
  3.   explicit Foo(int num) { data_ = num; };
  4.   void Function() { printf("Obj is %p, data = %d\n", this, data_); };
  5. private:
  6.   int data_;
  7. };

  8. std::unique_ptr<Foo> fool_u_ptr = nullptr;
  9. Foo* pfool_raw_ptr = nullptr;

  10. void Risk() {
  11.   fool_u_ptr = make_unique<Foo>(1);

  12.   // 从独占智能指针中获取原始指针,<Foo>(1)
  13.   pfool_raw_ptr = fool_u_ptr.get();
  14.   // 调用<Foo>(1)的函数
  15.   pfool_raw_ptr->Function();

  16.   // 独占智能指针重新赋值后会释放内存
  17.   fool_u_ptr = make_unique<Foo>(2);
  18.   // 通过原始指针操作会导致UAF,pfool_raw_ptr指向的对象已经释放
  19.   pfool_raw_ptr->Function();
  20. }


  21. // 输出:
  22. // Obj is 0000027943087B80, data = 1
  23. // Obj is 0000027943087B80, data = -572662307
复制代码


正确,通过智能指针操作:
  1. void Safe() {
  2.   fool_u_ptr = make_unique<Foo>(1);
  3.   // 调用<Foo>(1)的函数
  4.   fool_u_ptr->Function();

  5.   fool_u_ptr = make_unique<Foo>(2);
  6.   // 调用<Foo>(2)的函数
  7.   fool_u_ptr->Function();
  8. }

  9. // 输出:
  10. // Obj is 000002C7BB550830, data = 1
  11. // Obj is 000002C7BB557AF0, data = 2
复制代码


关联漏洞:
  1.   高风险-内存破坏
复制代码
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

QQ|Archiver|手机版|小黑屋| 阅镜 ( 京ICP备2020034574号 )|网站地图|网站地图点击这里给我发消息

GMT+8, 2021-10-27 01:30 , Processed in 0.263522 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表