crash日记-- C++ 危险的c_str()

///////////////////////////////////
//author : zhxfl
//date   : 2013.4.9
//email  : [email protected]
//Adress : http://blog.sina.com.cn/s/blog_a502f1a30101jqtp.html
///////////////////////////////////

#include <iostream>
#include <cstdio>
using namespace std;

const std::string& fun()
{
    string s = "myFuntion";
    return s.c_str();
}
int main()
{
    string s = fun();
    printf("%s",s.c_str());
    return true;
}

1 c_str()是临时变量

这是我们项目中出现的一个代码,这是一个不一定崩溃的代码,这种错误可能是无意的,不错找起来就不好找了。可以先在这里说明原因,string的c_str()是一个临时变量,fun结束的时候,他是会被“清除”(实际上没有清除)掉的。也就是return s.c_str()返回的是一个无效的指针。

2 函数return的时候是先释放临时变量还是先做返回值复制。

小标题有点2B啦,弄点悬念

很显然,上述已经完整的说明的错误的主要原因,写到这里如果完了的话,这篇blog也就没有什么意义了,作 为程序员的我,还是想深入了解一个问题(如小标题)。fun在return的时候虽然是一个临时变量,但是fun的参数是string,应该会做了一次深 拷贝了,按照这样说,这个是不会出问题的(事实也是在window不出问题,用jni在android上才出现了必崩的现象)。现在我们就来回答这个问 题。

这里假设你已经搞清楚堆和栈的区别了。

这里所有东西都跟函数调用过程的栈管理有关。

1)在进入函数的时候,先把函数返回地址压入栈中(函数结束的时候就根据这个回到调用函数的地方,可以理解吧),接着程序会申请足够用的栈空间.

2)对于c_str()变量,是放在栈里面的临时变量,函数运行结束,栈空间被回收(如果你懂一点汇编,应该会知道栈是回收其实就是ebp变小而已)。函数的返回参数是放在eax里面的。这时候回到了调用函数的地方,在根据目前的eax做一次string的深拷贝,可惜拷贝的地址已经失效了。

时间: 2024-12-09 13:21:32

crash日记-- C++ 危险的c_str()的相关文章

小白日记12:kali渗透测试之服务扫描(二)-SMB扫描

SMB扫描 Server Message Block 协议.与其他标准的TCP/IP协议不同,SMB协议是一种复杂的协议,因为随着Windows计算机的开发,越来越多的功能被加入到协议中去了,很难区分哪些概念和功能应该属于Windows操作系统本身,哪些概念应该属于SMB 协议.因为该协议很复杂,所以是微软历史上出现安全问题最多的协议. 1.Nmap 最简单的方法:扫描其固定开放的端口139,445,但是无法准确判断其为windows系统 [email protected]:~# <strong

iOS runtime实用篇解决常见Crash

程序崩溃经历 其实在很早之前就想写这篇文章了,一直拖到现在. 程序崩溃经历1 我们公司做的是股票软件,但集成的是第三方的静态库(我们公司和第三方公司合作,他们提供股票的服务,我们付钱).平时开发测试的时候好好的,结果上线几天发现有崩溃的问题,其实责任大部分在我身上. 我的责任: 过分信赖文档,没进行容错处理,也就是没有对数据进行相应的判断处理. 下面附上代码,说明崩溃的原因 因第三方公司提供的数据错乱导致有时候创建字典的时候个别value为nil才导致的崩溃 //宏#define CString

小白日记18:kali渗透测试之缓冲区溢出实例(二)--Linux,穿越火线1.9.0

Linux系统下穿越火线-缓冲区溢出 原理:crossfire 1.9.0 版本接受入站 socket 连接时存在缓冲区溢出漏洞. 工具: 调试工具:edb: ###python在漏洞溢出方面的渗透测试和漏洞攻击中,具有很大的优势 实验对象:crossfire[多人在线RPG游戏] 运行平台:Kali i686 虚拟机[32位,计算机CPU位数是指地址总线位数,64位系统的寻址空间为2^64,寻址过大,难以处理,为了简化本章操作,所以选用32位] 搭建实验环境 #linux中,游戏需安装带其ga

15-5-15培训日记

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Typ

跨站脚本攻击-----为什么要过滤危险字符串

不算前言的前言 好像已经很久没有写过安全方面的文章了,所谓安全圈子里面,大家也许认为玄猫消失了,不过,我想,作为骇客的玄猫也许从来没有出现过吧.没错的,我是玄猫,如果前两年你看过<黑客X档案>或者<黑客手册>这样的民间安全杂志,那么你也许见过这个名字. 或者,很抱歉的,你的站点有时会出现过“玄猫啊玄猫……”这样的提示框或者文字,那么我很遗憾,我写的漏洞利用工具被人滥用到你的网站上了,蓝色理想里的程序员.站长想必不少,我在这里也向你道个歉. 什么是跨站脚本攻击 OK,我们就进入正文吧

全中国最穷的小伙子发财日记

一本被评价为“迎合了时代需求,直抵中国3亿草根青年神经最敏感之处”的<全中国最穷的小伙子发财日记>3月30日出版.这是一部日记体形式的小说,由曾经是落魄青年,现在成了富翁的“重庆老康”撰写,融合了重庆老康自己和周围朋友的创业经历.该书曾是天涯网热帖,此次由读客图书出版,据出版方介绍,首印即高达30万册. 重庆老康曾经落魄到快混成犀利哥了,于是他开始全面分析自己糟糕的人生,决定从身边着手,去寻找最小最近的机会,老老实实,深入一行.据出版方介绍,身无分文的重庆老康经过三年奋斗,现在拥有一家独资公司

iOS10 UIImageWriteToSavedPhotosAlbum程序奔溃crash解决办法

Xcode报错: This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this

小白日记10:kali渗透测试之端口扫描-UDP、TCP、僵尸扫描、隐蔽扫描

端口扫描 二三四层发现的目的只是为了准确发现所有活着主机IP,确定攻击面,端口扫描即发现攻击点,发现开放端口.端口对应网络服务及应用端程序,服务端程序的漏洞通过端口攻入.[所有的扫描结果,都不要完全相信] 一个端口就是一个潜在的通信通道,也就是一个入侵通道.对目标计算机进行端口扫描,能得到许多有用的信息.进行扫描的方法很多,可以是手工进行扫描,也可以用端口扫描软件进行扫描.在手工进行扫描时,需要熟悉各种命令.对命令执行后的输出进行分析.用扫描软件进行扫描时,许多扫描器软件都有分析数据的功能.通过

小白日记8:kali渗透测试之主动信息收集(二)三层发现:ping、traceroute、scapy、nmap、fping、Hping

三层发现 三层协议有:IP以及ICMP协议(internet管理协议).icmp的作用是用来实现intenet管理的,进行路径的发现,网路通信情况,或者目标主机的状态:在三层发现中主要使用icmp协议,arp协议属于二层协议,它是基于广播的,所以不可路由.而ICMP协议是可以路由的,理论上可以使用icmp协议发现全球的ip,如果没有边界防火墙(禁止icmp的探测包)进行过滤的话,对目标主机进行扫描,则会收到相应的响应,从而进行捕捉[有边界防火墙的现象比较普遍],但是三层发现的扫描速度也较二层要慢