竞争问题。这种题目很少出现 但是出现了之后如果看不出来就又浪费时间又拿不到分 看出来了又很简单
常见条件竞争的形式
TOCTOU Race Condition
指程序在使用资源前会进行检查 但是程序在使用对应资源之前,资源却被修改
CWE-365 : Race Condition in Switch
执行switch语句时 switch变量的值被改变。
CWE-363 : Race Condition Enabling Link Following
文件路径名时通过传入路径间接解析,参数并不是真实地址。
文件描述符访问直接指向文件的指针。
间接性导致时间窗口的产生,如果能在检查之后到真正使用文件之前把文件修改为某个符号链接 程序就会访问错误的文件。
|
如果用fstat读取文件信息 存入到stat结构体中 就可以检查是否相同
CWE - 364 : Signal Handler Race Condition
概述:信号处理程序如果时不可重入的或者时状态敏感的,就可能利用信号处理程序的条件竞争,达到拒绝服务攻击和代码执行。
如果信号处理中执行了free,此时又来了个信号,就会再次执行free
与之有关的条件竞争情况:
- 信号处理程序和普通代码段共享全局变量和数据
- 不同的信号处理程序中共享状态
- 信号处理程序本身使用不可重入的函数
- 一个函数处理多个信号
- setjmp或者longjmp 使得信号处理程序不能返回原来的执行流
线程安全:
可以被多个线程调用,不会出现任何问题。可以是本身没有任何共享资源或者是加锁共享资源
可重用:
一个函数可以被多个实例同时运行在相同地址中。
可以被中断
单个线程执行时,重新进入同一个子程序仍然是安全的
以下情况不满足
- 函数体内使用静态数据结构
- 用了malloc或者free
- 使用IO函数
- 调用不是可重入函数
所有变量保存在调用栈的当前函数栈上
使冲突的竞争窗口相互排斥就能消除竞争条件
互斥锁
如果互斥锁已被其他线程持有,这个线程就会变成阻塞或者睡眠状态
自旋锁
一个线程不断地检查锁的状态。