【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库函数


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



  • 可重入函数如下:



自己编写函数


  • 了解了可重入函数的要求后,在编写可能涉及重入场景的函数时,需要严格按照要求来编写。
相关文章
|
1天前
|
编译器 程序员 C语言
【C语言篇】从零带你全面了解函数(包括隐式声明等)(下篇)
⼀般情况下,企业中我们写代码时候,代码可能⽐较多,不会将所有的代码都放在⼀个⽂件中;我们往往会根据程序的功能,将代码拆分放在多个⽂件中。
|
21小时前
|
C语言
【C语言】字符串及其函数速览
【C语言】字符串及其函数速览
11 4
|
1天前
|
机器学习/深度学习 C语言
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
要保持最小的步数,每一次汉诺塔问题(无论是最初还是递归过程中的),如果此时初始柱盘子数为偶数,我们第一步是把最上面的盘子移动到中转柱,如果为奇数,我们第一步则是将其移动到目标柱。
【C语言篇】递归详细介绍(基础概念习题及汉诺塔等进阶问题)
|
21小时前
|
C语言
【C语言】epoll函数
【C语言】epoll函数
8 0
|
1天前
|
C语言
【C语言篇】字符和字符串以及内存函数详细介绍与模拟实现(下篇)
perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。
|
1天前
|
存储 安全 编译器
【C语言篇】字符和字符串以及内存函数的详细介绍与模拟实现(上篇)
当然可以用scanf和printf输入输出,这里在之前【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)已经讲过了,这里就不再赘述,主要介绍只针对字符的函数.
|
1天前
|
程序员 编译器 Serverless
【C语言篇】从零带你全面了解函数(包括隐式声明等)(上篇)
函数的参数部分需要交代清楚:参数个数,每个参数的类型是什么,形参的名字叫什么。
|
1天前
|
存储 编译器 程序员
【C语言篇】C语言常见概念
编译时,注释会被替换成⼀个空格,所以min/* 这⾥是注释*/Value会变成min Value,⽽不是minValue。这是C99标准新增的语法。
|
3月前
|
存储 C语言
C 语言函数完全指南:创建、调用、参数传递、返回值解析
函数是一段代码块,只有在被调用时才会运行。 您可以将数据(称为参数)传递给函数。 函数用于执行某些操作,它们对于重用代码很重要:定义一次代码,并多次使用。
126 3
|
2月前
|
存储 C语言
C语言的函数返回值和指针
C|函数返回值(区分各类值)和指针(区分各类存储空间)的细节