*(易失性无符号整数 *) 的含义 0x00 = 0x00;
Meaning of *(volatile unsigned int *) 0x00 = 0x00;
以下代码行的含义是什么?
*(volatile unsigned int *) 0x00 = 0x00;
它用于断言定义:
void Assert()
{
// (some other code above)
*(volatile unsigned int *) 0x00 = 0x00;
return;
}
我可以
猜到它试图导致程序因分段错误或类似错误而崩溃。
编写代码的人都在想"我希望编译器不会优化这个崩溃,所以让我们在指针取消引用前面放一个易失性"。
但是代码所做的只是导致无法保证崩溃的未定义行为。
如果您希望程序终止,那么std::terminate()
是一个更好的选择,那么 UB Assert()
另请注意,应该为断言提供一个条件,然后如果条件为 false,断言应该触发一些失败代码。 Ot 并不意味着是"退出此程序"功能。查看链接的评论
将0x00转换为指向volatile unsigned int
的指针,然后使用运算符 *
取消引用它并写入该地址0x00。这是未定义的行为,在大多数系统上会导致崩溃。
相关文章:
- 易失性sig_atomic_t的内存安全性
- C++易失性:保证 32 位访问?
- 避免易失性和非易失性成员函数的代码重复
- 当 2 个线程共享同一物理内核时,具有错误共享的易失性增量在发布中的运行速度比在调试中慢
- 如何访问常量易失性 std::array?
- 为什么在 C++20 中弃用易失性?
- 根据 MSVC,具有易失性成员的结构不再是 POD
- 是否允许编译器优化掉局部易失性变量
- 访问共享内存而不使用易失性、std::atomic、信号量、互斥锁和自旋锁
- 如何避免对无锁程序使用易失性?
- C++:易失性实例中的易失性成员函数 - 将数组分配给指针是无效的转换?
- g++ 6.3,avx 内联函数上的 Kahan 求和用易失性关键字进行序列化
- 是什么让这种易失性打破了结构的指针算法?
- 如果不需要易失性,为什么 std::atomic 方法会提供易失性重载
- *(易失性无符号整数 *) 的含义 0x00 = 0x00;
- 使用易失性 c 字符串和 std::cout
- 易失性结构 = 结构不可能,为什么?
- 如何强制 GCC 以线性方式转换易失性内联程序集语句
- 我可以使用互斥锁或关键字(静态)代替C++中的易失性吗?
- 兼容的声明 __attribute__ ((节( ".abc.dfe" ))) 常量易失性 uint8 属性变量 = 0;- 符合MISRA标准