C/C++

指针别名警告实例

问题分析

  • 原因由于强制类型转换导致出现的warning
  • GCC 4 编译警告:warning: dereferencing type-punned pointer will break strict-aliasing rules
  • 有一个指针用作了不同的类型,编译器告诉你如果坚持这样做,它不能做编译优化
#include <iostream>
int main() {
  void *p = nullptr;
  float f = 0.01;
  *(float *)(&p) = f; //warning pointer aliasing
  std::cout << "p = " << p << std::endl;

  float f2 = *(float *)(&p);
  std::cout << "f2 = " << f2 << std::endl;
}

消除warning方法小结

  • 给相关类型加上attribute((may_alias))。
  • 加编译选项,不进行严格检查 。-fstrict-aliasing 和 -Wstrict-aliasing
  • void * 作为中间变量
struct ParaType{
    int age;
    bool gender;
    ...
};
//关键代码如下
char my_para[128];
void * tmp_ptr = my_para;
ParaType* my_para = reinterpret_cast<ParaType*>(tmp_ptr);
/* 
* 作者:magicstone
* 链接:https://www.zhihu.com/question/19707376/answer/292424346
* 来源:知乎
* 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/
  • 最终使用memcpy 替换 强制转换,达到相同的目的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注