[导读]上篇文章分享几个实用的代码片段(第二弹)我们分享了一段代码:
上篇文章分享几个实用的代码片段(第二弹)我们分享了一段代码:
有位读者在朋友圈评论我的文章:(type * )0不是指向空地址吗?(type*)0->member不是访问非法内存了吗?为什么不会出错?
这篇文章我们就来解释这个问题。
GET_MEMBER_SIZE分析
首先,先来解释 获取结构体成员大小 这个宏定义:
// 获取结构体成员大小 #define GET_MEMBER_SIZE(type, member) sizeof(((type*)0)->member)
虽然说这里用了 ((type*)0)->member ,看起来似乎有问题?访问非法地址0地址?
其实不是的,注意这里用到了 sizeof操作符 。在C语言中,sizeof() 是一种内存容量度量函数,其字节数的计算是在 编译阶段 进行的。
C语言源程序经过编译器进行词法分析、语法分析等过程生成中间语言(object后缀的文件)编译期间会生成一个字符表和静态分配空间(如new static 全局变量)它们所需的内存空间可以计算出来放在链接库后的可执行文件中(虚拟内存即磁盘),在运行时将放在可执行文件中的偏移量加载到内存的堆中同时将局部变量加载到栈中。
所有内存的开辟只有程序运行的时候才会在物理内存中开辟,即sizeof(((type*)0)->member)的操作不是等到程序运行期间计算的,而是在编译阶段就计算了,所以GET_MEMBER_SIZE宏定义并没有访问非法内存的操作。
进一步的,我们看看上面那个代码实例中,结构体成员的字节数是不是在编译阶段计算出的,编译出汇编文件:
gcc -S member_size.c -o member_size.s
这个汇编文件我们可能不全看懂所有指令,但大概知道如下三个指令的意思我们就大概可以知道这段汇编代码的意思了。
-
leaq:加载有效地址指令,即将有效地址复制到寄存器中。
-
movl:数据传送指令。
-
call指令:将当前的 IP 或 CS和IP 压入栈中, 转移(jmp)。
可以看到,从上到下,依次会把立即数1、1、2、4、3、12放到esi寄存器中。
为什么是这些立即数?
我们编译运行一下我们的程序:
可以看到,正好就是我们需要求的结构体各成员的大小及结构体的大小,所以GET_MEMBER_SIZE(type, member)是在编译阶段起作用的。
其实,GET_MEMBER_SIZE宏定义中的0只是看做一个随意给的地址,方便求成员的大小,如果写为0容易引起误解,不妨可以写为一个任意值,比如修改为100,也是可以计算出各结构体成员的大小的。
最后,如果 ((type*)0)->member 在其它地方使用,会出现什么问题呢?自然就是这位读者所理解的:操作非法地址。会引起段错误。比如添加如下一行代码:
编译运行:
段错误的定位方法可查阅
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
2023年10月18日,中国在第三届“一带一路”国际合作高峰论坛期间发布《全球人工智能治理倡议》,围绕人工智能发展、安全、治理三方面系统阐述了人工智能治理中国方案。
关键字:
人工智能
大模型
代码
我们看到这么多的安全问题,部分原因在于我们对待安全的方式:安全性通常被认为是事后考虑的问题,是在开发结束时才添加到设备上的东西。然而,复杂的系统,尤其是嵌入式系统,有一个很大的攻击面,这让攻击者有机可乘,能够在“盔甲”上...
关键字:
代码
嵌入式系统
软件漏洞
新富人群财务需求多元发展,投顾服务迎来新机遇 上海2023年9月20日 /美通社/ -- 2023年9月19日,上海交通大学上海高级金融学院(高金)与全球领先的金融服务机构嘉信理财(Charles Schwab)联合发...
关键字:
BSP
ADVANCED
INA
代码
北京2023年9月14日 /美通社/ -- 生物医药高科技公司诺诚健华(港交所代码:09969;上交所代码:688428)今日宣布,新型蛋白酪氨酸磷酸酶SHP2变构抑制剂ICP-189联用针对表皮生长因子受体(EGFR)...
关键字:
IC
HP
代码
ARMA
上海2023年9月1日 /美通社/ -- 2023上半年,安集科技(股票代码:688019)市场拓展规划成效显现,营业收入稳健增长。 全球半导体产业挑战持续存在的情形下,安集科技秉承发扬"克难攻坚,敢打硬...
关键字:
安集科技
BSP
代码
半导体材料
国际酒店运营商升级其在线支付功能 上海2023年8月28日 /美通社/ -- 加拿大金融科技公司Nuvei Corporation(以下简称“Nuvei”或“公司”)(纳斯达克代码:NVEI)(多伦多证券交易所代码:N...
关键字:
代码
IP
SE
纳斯达克
2023年上半年收入7.459亿元 同比增长5.1% 毛利率水平上升 海外收入同比增长65.4% 香港2023年8月22日 /美通社/ -- 金邦达宝嘉控股有限公司及其附属公司(以下合称「金邦达」、「...
关键字:
数字化
代码
嵌入式软件
COM
我们经常对正在进行数字化转型的亚马逊云科技客户建议,将云迁移视为其数字化转型的一部分,数字化转型本身必须由业务成果驱动。其中治理计划的有效性决定了云迁移和数字化转型的成功与否。数字化转型中的云迁移总有结束的时候,但是如果...
关键字:
代码
数字化
云服务
广州及苏州生产基地产品均实现"出口"零突破 北京2023年8月21日 /美通社/ -- 百济神州(纳斯达克代码:BGNE;香港联交所代码:06160;上交所代码:688235)是一家全球性生物科技公...
关键字:
神州
代码
TI
PD
近年来,国内电子公司和芯片设计企业大举进攻汽车、医疗和工业等高可靠应用(mission-critical)领域,为自己找到了摆脱红海的新领域。但是高可靠应用多数都需要功能安全认证,在许多行业在诸如汽车、航空电子、医疗和工...
关键字:
代码
代码分析工具
北京2023年8月16日 /美通社/ -- 百奥赛图(北京)医药科技股份有限公司("百奥赛图",股票代码02315.HK)宣布"千鼠万抗TM"按计划实现重要里程碑进展,抗体业务板块...
关键字:
ICE
COM
GEN
代码
BlackBerry(黑莓)最大的尖端技术大会将于2023年10月17日在纽约举行 安大略省滑铁卢2023年8月3日 /美通社/ -- BlackBerry L...
关键字:
BLACKBERRY
BSP
COM
代码
近日,上海公安局普陀分局成功破获一起案件,并在程序员圈内引起了不小轰动。因为该案件涉及的金额高达1.5亿元,而这仅仅是在半年时间内的非法获利。要知道,这样的赚钱速度放在整个互联网界也都是相当炸裂的!
关键字:
代码
程序员
北京——2023年6月15日,亚马逊云科技在re:Inforce 2023全球大会上宣布,推出十多项安全新服务及功能,包括Amazon Verified Permissions正式可用、扩展Amazon Detectiv...
关键字:
机器学习
云服务
代码
IAR Embedded Workbench 9.40版本引入了与指针验证和分支目标识别(PACBTI)扩展的无缝兼容性,保护嵌入式应用程序免受各种安全攻击。
关键字:
代码
嵌入式应用程序
编译器
嵌入式系统在我们的日常生活中广泛存在,从消费类电子、医疗设备,到汽车,工业控制,航空航天等,它们的存在已经成为我们生活中不可分割的一部分。随着技术的不断进步和客户需求的增加,嵌入式系统和软件变得越来越复杂,同时产品的开发...
关键字:
代码
自动化工具
嵌入式系统
北京2023年3月10日 /美通社/ -- 生物医药高科技公司诺诚健华(上交所代码:688428;香港联交所代码:09969)今日宣布,公司自主研发的BCL2抑制剂ICP-248在中国完成首例受试者给药。 ICP-24...
关键字:
IC
BSP
代码
ARMA
以全新面貌,筑梦多品牌协同发展未来 上海2023年2月28日 /美通社/ -- 近日,骊住水科技集团携旗下德国高仪、美国美标、日本伊奈和骊住厨房共同喜迁新址,正式入驻上海浦东新区前滩国际广场,开启全新篇章。本次乔迁实现...
关键字:
数字化
MOHAN
代码
供应链
纽约和上海2023年2月10日 /美通社/ -- 北京时间2月9日,华泰国际私募股权基金(以下简称"基金")投资企业禾赛科技(以下简称"禾赛"或"公司")于纳斯...
关键字:
纳斯达克
激光雷达
自动驾驶
代码
北京2023年2月9日 /美通社/ -- 每个行业都有自身最为严苛的评价标准,音乐奖有格莱美、电影类有奥斯卡,文学界有诺贝尔,科技行业这个标准毋庸置疑给到了Gartner。每年,Gartner发布的细分行业魔力象限都成为...
关键字:
代码
应用程序
GARTNER
CREATOR