文章

C++ 同namespace下的同名结构体

问题背景

  • 在同一个 namespace 下面,同名的结构体不会报错
  • 该同名结构体的数据字段不一致
  • Crash在不同平台上的情况不一样
  • Crash 堆栈是没有规律的

1. 同一个命名空间下的同名结构体不会报错

结论

同一个命名空间下的同名结构体

  • 如果一个cpp文件没有同时引用这俩个同名结构体,编译的时候是不会有任何的警告信息
  • 运行也没有任何问题

2. 同名结构体的字节数 一致vs不一致的 Crash现象

Size不一致

  • 会导致Crash
  • 内存写坏了,导致 Crash堆栈是没有规律的

Size一致

  • 不会Crash
  • 因为 Size 一致,所以没有越界访问

结论

  • 两个同名的结构体只会存在一个构造函数

3. 为什么不同平台有差异

NT IOS 编译结果 - .a静态库

在iOS内核产物中

  • 同名结构体打包的产物里面是存在两份
  • 结构体的size不一样
  • 对应的构造函数地址空间也不一样

NT Android 编译结果 - .so动态库

  • 只有一个构造函数

自动化检测策略

  • ASan 是一种基于编译器的快速检测工具,用于检测原生代码中的内存错误。 >> URL
本文由作者按照 CC BY 4.0 进行授权