ID: 366 类型:基础 | 状态:草稿 |
描述
如果两个执行线程同时使用一个资源,则可能会在资源无效时使用资源,从而使执行状态未定义。
关联视图
与“研究层面”视图(CWE-1000)相关
与“开发层面”视图(CWE-699)相关
引入模式
阶段 | 说明 |
架构与设计 | |
实现 |
应用平台
语言
C (出现的可能性不确定)
C++ (出现的可能性不确定)
Java (出现的可能性不确定)
C# (出现的可能性不确定)
后果
范围 | 冲击 | 可能性 |
完整性 | 技术冲击: 修改执行逻辑; 未知状态 主要的问题是——如果一个锁被克服了——数据可能会在一个糟糕的状态下改变。 |
被利用的可能性:
一般
示例
例1
下面的例子说明了这个弱点。
(问题代码)
Example Language: C
int foo = 0;
int storenum(int num) {
static int counter = 0;
counter++;
if (num > foo) foo = num;
return foo;
}
(问题代码)
Example Language: Java
public classRace {
static int foo = 0;
public static void main() {
new Threader().start();
foo = 1;
}
public static class Threader extends Thread {
public void run() {
System.out.println(foo);
}
}
}
应对措施
阶段: 架构与设计 使用锁定功能。这是建议的解决方案。在代码周围实现某种形式的锁定机制,该机制在多线程环境中更改或读取持久性数据。 |
阶段: 架构与设计 创建资源锁定健全性检查。如果不存在固有的锁定机制,则在其他执行线程正在使用资源时,使用标志和信号来强制您自己的阻塞方案。 |
种属