为什么VC经常输出烫烫烫烫烫烫烫烫

在Debug 模式下,

VC 会把未初始化的栈内存全部填成0xcc,当字符串看就是 烫烫烫烫……
会把未初始化的堆内存全部填成0xcd,当字符串看就是 屯屯屯屯……
可以让我们方便地看出那些内存没初始化

但是Release 模式下不会有这种附加动作,原来那块内存里是什么就是什么

名字      描述
0xCD   Clean Memory    申请的内存由malloc或者new完成
0xDD   Dead Memory    释放后的内存,用来检测悬垂指针
0xFD   Fence Memory    动态申请后的内存值,没有初始化。用来检测数组的下标界限
0xAB   (Allocated Block?)    使用LocalAlloc()分配的内存 0x0DF0ADBA Bad Food     使用LocalAlloc并且参数为LMEM_FIXED,但是还没写入
0xCC    使用了/GZ选项,没有初始化的自动变量在DBGHEAP.C文件中,

Microsoft's memorymanagement functions often initialize memory with special values. The followingarticle describes frequent used variants. 
Microsoft Visual C++ Runtime library
C runtime library provides it own debug codes:

0xCD, 0xCDCDCDCD - New objects. New objects are filled with 0xCD when they areallocated.
0xFD, 0xFDFDFDFD - No-man's land memory. Extra bytes that belong to theinternal block allocated, but not the block you requested. They are placedbefore and after requested blocks and used for data bound checking.
0xDD, 0xDDDDDDDD - Freed blocks. The freed blocks kept unused in the debugheap's linked list when the _CRTDBG_DELAY_FREE_MEM_DF flag is set are currentlyfilled with 0xDD. Although in some cases you won't see magic 0xDDDDDDDD value,as it will be overwritten by another debug function (e.g. 0xFEEEFEEE forHeapFree).

These constants are defined in DbgHeap.c file as


static unsigned char _bNoMansLandFill = 0xFD; /* fill no-man's land with this*/
static unsigned char _bDeadLandFill = 0xDD; /* fill free objects with this */
static unsigned char _bCleanLandFill = 0xCD; /* fill new objects with this */



Compiler initialisations
0xCC, 0xCCCCCCCC - The /GX Microsoft Visual C++ compiler option initialises alllocal variables not explicitly initialised by the program. It fills all memoryused by these variables with 0xCC, 0xCCCCCCCC. 

Windows NT memory codes
0xABABABAB - Memory following a block allocated by LocalAlloc(). 
0xBAADF00D - "Bad Food". This is memory allocated via LocalAlloc(LMEM_FIXED, ... ). It is memory that has been allocated but not yet written to.
0xFEEEFEEE - OS fill heap memory, which was marked for usage, but wasn'tallocated by HeapAlloc() or LocalAlloc(). Or that memory just has been freed byHeapFree().

好了,现在来解释一下标题。

未初始化的变量会被系统赋初值为0xCC,超过了ASCII码0-127这个范围,因此这个“字符串”被系统当成了宽字符组成的字符串,即两个字节数据组成一个字符,而0xCCCC表示的宽字符正好是乱码中的那个“烫”字。

 

  烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫
  是debug中未初始化的栈变量
  屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯
  是debug中未初始化的堆变量

举个例子:

  

1
2
3
4
5
int main(void
    char x[4]; 
    return 0; 

 

  

用断点查看X的值,可以发现,“烫烫”出现了:

x 0x0012ff60 "烫烫烫烫?" char [4]

查看反汇编:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  1: int main(void
     2: { 
004113A0 55               push        ebp   
004113A1 8B EC            mov         ebp,esp  
004113A3 81 EC CC 00 00 00 sub         esp,0CCh  
004113A9 53               push        ebx   
004113AA 56               push        esi   
004113AB 57               push        edi   
004113AC 8D BD 34 FF FF FF lea         edi,[ebp-0CCh]  
004113B2 B9 33 00 00 00   mov         ecx,33h  
004113B7 B8 CC CC CC CC   mov         eax,0CCCCCCCCh  
004113BC F3 AB            rep stos    dword ptr es:[edi]  
     3:     char x[4]; 
     4:     return 0; 
004113BE 33 C0            xor         eax,eax  
     5: }

  

简单解释一下关键句的含义:

004113AC 8D BD 34 FF FF FF lea         edi,[ebp-0CCh]

将获得的0CCh大小的栈空间首地址赋给edi

004113B2 B9 33 00 00 00   mov         ecx,33h

rep的循环次数为33h
004113B7 B8 CC CC CC CC   mov         eax,0CCCCCCCCh

eax = 0CCCCCCCCh 
004113BC F3 AB            rep stos    dword ptr es:[edi]

将栈空间的33H个双字节赋值为0CCCCCCCCh

而0xcccc用汉语表示刚好就是“烫”

oxcc正好是中断int 3的指令 起到保护作用

 

 

 


==============================================================================
本文转自被遗忘的博客园博客,原文链接:http://www.cnblogs.com/rollenholt/archive/2012/05/07/2487160.html,如需转载请自行联系原作者

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

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

相关文章

代码评审会议_如何将电话会议(和访问代码)另存为联系人

代码评审会议Dialing a conference call doesn’t have to be a tedious process. Your iPhone or Android phone can automatically dial into the call and enter a confirmation code for you. You just have to create a special type of contact. 拨打电话会议不一定是一个…

Vuex使用总结

Vuex综合使用一、仓库1.主仓库2.子仓库二、使用1.全局(index.js和未开启命名空间的子仓库)2.子仓库(子仓库定义了namespaced: true),仓库名:home3.使用strict严格模式(建议)三、批量…

好未来提前批

好未来提前批(注:转载于牛客网) 一面(25minutes) 1.创建对象的几种方式2.Jsp九大隐式对象3.自己封装的持久层框架用过么4.Spring ioc让你实现怎么实现呢(工厂反射,我半年前写过,忘记了)5.Aop的实…

Nginx服务学习(6)-日志模块

日志模块的说明 日志的默认路径:error_log /var/log/nginx/error.log warn; warn是指日志的等级,一般有debug, info, notice, warn, error, crit。access_log /var/log/nginx/access.log main; main是指访问日志记录的格式信息,在…

vue mock模拟后台接口数据

vue mock一、Json server二、Mock 服务1.安装2.创建 Mock3.main.js引入4.组件中axure请求一、Json server 轻量级,将已有的json文件跑在服务器上供前端调用 npm install -g json-server 启动JSON数据服务器: json-server --watch json文件名 或 json-se…

个人站立会议-----20181216

继续阅读测量程序设计这本书,并根据测量平差基础中的知识编写多个已知点水准网的间接平差,结果总是差些,询问过老师之后,才知道在程序中要增加检索闭合欢或闭合线段的条件,正在改进中 转载于:https://www.cnblogs.com/…

使用iOS 4越狱iPhone或iPod Touch

In case you haven’t heard the news over the past couple of days, there is now an incredibly easy way to jailbreak your iPod Touch or iPhone running iOS 4. Here we will take a look at how easy the process is. 如果您在过去的几天里没有听到这个消息&#xff0c…

[转] 深入理解React 组件状态(State)

React 的核心思想是组件化的思想,应用由组件搭建而成,而组件中最重要的概念是State(状态),State是一个组件的UI数据模型,是组件渲染时的数据依据。 一. 如何定义State 定义一个合适的State,是正…

vue-router query,parmas,meta传参

1.query,显示在导航栏?后,相当于get请求传参 this.router.push({path:/login,query:{ redirect:/home}}) this.router.push({name:Login,query:{ redirect:/home}})2.parmas,不会显示,相当于post请求传参,…

Keras 获取中间某一层输出

1.使用函数模型API,新建一个model,将输入和输出定义为原来的model的输入和想要的那一层的输出,然后重新进行predict. 1 #codingutf-82 import seaborn as sbn3 import pylab as plt4 import theano5 from keras.models import Sequential6 fr…

在Windows 7中禁用或修改Aero Peek的“延迟时间”

Are you looking for an easy way to modify the “delay time” for Aero Peek in Windows 7 or perhaps want to disable the feature altogether? Then see how simple it is to do either with the Desktop Peek Tweak. 您是否正在寻找一种简便的方法来修改Windows 7中Aer…

php内核分析(六)-opcode

这里阅读的php版本为PHP-7.1.0 RC3,阅读代码的平台为linux 查看opcode php是先把源码解析成opcode,然后再把opcode传递给zend_vm进行执行的。 // 一个opcode的结构 struct _zend_op {const void *handler; // opcode对应的执行函数,每个opcod…

vue 监听路由变化

一.watch监听$route($router的对象) // 监听,当路由发生变化的时候执行 watch:{$route(to,from){console.log(to.path);} },// 监听,当路由发生变化的时候执行 watch: {$route: {handler: function(val, oldVal){console.log(val);},// 深度观察监听dee…

音频剪切_音频编辑入门指南:剪切,修剪和排列

音频剪切Audacity novices often start with lofty project ideas, but sometimes they lack the basics. Knowing how to cut and trim tracks is basic audio editing and is a fundamental starting point for making more elaborate arrangements. 大胆的新手通常从崇高的项…

Mybatis自定义SQL拦截器

本博客介绍的是继承Mybatis提供的Interface接口,自定义拦截器,然后将项目中的sql拦截一下,打印到控制台。 先自定义一个拦截器 package com.muses.taoshop.common.core.database.config;import org.apache.commons.lang3.StringUtils; import…

搭建spring boot环境并测试一个controller

Idea搭建spring boot环境一、新建项目二、起步依赖三、编写SpringBoot引导类四、编写Controller五、热部署一、新建项目 1.新建project 2.选择SpringInitializr,选择jdk,没有则需要下载并配置(若选择Maven工程则需要自己添加pom.xml所需依赖坐标和Java…

音频噪声抑制_音频编辑入门指南:基本噪声消除

音频噪声抑制Laying down some vocals? Starting your own podcast? Here’s how to remove noise from a messy audio track in Audacity quickly and easily. 放下人声? 开始自己的播客? 这是在Audacity中快速轻松地消除杂乱音轨中噪声的方法。 Th…

Dubbo集群容错

转自dubbo官网文档http://dubbo.apache.org/zh-cn/blog/dubbo-cluster-error-handling.html Design For failure 在分布式系统中,集群某个某些节点出现问题是大概率事件,因此在设计分布式RPC框架的过程中,必须要把失败作为设计的一等公民来对…

Linux基础(day53)

2019独角兽企业重金招聘Python工程师标准>>> 12.21 php-fpm的pool php-fpm的pool目录概要 vim /usr/local/php/etc/php-fpm.conf//在[global]部分增加include etc/php-fpm.d/*.confmkdir /usr/local/php/etc/php-fpm.d/cd /usr/local/php/etc/php-fpm.d/vim www.co…

Mysql+Navicat for Mysql

一、mysql 1.下载安装 Mysql官网下载地址 下载后解压 .zip (或安装.msi) 2.可加入全局变量mysqld (可选) 我的电脑->属性->高级->环境变量->Path(系统变量),添加mysql下的bin目录,如 D:\Pr…