ID: 365 类型:基础 | 状态:草稿 |
描述
代码包含switch语句,在该语句中,可以在开关仍在执行时修改切换变量,从而导致意外行为。
扩展描述
这个问题在涉及贯穿样式的case语句的switch语句的情况下尤其重要,即那些不以break结尾的语句。如果开关测试的变量在执行过程中发生变化,这可能会极大地改变开关的预期逻辑,从而使进程处于矛盾状态,在某些情况下甚至可能导致内存损坏。
相关视图
与“研究层面”视图(CWE-1000)相关
与“开发层面”视图(CWE-699)相关
引入模式
阶段 | 说明 |
实现 |
应用平台
语言
C (出现的可能性不确定)
C++ (出现的可能性不确定)
Java (出现的可能性不确定)
C# (出现的可能性不确定)
后果
范围 | 冲击 | 可能性 |
完整性 | 技术冲击: 改变执行逻辑; 未预期的结果 这种弱点可能导致意外的系统状态,从而导致不可预测的行为。 |
被利用的可能性:
一般
示例
例1
这个例子有一个switch语句,它根据当前时间执行不同的代码。
(问题代码)
Example Language: C
#include <sys/types.h>
#include <sys/stat.h>
int main(argc,argv){
struct stat *sb;
time_t timer;
lstat("bar.sh",sb);
printf("%d\n",sb->st_ctime);
switch(sb->st_ctime % 2){
case 0: printf("One option\n");
break;
case 1: printf("another option\n");
break;
default: printf("huh\n");
break;
}
return 0;
}
似乎永远不应该达到switch语句的默认情况,因为st-utime%2应该始终为0或1。但是,如果判断第一个case时st-u-ctime%2为1,则时间可能会改变,当判断第二个case时st-u-ctime%2可能等于0。结果是案例1和案例2都不执行,并且选择了默认选项。
应对措施
阶段: 实现 可能受竞争条件影响的变量应在switch语句开始之前锁定,并且仅在语句结束之后解锁。 |
种属
关系 | 类型 | ID | 名称 |
属于 | 986 |