加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 轻松或严格的指针安全?

发布时间:2020-12-16 07:09:29 所属栏目:百科 来源:网络整理
导读:我遇到了宽松/严格的指针安全概念,并且实现定义了实现是放松还是严格指针安全.我的问题是关于现代实施: clang和g有严格或轻松的指针安全吗? 我想澄清关于严格指针安全概念的以下事项.有一个引用(第3.7.4.3/4节): Alternatively,an implementation may hav
我遇到了宽松/严格的指针安全概念,并且实现定义了实现是放松还是严格指针安全.我的问题是关于现代实施:
clang和g有严格或轻松的指针安全吗?

我想澄清关于严格指针安全概念的以下事项.有一个引用(第3.7.4.3/4节):

Alternatively,an implementation may have strict pointer safety,in
which case a pointer value referring to an object with dynamic storage
duration that is not a safely-derived pointer value is an invalid
pointer value unless the referenced complete object has previously
been declared reachable (20.7.4).

这个限制对我来说完全不清楚.此外,我尝试用cplusplus.com example进行实验

// declare_reachable / undeclare_reachable example
#include <iostream>
#include <memory>
#include <cstdint>

int main() {
  int * p = new int (1);    // dynamic object

  std::declare_reachable(p);

  p = (int*)((std::uintptr_t)p ^ UINTPTR_MAX);  // scrambling p

  // dynamic object not reachable by any live safely-derived pointer

  p = std::undeclare_reachable((int*)((std::uintptr_t)p ^ UINTPTR_MAX));
  // p is back again a safely-derived pointer to the dynamic object

  std::cout << "p: " << *p << 'n';
  delete p;

  return 0;
}

代码甚至无法编译.

demo

解决方法

这个东西是允许垃圾收集的实现,虽然我不知道任何编译器(至少在主流)使用它.

表面上你可以找到你的用户,使用std::get_pointer_safety,但是this appears ill-supported as well.

我会说忽略它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读