作者: Laruence( ) 本文地址: http://www.laruence.com/2014/06/26/2955.html 转载请注明出处 本来是发在长微博的, 不过, 鉴于, 好久没更新博客了 就转过来, 凑个数吧, 大家凑合着看 白忙活了近2个小时,不吐不快: 一切要从今天下午5点左右说起, 调试一个扩展
- 作者: Laruence(
)
- 本文地址: http://www.laruence.com/2014/06/26/2955.html
- 转载请注明出处
本来是发在长微博的, 不过, 鉴于, 好久没更新博客了…… 就转过来, 凑个数吧, 大家凑合着看
白忙活了近2个小时,不吐不快:
一切要从今天下午5点左右说起, 调试一个扩展, 用valgrind(valgrind-3.8.1)做例行检查, 很不幸的valgrind报告invalid read:
db attach上去以后, 发现报告错误的地方是:
因为在PHP NG(PHP New Generation)中, 使用了新的字符串结构来保存字符串, 也就是zend_string:
而排查了半天, 我确认这个op是经过正常初始化的, 那问题出在哪里呢?
突然看到op是一个长度为1的字符串”0″, 就突然想起来, 之前我们做了个很”精细”的优化, 因为对于上面的结构体, 在64位的系统上, sizeof它, 由于padding, 实际上会得到大于8 + 8 + 4 + 1(21) 的大小(8 + 8 + 8 = 24).
所以我们不会使用一般来说的做法:
str = malloc(sizeof(str) + len + 1)
来为一个长度为len的字符串申请内存. 而是会使用类似:
str = malloc ((int)((str*)0)->val) + len + 1)
的方式来为一个字符串申请内存, 所以对于”0″, 我们实际上申请分配的内存是22bytes.
但, 又会有什么问题呢? 于是让我们再次db attach上去, disassmble下看看具体是什么原因:
恩, 问题就出在f3b5这行, GCC读取了0×10(%rdx)位置上的一个word大小的数据, %rdx此时是zend_string op的指针, 而0×10偏移是str->len. 原来是因为GCC优化很聪明的把
if (str->len == 1 && str->val[0] == '0')
优化成了和一个数据0×3000000001比较的一条指令….
于是, 如上面所说, 因为这个str只有22个bytes, 当尝试从16偏移处尝试读取8个字节的时候, 我们其实多读了str结构体外面的3个字节…… 于是就invalid read了
问题清楚了, GCC聪明的优化, 引起的一个无害的报告(and 0xffffffffff)………… 于是, 白忙活了…. (当然, 最好还是修复掉, 我现在打算的修复就是, 最小也要分配一个24bytes).
Comments
- 2014/06/28, goghcrow writes: 高大尚
- 2014/07/19, kalcaddle writes: 推荐一个php版的开源web文件管理软件KodExplorer, 可以取代ftp,方便对网站进行备份、解压缩,文件夹拖拽上传; 在线编辑器 webIDE(60多种代码高亮,自动补全) 可以体验下:http://www.kalcaddle.com/download.html 支持开源!
- 2014/08/12, t.k. writes: 看来问题的关键还是gcc认为有padding,但是这段代码的申请方式不是用普通sizeof。我想如果修改gcc的padding参数或许能在使用现有代码的基础上避免此问题。
- 2014/08/23, 23213213 writes: 34324324
- 2014/09/05, ccg writes: _zend_string结构体指定字节对齐为1 #pragma pack(1) 是否可以解决问题
- 2014/11/28, 聚能量 writes: 好博客,内容正是我需要的。
Copyright © 2010 风雪之隅 版权所有, 转载务必注明. 该Feed只供个人使用, 禁止未注明的转载或商业应用. 非法应用的, 一切法律后果自负. 如有问题, 可发E-mail至my at laruence.com.(Digital Fingerprint: 73540ba0a1738d7d07d4b6038d5615e2)

GeforceExperience不仅为您下载最新版本的游戏驱动程序,它还提供更多!最酷的事情之一是它可以根据您的系统规格优化您安装的所有游戏,为您提供最佳的游戏体验。但是一些游戏玩家报告了一个问题,即GeForceExperience没有优化他们系统上的游戏。只需执行这些简单的步骤即可在您的系统上解决此问题。修复1–为所有游戏使用最佳设置您可以设置为所有游戏使用最佳设置。1.在您的系统上打开GeForceExperience应用程序。2.GeForceExperience面

选择C语言编译器:五款最受欢迎的推荐,需要具体代码示例引言:C语言是一种广泛应用于系统开发和嵌入式设备编程的高级编程语言。无论是初学者还是有经验的程序员,选择合适的C语言编译器都是至关重要的。本文将介绍五款最受欢迎的C语言编译器,并提供具体的代码示例,以帮助读者选择适合自己需求的编译器。一、GCC编译器:GCC(GNUCompilerCollection

Debian是一种流行的Linux发行版,广泛应用于服务器和桌面系统,GCC(GNUCompilerCollection)是一款开源的编译器套件,用于编译C、C++、Fortran等多种编程语言,在Debian系统中,安装GCC及GCC10非常简单,本文将为您提供详细的安装指南。安装GCC1.打开终端(Terminal),使用以下命令更新软件包列表:```shellsudoaptupdate```2.安装GCC及其相关工具:sudoaptinstallbuild-essential这个命令将安装

因为需要用到C++11,但CentOS自带的gcc4.4.7不支持,所以决定升级gcc。操作如下:#备份mv/etc/yum.repos.d/devtools-2.repo/etc/yum.repos.d/devtools-2.repo.bakwgethttp://people.centos.org/tru/devtools-2/devtools-2.repo-O/etc/yum.repos.d/devtools-2.repoyuminstalldevtoolset-2-gccdevtoolse

关于GCC在CentOS下通过yum安装默认版本号,CentOS5是4.1.2;CentOS6是4.4.7;CentOS7是4.8.3。很多时候在编译安装软件都需要高版本的GCC,否则就会报错。那么如何升级GCC的版本呢?首先要确认升级到的GCC版本号。目前GCC的最新版已经到了5.2,而CentOS7则依然使用其4.8,所以基于兼容性考虑,我选择升级到4.8.5。GCC官网:https://gcc.gnu.org下面开始一步一步来编译安装GCC4.8.5,需要注意的是,在编译安装GCC之前,系

如果您在Windows机器上玩旧版游戏,您会很高兴知道Microsoft为它们计划了某些优化,特别是如果您在窗口模式下运行它们。该公司宣布,最近开发频道版本的内部人员现在可以利用这些功能。本质上,许多旧游戏使用“legacy-blt”演示模型在您的显示器上渲染帧。尽管DirectX12(DX12)已经利用了一种称为“翻转模型”的新演示模式,但Microsoft现在也正在向DX10和DX11游戏推出这一增强功能。迁移将改善延迟,还将为自动HDR和可变刷新率(VRR)等进一步增强打

随着互联网的不断发展和应用的扩展,越来越多的网站和应用需要处理海量的数据和实现高流量的访问。在这种背景下,对于PHP和MySQL这样的常用技术,缓存优化成为了非常必要的优化手段。本文将在介绍缓存的概念及作用的基础上,从两个方面的PHP和MySQL进行缓存优化的实现,希望能够为广大开发者提供一些帮助。一、缓存的概念及作用缓存是指将计算结果或读取数据的结果缓存到

以下是在Linux系统上安装GCC(GNUCompilerCollection)的详细教程:更新软件包列表:在终端中执行以下命令,以确保您的系统的软件包列表是最新的:sudoaptupdate安装GCC:继续在终端中执行以下命令,以安装GCC及其相关工具:sudoaptinstallbuild-essentialbuild-essential是一个包含GCC和其他构建工具的软件包,它将满足大多数基本编译需求。验证安装:安装完成后,您可以验证GCC是否成功安装。在终端中执行以下命令,检查GCC的版


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

PhpStorm 맥 버전
최신(2018.2.1) 전문 PHP 통합 개발 도구

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

뜨거운 주제



