【C语言安全编码之可重入函数】1、可重入函数的基本概念

简介: 【C语言安全编码之可重入函数】1、可重入函数的基本概念

本系列文章将围绕可重入函数展开,将会涉及可重入函数的概念、要求、不可重入函数的处理等,敬请各位期待。


可重入函数


定义


  • 如果计算机程序或例程在其先前的调用完成之前可以安全地再次调用,则该计算机程序或例程被称为可重入的(它可以被安全地并发执行);


  • 简而言之,可重入函数的安全的,不可重入函数是不安全的。


适用场景


  • 中断


如该函数在执行过程中,发生中断,ISR开始执行,之后恢复该函数的执行,所以可重入的函数,简单来说就是可以被中断的函数;ISR本身也应该是可重入的函数。


  • 并发


在并发服务器中,一个函数在被多个任务调用的过程中,任务在调用时不必担心数据是否会出错。


  • 递归函数


递归函数天生就会被自己打断。


满足的条件


  • 不能保存静态或全局的非常量数据;


  • 不能将地址返回给静态(或全局)非常量数据;


  • 必须只处理调用者提供给它的数据;


  • 不能依赖锁来锁定单例资源;


  • 不得修改自己的代码(除非在自己独特的线程存储中执行);


  • 不得调用不可重入的计算机程序或例程。


例子


  • 例1、非重入函数


int x;
int my_first_nonreentrant_function() {
   return x * 10;
}
int my_second_nonreentrant_function() {
   return my_function() * 20;
}


  • 例2、可重入函数


int my_first_reentrant_function(int x) {
   return x * 10;
}
int my_second_reentrant_function(int x) {
   return my_first_reentrant_function(x) * 20;
}


实际应用


C库函数


  • 有些库函数是不可重入的,使用时要格外小心,从网上找到一个表格,供参考:



  • 可重入函数如下:



自己编写函数


  • 了解了可重入函数的要求后,在编写可能涉及重入场景的函数时,需要严格按照要求来编写。
相关文章
|
2天前
|
C语言
C语言5 字符输出函数和格式输出函数
C语言5 字符输出函数和格式输出函数
6 1
|
4天前
|
算法 编译器 C语言
深入浅出C语言—【函数】下
深入浅出C语言—【函数】下
|
10天前
|
存储 Java 程序员
【C语言入门】C语言入门:探索编程世界的基础概念
【C语言入门】C语言入门:探索编程世界的基础概念
20 2
|
15天前
|
Java C语言 C++
定义C语言的int main()函数
定义C语言的int main()函数
|
17天前
|
存储 移动开发 C语言
技术心得记录:嵌入式开发中常用到的C语言库函数
技术心得记录:嵌入式开发中常用到的C语言库函数
11 1
|
2天前
|
存储 C语言
C语言6 字符串输入和格式输入函数
C语言6 字符串输入和格式输入函数
7 0
|
17天前
|
Java 程序员 Linux
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
19 0
|
17天前
|
C语言
C语言实现猜数字游戏:代码详解与函数解析
C语言实现猜数字游戏:代码详解与函数解析
12 0
|
20天前
|
C语言
【C语言基础篇】字符串处理函数(四)strcmp的介绍及模拟实现
【C语言基础篇】字符串处理函数(四)strcmp的介绍及模拟实现
|
19天前
|
C语言
C语言prinf函数
C语言prinf函数
14 4