脏数据的来源包括垃圾值(未初始化),脏读脏写(并发),非法内存访问,野指针,外部数据污染,业务逻辑错误(比如负数写给年龄的情况)这些情况,导致运行周期内数据无效或者一致性被破坏。
脏数据给代码带来的风险是运行崩溃,伪正常,逻辑错误。
-
伪正常的情况是指代码运行正常但是这种正常依赖当前的运行环境。这种伪正常的状态如果在后续使用过程中,会呈现一种随机性的代码崩溃状态,且每次报错信息与问题根源脱节,调试难。
因此代码强调:
-
初始化所有变量,并发场景必用同步/原子类型。
-
对于核心数据,封装成“校验+读写”的函数,而非裸操作。
-
编译/运行期间检测的指令(未初始化警告;野指针/越界访问警告;数据竞争检测)
-
程序崩溃事后,可以通过保留崩溃现场,测试环境压测,追溯数据被篡改轨迹,将随机初始化的数值替换为固定无效值,让伪正常的巧合失效等方式进行调试。
-
(所以是不是好的编码习惯会在创建变量时就直接初始化?什么情况下可以不初始化?)
是的。几乎不存在“必须不初始化”的情况。**好的编程习惯是在数据创建时就初始化。** -
(什么是并发脏读脏写?)
并发场景是指**多个线程同时访问同一份共享数据**,需要通过同步机制或原子类型保证数据操作不被打断。- 原子类型 std::stomic,使操作不可被中断,要么完全执行要么完全不执行,是轻量级处理方案。
- 同步机制是加锁,这里可能会涉及互斥锁,是重量级的通用方案。
-
用工具可以检测潜在的脏数据问题。分为静态分析工具,动态检测工具,以及自定义数据校验和事后调试。
C++的静态分析是处理语法逻辑;FPGA的静态分析是分析硬件可实现性与物理约束。
-