首页 > 其他分享 >通过VS地址擦除系统定位缓冲区溢出问题

通过VS地址擦除系统定位缓冲区溢出问题

时间:2023-12-10 17:47:40浏览次数:31  
标签:nNum int 地址 VS 擦除 缓冲区 溢出

VS2019增加了一个名为“地址擦除系统”的功能,默认是关闭的,可以在项目“属性”-“c/c++”-"常规"中开启。在开启地址擦除系统”功能时,将调试信息格式设置为“程序数据库”。如下图:

如果没有该项,检查VS2019的版本是否低于16.9,并且在安装项中是否安装“C++ AddressSanitizer”。如下图:

下面用一些缓冲区溢出的例子,让编译器帮忙判断出错位置。

全局缓冲区溢出

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include <iostream>
 3 using namespace std;
 4 
 5 char sBuf[5];
 6 int main()
 7 {
 8     int nNum = 1;
 9     strcpy(sBuf, "Hello World!");
10 
11     for (int i = 1; i < 101; i++)
12         nNum += i;
13 
14     cout << "Num = " << nNum << endl;
15     getchar();
16 }

在上面代码中,定义了一个容量为5字符数组,将"Hello World!"字符串拷贝至该空间中,很明显这里发生了溢出。在不开启“地址擦除系统”功能下,能正常执行,不会有任何错误提示。如下图:

开启“地址擦除系统”功能,程序崩溃。

堆栈缓冲区溢出

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include <iostream>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int nNum = 0;
 8     char sBuf[5];
 9     strcpy(sBuf, "Hello World!");
10 
11     for (int i = 1; i < 101; i++)
12         nNum += i;
13 
14     cout << "Num = " << nNum << endl;
15     getchar();
16 }

上面代码在不开启“地址擦除系统”功能下,数据计算异常,原因是在调用strcpy函数时,溢出部分的数据写入了nNum地址中,导致nNum计算的值出错:

观察内存分布情况:

 在实际工程中,如果遇到这种问题,定位是相当复杂的。开启后,调用strcpy函数直接崩溃:

堆缓冲区溢出

堆缓冲区和上面两种差不多,就不放代码了。

 

 

标签:nNum,int,地址,VS,擦除,缓冲区,溢出
From: https://www.cnblogs.com/BroccoliFighter/p/17892954.html

相关文章

  • DMA-BUF缓冲区共享和同步【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/driver-api/dma-buf.html#DMA-BUF缓冲区共享和同步DMA-BUF子系统提供了一个框架,用于在多个设备驱动程序和子系统之间共享硬件(DMA)访问的缓冲区,并用于同步异步硬件访问。例如,drm的“prime”多GPU支持就使用了这个框架,但当然不仅限于GPU的......
  • VS2022 拿去用吧
    还是大二的时候就开始用这个,但居然是为了用PB,-_-||用了段时间换成了C#,依稀还记得大佬们纠正我的读法,别读C井,应该读C夏普。。。安装过程其实也没啥,就是关键Key得花时间找,我好不容易搞定了,留个记号(从这里默默拿走,低调使用 https://kdocs.cn/l/cixbRhgzh1pv)界面也和原来不太一样。中......
  • 循环缓冲区 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/core-api/circular-buffers.html循环缓冲区作者[email protected]@linux.ibm.comLinux提供了许多功能,可用于实现循环缓冲区。有两组这样的功能:用于确定2的幂大小缓冲区信息的便利函数。......
  • C++学习笔记一:windows系统配置C++开发环境(VS code+g++/clang++)
    1.下载vscode官网下载地址:https://code.visualstudio.com/安装时选择把软件加入到环境变量中这个选项 2.打开vscode,安装c/c++扩展插件 3.下载gcc和clang编译器下载地址:https://winlibs.com/下载后解压,把bin文件夹所在的路径加入到环境变量中加环境变量的方法:在程序......
  • VMware vCenter Server 7.0 Update 3p 下载 - 集中管理 vSphere 环境
    VMwarevCenterServer7.0Update3p下载-集中管理vSphere环境请访问原文链接:https://sysin.org/blog/vmware-vcenter-7-u3/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgVMwarevCenterServer是一款高级服务器管理软件,提供了一个集中式平台来控制vSphere......
  • linux ftp服务器vsftpd安装
    前提:一定关关闭selinux!!!,然后重启服务器安装 yum-yinstallvsftpd systemctlenablevsftpd.service systemctlstartvsftpd.service添加用户 adduserftptest passwdftptest配置文件/etc/vsftpd/vsftpd.confanonymous_enable=NOlocal_enable=YESwrite_enable=Y......
  • vs 工程添加QT Property
    右键projectname,选择unloadproject 双击工程名称,会打 【开工程名.vcxproj】文件 找到文件中的  PropertyGroupLabel="Globals"<PropertyGroupLabel="Globals"><ProjectGuid>{A639-FC7C1B}</ProjectGuid><WindowsTargetPlatformVer......
  • vscode-go语言插件,分析(三)
    goDebugConfiguration.ts配置GoDebugConfigurationProvider实现vscode.DebugConfigurationProvider接口goDebugFactory.ts调试工厂GoDebugAdapterDescriptorFactory描述工厂,实现vscode.DebugAdapterDescriptorFactory接口GoDebugAdapterTrackerFactory跟踪器,能够读取记录......
  • python项目vscode配置
    最近由pycharm切到VScode,记录一下项目的通用配置;在项目目录建一个.vscode的文件夹分别创建三个文件lunch.jsonpython运行配置settings.jsonvscode配置包括代码校验;sftp.json文件服务器配置,直接右键上传到服务器lunch.json{"version":"0.2.0","config......
  • VSCode插件开发:右键点击创建一个文件夹和相应名称的文件
    开发一个输入名称然后创建文件夹和相同文件名的文件那么首先是注册右键点击事件"contributes":{"commands":[{"command":"createuniappfile.createvuefile","title":"CreateUniappFile"}],&qu......