当前位置: 首页 > web >正文

C语言+安全函数+非安全函数

在C语言中,许多标准库函数(如 strcpyscanfgets 等)由于缺乏边界检查,容易导致 ​缓冲区溢出(Buffer Overflow)​内存越界访问​ 等安全问题。为了解决这些问题,C11标准引入了 ​安全函数(Safe Functions)​,同时一些编译器(如MSVC、GCC)也提供了替代方案(如 _s 后缀函数或 strlcpy)。

例如,当我们将一个字符串要赋值到另一个数组中时,我们一般会使用C语言自带的strcpy函数,但是针对该函数的底层实现,仅仅只是傻瓜式的将源地址的数据存储到目的地址,不会注意缓冲区是否溢出,如果目的地址空间不够,那么相邻的地址的值会被改变,然后读取的数据不对,严重的可能会造成程序崩溃。

#include <stdio.h>
#include <string.h>int main()
{char *str = "This is a test string";char dest[10],dest2[10];printf("dest addr = %p\n", dest);printf("dest2 addr = %p\n", dest2);strcpy(dest2, str); // 溢出导致未定义行为printf("dest str: %s\n", dest);printf("dest2 str: %s\n", dest2);return 0;
}

因此,为了规避上述问题,C11标准定义了 ​边界检查接口(Bounds-checking interfaces)​,函数以 _s 后缀标识,需传递目标缓冲区大小。例如采用下面的安全函数进行赋值,那么只会赋值失败,不会有什么其他的危险

#include <stdio.h>
#include <string.h>int main()
{char *str = "This is a test string";char dest[10];printf("dest addr = %p\n", dest);if (strcpy_s(dest, sizeof(dest), str) == 0) {printf("Copied: %s\n", dest);} else {printf("Copy failed: buffer too small\n");}return 0;
}

除开上面的strcpy有安全函数外,还有其他函数也具有边界安全函数

函数作用示例
strcat_s安全拼接字符串strcat_s(dest, sizeof(dest), src)
scanf_s安全格式化输入scanf_s("%9s", buf, sizeof(buf))
memcpy_s安全内存复制memcpy_s(dest, sizeof(dest), src, n)

总体来说,安全函数的核心​:通过显式传递缓冲区大小防止溢出。而这更重要的一点就是始终检查边界、验证输入、启用编译器警告,需要让代码做到0警告,以后调用一些C语言函数时,可以先了解一下是否有安全函数,如果有就可以直接用,虽然这是一个小问题,但是会无意间增加代码的鲁棒性。

http://www.xdnf.cn/news/17990.html

相关文章:

  • imx6ull-驱动开发篇26——Linux 中断实验
  • Pytest 插件使用指南:让你的测试更高效
  • GitHub的使用教程
  • WordPress 7B2主题,在使用PHP 8.0+出现502的解决办法。
  • php危险函数,二.assert()[现版本已弃用]
  • 第十六届蓝桥杯青少组C++省赛[2025.8.9]第二部分编程题(4、矩阵圈层交错旋转)
  • MyBatis 动态数据源切换在 Spring Boot 环境下的实现方案
  • 【postgresql】一文详解postgresql中的统计模块
  • 云手机存储和本地存储的区别
  • C#WPF实战出真汁06--【系统设置】--餐桌类型设置
  • 【总结】Python多线程
  • 国内多光谱相机做得好的厂家有哪些?-多光谱相机品牌厂家
  • 硬件实现webrtc的编解码
  • 【2024前端实战综合练习】HTML+CSS+JavaScript 实现无穷可爱爱心喷射特效(含源代码解析 代码结构逻辑简析)
  • OpenCV 阈值处理
  • Flutter 以模块化方案 适配 HarmonyOS 的实现方法
  • 水环境遥感分析!R语言编程+多源遥感数据预处理;水体指数计算、水深回归分析、水温SVM预测、水质神经网络建模及科研级可视化制图
  • openwrt增加自定义网页
  • LeetCode热题100--146.LRU缓存--中等
  • 第40周——GAN入门
  • 动手学深度学习(pytorch版):第三章节—线性神经网络(4)softmax回归
  • strlen与传值传址调用
  • 设计模式(Design Patterns)
  • C++:stl-> list的模拟实现
  • 条件变量的基本介绍与有界缓冲区问题
  • 异步开发:协程、线程、Unitask
  • C语言——深入理解指针(四)
  • 获取农历日期
  • Jeecg后端经验汇总
  • strings命令和findstr命令验证iso文件中ntkrnlmp.exe系统版本