C++ 脏数据与垃圾值

22 阅读2分钟

脏数据的来源包括垃圾值(未初始化),脏读脏写(并发),非法内存访问,野指针,外部数据污染,业务逻辑错误(比如负数写给年龄的情况)这些情况,导致运行周期内数据无效或者一致性被破坏

脏数据给代码带来的风险是运行崩溃,伪正常,逻辑错误

  • 伪正常的情况是指代码运行正常但是这种正常依赖当前的运行环境。这种伪正常的状态如果在后续使用过程中,会呈现一种随机性的代码崩溃状态,且每次报错信息与问题根源脱节,调试难。

    因此代码强调:

    • 初始化所有变量,并发场景必用同步/原子类型。

    • 对于核心数据,封装成“校验+读写”的函数,而非裸操作

    • 编译/运行期间检测的指令(未初始化警告;野指针/越界访问警告;数据竞争检测)

    • 程序崩溃事后,可以通过保留崩溃现场测试环境压测追溯数据被篡改轨迹将随机初始化的数值替换为固定无效值,让伪正常的巧合失效等方式进行调试。

    1. (所以是不是好的编码习惯会在创建变量时就直接初始化?什么情况下可以不初始化?)

       是的。几乎不存在“必须不初始化”的情况。**好的编程习惯是在数据创建时就初始化。**
      
    2. (什么是并发脏读脏写?)

      并发场景是指**多个线程同时访问同一份共享数据**,需要通过同步机制或原子类型保证数据操作不被打断。
      
      • 原子类型 std::stomic,使操作不可被中断,要么完全执行要么完全不执行,是轻量级处理方案。
      • 同步机制是加锁,这里可能会涉及互斥锁,是重量级的通用方案。
    3. 用工具可以检测潜在的脏数据问题。分为静态分析工具,动态检测工具,以及自定义数据校验和事后调试。

       C++的静态分析是处理语法逻辑;FPGA的静态分析是分析硬件可实现性与物理约束。