非安全函数

在C++中,非安全函数通常是指那些在使用时容易引发安全问题(如缓冲区溢出等)的函数。以下是一些常见的非安全函数:

字符串处理函数

  • strcpy():用于复制字符串。如果目标字符串空间不足,会导致缓冲区溢出。例如:

    char dest[10];
    char src[] = "Hello, World!";
    strcpy(dest, src);  // 目标数组dest空间只有10个字符,而src有14个字符(包括'\0'),会溢出

    安全替代:strncpy(),它可以限制复制的字符数,但需要注意的是,如果源字符串长度大于目标数组长度,strncpy()不会自动在目标字符串末尾添加空字符,可能会导致目标字符串未正确终止。

  • strcat():用于连接字符串。同样存在缓冲区溢出的风险。比如:

    char str1[10] = "Hello";
    char str2[] = " World!";
    strcat(str1, str2);  // str1长度只有10,连接str2后会溢出

    安全替代:strncat(),可以指定连接的最大字符数。

输入输出函数

  • gets():用于从标准输入读取一行字符串,不会检查目标缓冲区的大小,容易造成缓冲区溢出。例如:

    char buffer[10];
    gets(buffer);  // 用户输入超过9个字符(不包括'\0')就会溢出

    安全替代:fgets(),可以指定读取的最大字符数,包括换行符。

内存操作函数

  • memcpy():用于内存拷贝。如果目标内存空间不足,或者源地址和目标地址有重叠区域且拷贝方向不当,也会引发问题。例如:

    char arr[10] = "abcdefghij";
    memcpy(arr + 2, arr, 10);  // 源地址和目标地址有重叠,且拷贝长度超过了剩余空间,会导致未定义行为

    安全替代:memmove(),它允许源地址和目标地址有重叠区域,并且会正确处理拷贝方向。

在使用这些非安全函数时,一定要格外小心,确保目标缓冲区或内存空间足够大,避免出现安全漏洞。在现代C++编程中,推荐使用更安全的库函数或智能指针等现代C++特性来降低安全风险。

以下是一些C++安全编程的最佳实践:

使用安全函数替代非安全函数

  • 字符串处理

    • strcpy_s()替代strcpy(),前者通过要求提供目标缓冲区大小参数,防止缓冲区溢出,例如char src[] = "Hello, World!"; char dest[20]; strcpy_s(dest, sizeof(dest), src);

    • strncpy_s()替代strncpy()strncpy_s()可以指定缓冲区大小,避免溢出,如char src[] = "Hello, World!"; char dest[20]; strncpy_s(dest, sizeof(dest), src, 5); dest[5] = '\0';

    • strncat_s()替代strcat()strncat_s()要求提供目标缓冲区大小参数,防止缓冲区溢出,比如char dest[20] = "Hello"; char src[] = "World"; strncat_s(dest, sizeof(dest), src, 3);

    • sprintf_s()替代sprintf()sprintf_s()可以限制目标缓冲区大小,避免溢出。

  • 内存操作:用memmove()替代memcpy()memmove()允许源地址和目标地址有重叠区域,并且会正确处理拷贝方向,例如char arr[10] = "abcdefghij"; memmove(arr + 2, arr, 5);

使用智能指针管理动态内存

  • std::unique_ptr:提供独占式所有权的内存管理,确保一个时刻只有一个指针拥有所管理的对象,并在指针超出作用域时自动释放内存。例如std::unique_ptr<int> ptr(new int(10));,也可以使用std::make_unique<int>(10);来创建,避免使用new关键字。unique_ptr不允许复制,但可以通过std::move转移所有权,如auto ptr1 = std::make_unique<int>(10); std::unique_ptr<int> ptr2 = std::move(ptr1);unique_ptr还可以管理动态分配的数组,如std::unique_ptr<int[]> arr(new int[5]);

  • std::shared_ptr:是一种引用计数智能指针,允许多个指针拥有同一个对象,当最后一个拥有该对象的shared_ptr被销毁时,会自动释放所指向的内存。使用std::make_shared可以高效地创建一个shared_ptr实例。

  • std::weak_ptr:与shared_ptr配合使用,主要用于解决shared_ptr循环引用的问题,weak_ptr不会增加引用计数,可以用来打破潜在的循环引用,防止内存无法释放。在访问所引用的对象前必须先转换为std::shared_ptr

输入验证和过滤

  • 对所有输入数据进行类型和格式检查,确保数据符合预期的规范,利用正则表达式来验证输入数据的合法性,拒绝不符合规则的输入。

  • 在处理输入之前,对特殊字符进行转义或编码,以防止恶意用户利用这些字符来注入恶意代码,如SQL注入、跨站脚本(XSS)等。

错误处理和异常安全

  • 使用异常处理机制来处理程序错误,良好的异常处理策略有助于提高程序的健壮性和用户满意度。例如,对于可能出现除零错误的代码,可以使用try-catch块来捕获并处理异常。

  • 在使用智能指针时,尽量使用make_sharedmake_unique,不仅减少代码冗余,还可以优化内存分配性能,减少异常情况下的资源泄漏。

避免使用不安全的函数和特性

  • 不要使用system函数或任何可以执行外部命令的函数,以防止命令注入。

  • 避免混用裸指针和智能指针,智能指针的存在是为了取代裸指针的手动管理,如果混用两者,可能导致资源重复释放或泄漏。

其他注意事项

  • 设置正确的文件和目录权限,以限制未授权用户的访问内容。

  • 使用最小权限原则,即只授予用户完成工作所需的最低权限。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/2655.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【docker踩坑记录】

docker踩坑记录 踩坑记录(持续更新中.......)docker images 权限问题 踩坑记录(持续更新中…) docker images 权限问题 permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Head "http://%2Fvar%2Frun%2Fdocker.s…

本地部署Web-Check网站检测与分析利器并实现远程访问实时监测

文章目录 前言1.关于Web-Check2.功能特点3.安装Docker4.创建并启动Web-Check容器5.本地访问测试6.公网远程访问本地Web-Check7.内网穿透工具安装8.创建远程连接公网地址9.使用固定公网地址远程访问 前言 本文我们将详细介绍如何在Ubuntu系统上使用Docker部署Web-Check&#xf…

森林网络部署,工业4G路由器实现林区组网远程监控

在广袤无垠的林区&#xff0c;每一片树叶的摇曳、每一丝空气的流动&#xff0c;都关乎着生态的平衡与安宁。林区监控正以强大的力量&#xff0c;为这片绿色家园筑起一道坚固的防线。 工业 4G 路由器作为林区监控组网的守护者&#xff0c;凭借着卓越的通讯性能&#xff0c;突破…

Django框架:python web开发

1.环境搭建&#xff1a; &#xff08;a&#xff09;开发环境&#xff1a;pycharm &#xff08;b&#xff09;虚拟环境&#xff08;可有可无&#xff0c;优点&#xff1a;使用虚拟环境可以把使用的包自动生成一个文件&#xff0c;其他人需要使用时可以直接选择导入包&#xff…

vmware虚拟机配置ubuntu 18.04(20.04)静态IP地址

VMware版本 &#xff1a;VMware Workstation 17 Pro ubuntu版本&#xff1a;ubuntu-18.04.4-desktop-amd64 主机环境 win11 1. 修改 VMware虚拟网络编辑器 打开vmware&#xff0c;点击顶部的“编辑"菜单&#xff0c;打开 ”虚拟化网络编辑器“ 。 选择更改设置&#…

【Unity】unity3D 调用LoadSceneAsync 场景切换后比较暗 部门材质丢失

解决方法&#xff1a;两个场景使用同样灯光 现象 直接进入第二个场景是可以正常显示 调用LoadSceneAsync来切换后&#xff0c;第二个场景出现比较暗的情况 解决方法&#xff1a;两个场景使用同样灯光&#xff0c;在loading 的场景中加入灯光。 Light—Directional Light 如果…

R5天气识别学习笔记

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 LSTM-天气识别预测 雨天百分比数据预处理模型训练结果可视化个人总结 import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyp…

SpringMVC (1)

目录 1. 什么是Spring Web MVC 1.1 MVC的定义 1.2 什么是Spring MVC 1.3 Spring Boot 1.3.1 创建一个Spring Boot项目 1.3.2 Spring Boot和Spring MVC之间的关系 2. 学习Spring MVC 2.1 SpringBoot 启动类 2.2 建立连接 1. 什么是Spring Web MVC 1.1 MVC的定义 MVC 是…

【混合开发】CefSharp+Vue 解决Cookie问题

问题表现 使用Element-admin架构搭建Vue前端项目&#xff0c;在与CefSharp搭配时&#xff0c;出现无法使用cookie的问题。 无法将token存入cookiecookie无法被读取 如下图&#xff0c;Cookies下显示file://。 正常的Cookies显示&#xff0c;Cookies显示为http://域名&#x…

jmeter事务控制器-勾选Generate Parent Sample

1、打开jmeter工具&#xff0c;添加线程组&#xff0c;添加逻辑控制器-事务控制器 2、在事务控制器&#xff0c;勾选Generate parent sample&#xff1a;生成父样本&#xff1b;说明勾选后&#xff0c;事务控制器会作为父节点&#xff0c;其下面的请求作为子节点 3、执行&#…

【Linux】进程间通信IPC

目录 进程间通信 IPC 1. 进程间通信方式 2. 无名管道 2.1 特点 2.2 函数接口 2.3 注意事项 3. 有名管道 3.1 特点 3.2 函数接口 3.3 注意事项 3.4 有名管道和无名管道的区别 4. 信号 4.1概念 4.2信号的响应方式 4.3 信号种类 4.4 函数接口 4.4.1 信号发送和挂…

SpringMVC——原理简介

狂神SSM笔记 DispatcherServlet——SpringMVC 的核心 SpringMVC 围绕DispatcherServlet设计。 DispatcherServlet的作用是将请求分发到不同的处理器&#xff08;即不同的Servlet&#xff09;。根据请求的url&#xff0c;分配到对应的Servlet接口。 当发起请求时被前置的控制…

openssl s_server源码剥离

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

算法库里的heap算法,仿函数和模版进阶(续)

文章目录 算法库里面的heap仿函数模版非类型模版参数array特化函数模版的特化类模版的特化 分离编译 算法库里面的heap sort_heap是算法库里的函数&#xff0c;前提要求是堆才能排序is_heap判断是否是堆make_heap建堆算法 int main() {int a[5] { 10,19,27,39,19 };std::vec…

具身导航如何利用取之不尽的网络视频资源!RoomTour3D:基于几何感知的视频-指令训练调优

作者&#xff1a;Mingfei Han, Liang Ma, Kamila Zhumakhanova, Ekaterina Radionova, Jingyi Zhang, Xiaojun Chang, Xiaodan Liang, Ivan Laptev 单位&#xff1a;穆罕默德本扎耶德人工智能大学计算机视觉系&#xff0c;中山大学深圳校区&#xff0c;悉尼科技大学ReLER实验室…

解决报错:未定义标识符 “M_PI“

问题&#xff1a; 使用C编译&#xff0c;已经用#include <cmath>包含了头文件&#xff0c;但是在使用M_PI时依旧报错说未定义 原因&#xff1a; 在某些编译器中&#xff0c;<cmath> 库中的 M_PI 是一个条件宏&#xff0c;需要 _USE_MATH_DEFINES 宏被定义才能使用。…

TensorFlow深度学习实战(5)——神经网络性能优化技术详解

TensorFlow深度学习实战&#xff08;5&#xff09;——神经网络性能优化技术详解 0. 前言1. 识别 MNIST 手写数字1.1 MNIST 数据集1.2 独热编码1.3 定义神经网络1.4 训练神经网络 2. 构建深度神经网络3. 添加 Dropout 提高模型泛化能力4. 不同优化器对模型性能的影响5. 训练 ep…

代码随想录算法训练营day31

代码随想录算法训练营 —day31 文章目录 代码随想录算法训练营前言一、 56. 合并区间二、738. 单调递增的数字三、968.监控二叉树总结 前言 今天是算法营的第31天&#xff0c;希望自己能够坚持下来&#xff01; 今日任务&#xff1a; ● 56. 合并区间 ● 738.单调递增的数字 …

通过maven命令上传jar包至nexus v3.7.1

1 nexus和maven的简介 1.1 nexus ‌Nexus‌是由Sonatype公司开发的一款强大的制品仓库管理软件&#xff0c;主要用于搭建和管理各种类型的仓库&#xff0c;包括Maven、NuGet、npm等。Nexus支持多种仓库类型&#xff0c;如代理仓库&#xff08;代理互联网中的中央仓库&#xf…

level(三) filterblock

filterblock用于确定某个key是否存在于某个datablock中&#xff0c;在插入一个key到datablock中时也会插入一个key到filterblock中&#xff0c;filterblock中会记录所有的key&#xff0c;并通过布隆过滤器来确定一个key是否存于这个datablock中。下面来看下filterblock的代码&a…