찾다
php教程php手册GCC优化引起的一个”问题”

作者: Laruence( ) 本文地址: http://www.laruence.com/2014/06/26/2955.html 转载请注明出处 本来是发在长微博的, 不过, 鉴于, 好久没更新博客了 就转过来, 凑个数吧, 大家凑合着看 白忙活了近2个小时,不吐不快: 一切要从今天下午5点左右说起, 调试一个扩展

  • 作者: Laruence(GCC优化引起的一个”问题” GCC优化引起的一个”问题” GCC优化引起的一个”问题” GCC优化引起的一个”问题”)
  • 本文地址: 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)
성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
修复:Windows 11 无法优化游戏的问题修复:Windows 11 无法优化游戏的问题Apr 30, 2023 pm 01:28 PM

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

推荐五款流行的C语言编译器推荐五款流行的C语言编译器Feb 19, 2024 pm 02:05 PM

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

Debian安装GCC及GCC10的详细指南Debian安装GCC及GCC10的详细指南Feb 10, 2024 pm 03:57 PM

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

详解CentOS6.5使用yum升级gcc的步骤详解CentOS6.5使用yum升级gcc的步骤Dec 31, 2023 am 10:59 AM

因为需要用到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

CentOS6.8下编译安装GCC详解CentOS6.8下编译安装GCC详解Jan 07, 2024 pm 04:21 PM

关于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 11 Insiders 现在对在窗口模式下运行的传统游戏进行了优化Windows 11 Insiders 现在对在窗口模式下运行的传统游戏进行了优化Apr 25, 2023 pm 04:28 PM

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

如何使用缓存优化PHP和MySQL如何使用缓存优化PHP和MySQLMay 11, 2023 am 08:52 AM

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

Linux系统安装gcc详细教程。Linux系统安装gcc详细教程。Feb 19, 2024 am 11:18 AM

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

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

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

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

PhpStorm 맥 버전

PhpStorm 맥 버전

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

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경