竞争问题。这种题目很少出现 但是出现了之后如果看不出来就又浪费时间又拿不到分 看出来了又很简单
常见条件竞争的形式

TOCTOU Race Condition

指程序在使用资源前会进行检查 但是程序在使用对应资源之前,资源却被修改
CWE-365 : Race Condition in Switch
执行switch语句时 switch变量的值被改变。
CWE-363 : Race Condition Enabling Link Following
文件路径名时通过传入路径间接解析,参数并不是真实地址。
文件描述符访问直接指向文件的指针。
间接性导致时间窗口的产生,如果能在检查之后到真正使用文件之前把文件修改为某个符号链接 程序就会访问错误的文件。

# include <stdio.h>
#include <unistd.h>
int main(int argc,char *argv[]){
FILE *fd;
if (access('/some_file',W_OK) == 0 ){
printf("access granted. \n");
fd = fopen("/some_file" , "wb+");
fclose(fd);
}
return 0;
}

如果用fstat读取文件信息 存入到stat结构体中 就可以检查是否相同

CWE - 364 : Signal Handler Race Condition
概述:信号处理程序如果时不可重入的或者时状态敏感的,就可能利用信号处理程序的条件竞争,达到拒绝服务攻击和代码执行。
如果信号处理中执行了free,此时又来了个信号,就会再次执行free

与之有关的条件竞争情况:

  • 信号处理程序和普通代码段共享全局变量和数据
  • 不同的信号处理程序中共享状态
  • 信号处理程序本身使用不可重入的函数
  • 一个函数处理多个信号
  • setjmp或者longjmp 使得信号处理程序不能返回原来的执行流

线程安全:
可以被多个线程调用,不会出现任何问题。可以是本身没有任何共享资源或者是加锁共享资源

可重用:
一个函数可以被多个实例同时运行在相同地址中。
可以被中断
单个线程执行时,重新进入同一个子程序仍然是安全的
以下情况不满足

  • 函数体内使用静态数据结构
  • 用了malloc或者free
  • 使用IO函数
  • 调用不是可重入函数
    所有变量保存在调用栈的当前函数栈上

使冲突的竞争窗口相互排斥就能消除竞争条件
互斥锁
如果互斥锁已被其他线程持有,这个线程就会变成阻塞或者睡眠状态
自旋锁
一个线程不断地检查锁的状态。