“锟斤拷,烫烫烫,屯屯屯”的由来

news2024/11/24 16:05:52

在程序开发过程中,调试是不可或缺的一环。调试不仅可以帮助开发者发现错误,还能提供程序运行时的内部状态信息。然而,在调试过程中,开发者有时会遇到一些奇怪的字符。这些乱码通常是由内存状态的特殊标记,或者字符集不匹配导致的。在本文中,我们将探讨这些乱码的由来,以及它们在程序开发中的含义。

内存调试与特殊填充值

在Visual Studio(MSVC)和Clang等编译器中,为了帮助开发者发现和调试内存使用错误,编译器和运行时库会使用特殊的填充值(也称为幻数,Magic Numbers)来标记未初始化的内存、新分配的堆内存以及已经释放的内存。这些填充值有助于识别内存损坏和使用未初始化的变量等问题。

MSVC的内存填充值

在Microsoft Visual C++ (MSVC) 编译器中,Debug模式下会使用以下填充值来标识内存状态:

  1. 未初始化的栈内存:通常填充为 0xCC。在x86架构的汇编中,0xCC 对应的指令是 INT 3,它是一个软件中断指令,常用于调试断点。如果代码尝试执行这部分内存,程序会因为触发了断点而停止。

  2. 新分配的堆内存:常被填充为 0xCD。这个值在调试器中没有特定的指令对应,但它可以帮助开发者快速识别出使用了未初始化的堆内存。新分配的但还未提交的内存页通常也填充为 0xCD

  3. 已经释放的堆内存:通常填充为 0xDD。这样做是为了标记内存已经不再有效,如果代码试图访问释放的堆内存,这个填充值可以帮助开发者发现悬挂指针(dangling pointer)问题。为了方便记忆,可以理解成DeleteDelete(DD)。

在MSVC中,我们还可以通过更细致的配置来优化调试体验:

  • _CRTDBG_MAP_ALLOC:通过定义此宏,可以使得malloc、calloc等内存分配函数映射到调试版本,从而在调试输出中提供更详细的分配信息。
  • _CRTDBG_FILL_MEMORY:在调试版本中,可以设置此宏来控制自由内存块的填充模式和值,进一步定制化内存检查策略。
  • /RTC 编译选项:使用运行时错误检查选项,如/RTC1(默认)会检测未初始化的局部变量,而/RTCc会强制所有堆和栈变量初始化。

Clang的内存填充值

Clang编译器,也会使用特殊的填充值来帮助开发者识别内存错误。AddressSanitizer是一个快速的内存错误检测器,可以检测出包括使用后释放(use-after-free)、堆栈缓冲区溢出、堆缓冲区溢出、全局缓冲区溢出、使用前初始化(use-before-init)等多种内存错误。

当使用AddressSanitizer时,Clang会对内存进行特殊的处理:

  1. 堆内存:新分配的堆内存会被初始化为特定的模式,通常是一系列的0xAB字节。而一旦堆内存被释放,它会被填充为一系列的0xEF字节。这些值有助于识别使用后释放和堆溢出错误。可以记忆成:ABCDEF,用之前是AB,用之后是EF。

  2. 栈内存:未初始化的栈变量通常会被填充为一系列的0xAB字节。这有助于发现栈变量的使用前初始化错误。

  3. 全局变量:同样,全局或静态变量会被填充为特定的字节模式,以帮助识别未初始化的使用。

AddressSanitizer还会在分配的内存块周围插入"红区"(red zones),这是一些额外的非可访问区域,用以检测缓冲区溢出错误。

需要注意的是,这些填充值和行为是AddressSanitizer的特性,并不是Clang编译器在所有编译模式下的默认行为。在不使用AddressSanitizer的情况下,Clang编译器默认并不会自动对未初始化的内存进行填充。但是,如果开启了某些特定的调试或安全特性,Clang可能会有类似的行为。

GCC的情况

GCC(GNU Compiler Collection)本身并不像MSVC那样在Debug模式下自动填充未初始化的内存。然而,当使用GCC配合特定的内存错误检测工具,如Valgrind或GCC的Sanitizers(例如AddressSanitizer, MemorySanitizer)时,会有类似的行为。

AddressSanitizer(ASan)和MemorySanitizer(MSan)是用于快速检测各种常见的内存错误和未定义行为的工具。

  • AddressSanitizer(GCC和Clang均支持):它会在堆内存分配时使用特殊的填充值,并在释放后也会标记这些内存。新分配的堆内存通常填充为 0xAB 字节,释放后的堆内存填充为 0xEF 字节。AddressSanitizer还会在分配的内存块前后插入保护区,帮助检测堆溢出和使用后释放错误。

  • Valgrind:Valgrind是一个开源的软件工具,它提供了一系列的工具用于调试内存管理和线程错误,以及分析性能。Valgrind被广泛用于发现Linux和其他类Unix系统上C和C++程序中的内存管理错误,如内存泄露、不正确的内存分配和释放、使用未初始化的内存、数组越界、不正确的使用malloc/new和free/delete等。

简而言之,GCC并不会自动在Debug构建中填充栈内存。如果需要检测对未初始化栈内存的使用,可以使用工具如Valgrind或GCC的 -finit-local-zero 选项,后者会初始化所有局部变量为零,但这会导致性能下降,不建议在生产环境中使用。

总结来说,GCC自身并不指定特定的填充值来标记未初始化的内存或者释放后的内存,而是依赖于外部工具或编译器选项来帮助开发者发现内存相关的错误。

烫烫烫,屯屯屯”的由来

由于Visual Studio调试器默认使用的是多字节字符集(MBCS),在MBCS中0xCCCC对应中文字符“烫”,因此未初始化的栈内存显示为连串的“烫”。另一方面,新分配的堆内存会被初始化为0xCD,在MBCS中0xCDCD对应的是中文字符“屯”。

锟斤拷的由来

在Unicode中,当遇到无法表示的字符时,会使用一个特殊的占位符来表示,这个字符是U+FFFD REPLACEMENT CHARACTER。任何无法识别的字符都会被替换为这个字符,其UTF-8编码是0xEFBFBD。如果连续出现多次无法显示的字符,对应的编码序列就是连续的0xEFBFBD,在UTF-8编码下16进制表示为:

0xEF 0xBF 0xBD 0XEF 0xBF 0xBD

以上这段编码,如果放到GBK中进行解码的话,因为GBK中一个下汉字两个字节,那么
结果就是:
0xEF 0xBF , 0xBD 0XEF , 0xBF 0xBD
这个结果对应的字符就是:锟(0xEFBF),斤(0xBDEF),拷(0xBFBD)。
所以,以后再见到银斤拷,第一时间想到UTF-8和GBK的转换问题准没错。
可见,“锟斤拷”这样的乱码是由于新旧编码系统转换不匹配造成的。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何通过准确预测需求来减少PMC成为“夹心饼干”的风险?

在瞬息万变的商业环境中,产品物料控制(PMC)部门时常扮演着“夹心饼干”的角色,既要满足市场快速变化的需求,又要协调供应商、生产线等多方利益。如何减少这种风险,让PMC部门从“夹心困境”中脱颖而出&#…

【Git】 -- Part1 -- 基础操作

1. Git简介 Git 是一个开源的分布式版本控制系统,由 Linus Torvalds 于 2005 年开发,主要用于源代码管理。Git 允许多名开发者共同合作处理同一个项目,跟踪每个文件的修改,并且在必要时回滚到之前的版本。 Linus Torvalds是Linux…

使用 Kubernetes 部署 MinIO 和 Trino

Trino(以前称为 Presto)是一个 SQL 查询引擎,而不是 SQL 数据库。Trino 避开了 SQL 数据库的存储组件,只专注于一件事 - 超快的 SQL 查询。Trino 只是一个查询引擎,不存储数据。相反,Trino与各种数据库交互…

怎么添加网页到桌面快捷方式?

推荐用过最棒的学习网站!https://offernow.cn 添加网页到桌面快捷方式? 很简单,仅需要两步,接下来以chrome浏览器为例。 第一步 在想要保存的网页右上角点击设置。 第二步 保存并分享-创建快捷方式,保存到桌面即可…

rancher快照备份至S3

巧用rancher的S3快照备份功能,快速实现集群复制、集群转移、完全崩溃后的极限修复 1.进入集群管理,在对应的集群菜单后,点击编辑配置 2.选择ETCD,启用,Backup Snapshots to S3选项 并填入你的minio 3 配置成功后 手…

【Linux基础IO】深入理解缓冲区

缓冲区在文件操作的过程中是比较重要的,理解缓冲区向文件刷新内容的原理可以更好的帮助我们更深层的理解操作系统内核对文件的操作。 FILE 因为IO相关函数与系统调用接口对应,并且库函数封装系统调用,所以本质上,访问文件都是通过…

怎么用二维码在线下载视频?视频用二维码下载的制作方法

怎么把视频转换成二维码之后还可以下载视频呢?现在使用二维码的方式来分享视频内容在很多行业和场景中都有应用,这种方式能够更加简单快捷的完成视频的传播分享,那么怎么让扫码者可以自由选择下载视频呢?下面来给大家分享扫码下载…

[Vulnhub] Troll FTP匿名登录+定时任务权限提升

信息收集 IP AddressPorts Opening192.168.8.104TCP:21,22,80 $ nmap -sC -sV 192.168.8.104 -p- --min-rate 1000 Nmap scan report for 192.168.8.104 (192.168.8.104) Host is up (0.0042s latency). Not shown: 65532 closed tcp ports (conn-refused) PORT STATE SER…

2024年老王磁力搜索引擎实测好用,赶快收藏一下

对于不少老司机,多多少少都不知道磁力搜索,不管是学习,还行电影、电视剧、音乐。一个好的工具可以让我们节省大量的时间,只要你想要就可以找的到。 今天整理了几个磁力搜索磁力链接资源,除老王磁力还有整理了9个好用的…

使用LangChain+Ollama自己做的一个和大语言模型聊天的网站支持上下文对话,学习记录。

0.引言 在自己学习的过程中可以自己做一个和聊天大模型对话的一个小网站,成就感不亚于人生第一次跑完10km。 1.项目介绍 前端代码:Vue3, MarkDownIT. 后端代码:Python3, Fernet库, OpenAPI, LangChain, Ollama. Ollama 本地模型的部署和管理…

【经验分享】RT600 serial boot mode测试

【经验分享】RT600 serial boot mode测试 一, 文档描述二, Serial boot mode测试2.1 evkmimxrt685_gpio_led_output 工程测试2.2 evkmimxrt685_dsp_hello_world_usart_cm33工程测试 一, 文档描述 RT600的启动模式共支持4种: 1&am…

Ubuntu系统下修改网卡IP地址

Ubuntu系统下修改网卡IP地址 一、Ubuntu系统介绍1.1 Ubuntu简介1.2 Ubuntu网络配置方式 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本 四、配置网卡IP地址4.1 备份网卡配置文件4.2 查看当前IP地址4.3 修改…

不在枯燥用第三方库简化你的编程之路

简介: Python作为一种多用途的编程语言,得益于其丰富的第三方库和框架,极大地拓展了其功能和应用领域.这些工具不仅提升了开发效率,也使得Python在各个领域展现出色的表现. 今天我们就来聊一聊Python 第三方库是由第三方开发者编写并共享的库,可用于扩展 Python 的…

【windows|006】基本分区和动态磁盘详解

🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 ​ 🏅阿里云ACE认证高级工程师 ​ 🏅阿里云开发者社区专家博主 💊交流社…

buuctf----firmware

- -一定不能再ubutu22进行,我是在18(血泪教训) binwalk安装 buuctf firmware(binwalk和firmware-mod-kit的使用)_buu firmware-CSDN博客 参考博客 指令 sudo apt-get update sudo apt-get install python3-dev python3-setuptools python3-pip zlib1g-dev libmagic-dev pi…

Mars3d实现汽车尾气粒子效果从汽车屁股开始发射效果

本身的汽车尾气粒子效果:在汽车模型的中间发射的↓↓↓↓↓↓↓↓↓↓↓ Mars3d实例中是使用transY偏移值实现汽车尾气粒子效果从汽车屁股开始发射效果: // 动态运行车辆的尾气粒子效果 function addDemoGraphic4(graphicLayer) {const fixedRoute new…

【ARMv8/v9 GIC 系列 4.2 -- GIC CPU Interface 详细介绍】

文章目录 GIC CPU Interface 介绍CPU Interface 主要寄存器 GIC CPU Interface 介绍 A 系列处理器提供 5个管脚来实现中断,分别是: nIRQ:物理普通中断nFIQ:物理快速中断nVIRQ:虚拟普通中断nVFIQ:虚拟快速…

ArcGIS定义1.5度带坐标系与投影转换

​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 点击学习——>遥感影像综合处理4大遥感软件ArcGISENVIErdaseCognition 对于ArcGIS如何定义高斯克吕格3度带、6度带,我相信大部分人都是比较清楚的&#xff0…

对红酒数据集,分别采用决策树算法和随机森林算法进行分类。

1.导入所需要的包 from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_wine from sklearn.model_selection import train_test_split 2.导入数据,并且对随机森林和决策数进…

内网安全[3]-代理Socks协议路由不出网后渗透通讯CS-MSF控制上线

1.环境 隧道技术: 隧道技术是一类网络协议,它是一种数据包封装技术,它将原始IP包(其报头包含原始发送者和最终目的地)封装在另外一个数据包(称为封装的IP包)的数据净荷中进行传输,使用隧道的原…