CWE-365:(Switch条件竞争)

探讨了在switch语句中修改切换变量可能导致的意外行为及内存损坏问题,特别是在贯穿样式case语句中。文章提供了示例代码,展示了如何在时间变化下,导致预期逻辑改变,最终选择错误的case,以及如何通过锁定变量来解决这一问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 ID: 365

类型:基础
结构:简单

状态:草稿

描述

代码包含switch语句,在该语句中,可以在开关仍在执行时修改切换变量,从而导致意外行为。

扩展描述

这个问题在涉及贯穿样式的case语句的switch语句的情况下尤其重要,即那些不以break结尾的语句。如果开关测试的变量在执行过程中发生变化,这可能会极大地改变开关的预期逻辑,从而使进程处于矛盾状态,在某些情况下甚至可能导致内存损坏。

相关视图

与“研究层面”视图(CWE-1000)相关

与“开发层面”视图(CWE-699)相关

引入模式

阶段

说明

实现

 

应用平台

语言

C (出现的可能性不确定)

C++ (出现的可能性不确定)

Java (出现的可能性不确定)

C# (出现的可能性不确定)

后果

 

范围

冲击

可能性

完整性
其它

技术冲击: 改变执行逻辑; 未预期的结果

这种弱点可能导致意外的系统状态,从而导致不可预测的行为。

 

被利用的可能性:

一般

示例

例1

这个例子有一个switch语句,它根据当前时间执行不同的代码。

(问题代码)

Example Language:

#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

SFP Secondary Cluster: Missing Lock

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值