如果调用约定不匹配,会发生什么?|天天快播报

2023-02-22 20:02:45 来源: 漫漫开发路

蝎子

信不信由你,调用约定不匹配是程序经常出问题的原因之一。当你的程序代码中出现不相匹配的调动约定的时候,编译器会”大吼大叫”,但是懒惰的程序员只会在其中进行强制转换,以使编译器”尽快闭嘴”。

结果是:Windows不得不永远支持你编写的错误代码。


(资料图片仅供参考)

Windows窗口过程

有很多人会错误地声明了Windows窗口过程(通常是将它声明为__cdecl,而不是__stdcall),因为这个原因,我们分发消息给窗口过程的函数添加了额外的保护,这样它就可以检测到错误的函数声明,并执行适当的修复。

这是你为什么在堆栈上经常会看到神秘的0xdcbaabcd的原因。向窗口过程分发消息的函数会检查这个值是否在堆栈中的正确位置。如果不是,那么它会检查窗口过程是否从堆栈中弹出了一个多余的双字(如果是这样的话,它将尝试修复堆栈),或者窗口过程是否错误地声明为__cdecl而不是__stdcall(如果是这样的话,它将参数从窗口过程的堆栈中弹出)。

DirectX回调函数

在DirectX库中大量地使用了回调函数,并且人们再次将其回调函数声明为__cdecl,而不是__stdcall。因此DirectX枚举器必须对这些错误声明的函数进行特殊的堆栈清理。(真难啊…)

IShellFolder::CreateViewObject

我记得,曾经这么一个程序,它错误地声明了一个名为CreateViewWindow的函数,并且开发者设法以某种方式欺骗了编译器以接受它。如下图所示:

他们不仅错误地声明了函数签名,而且在函数的内部,即使函数没有成功完成,它也返回了S_OK。调用此函数后,我不得不添加额外的代码来清理堆栈,并确认它的返回值是不是正确的。

Rundll32.exe入口点函数

在Microsoft的知识库文章中,介绍了rundll32.exe调用的函数所需要的函数签名。但这并没有阻止人们使用rundll32调用那些并非由rundll32设计的随机函数,例如user32模块里的LockWorkStation或ExitWindowsEx。

下面,就让我们来看看,如果使用rundll32.exe调用ExitWindowsEx之类的函数时,会发生什么情况。

rundll32.exe会解析其命令行,并假定函数的编写方式如下:

void CALLBACK ExitWindowsEx(HWND hwnd, HINSTANCE hinst,LPSTR pszCmdLine, int nCmdShow);

但是,实际的ExitWindowsEx的函数原型是这样的:

BOOL WINAPI ExitWindowsEx(UINT uFlags, DWORD dwReserved);

接下来会发生什么呢?

当进入ExitWindowsEx函数时,堆栈看起来像这样:

但是,函数希望看到堆栈是这样的:

会发生什么?

rundll32.exe传递的hwnd窗口句柄,会被误认为是uFlags,而hinst会误认为为dwReserved。由于窗口句柄是随机的,因此最终会将这个随机标志传递给ExitWindowsEx。也许今天是EWX_LOGOFF,明天是EWX_FORCE,下次是EWX_POWEROFF。

现在假设该函数设法返回。(例如,函数执行失败)。ExitWindowsEx函数清除堆栈中的两个参数,而不知道它已传递给四个参数。生成的堆栈是这样的:

现在堆栈的数据已经被破坏了,真正有趣的事情即将发生。

例如,假设上图中的”.. rest of the stack ..”里保存的是一个返回地址。好了,原始代码将执行”返回”指令以通过该返回地址返回,但是在堆栈被破坏的情况下,”返回”指令将返回命令行并尝试像执行代码一样尝试执行它。

Random custom functions

开发者可能会将一个函数导出为__cdecl,但将其视为__stdcall。这似乎可行,但是返回时,堆栈将被破坏(因为调用者期望使用__stdcall函数来清理堆栈,但是得到的却是无法使用的__cdecl函数)。

好的,我们已经举了这么多的例子了。我想你应该可以明白我想表达的要点了,下面是一些你肯定会问的问题。

为什么编译器不能捕获这些错误呢?

编译器确实这样做了。(不是上面的那个rundll32例子啊)

但是人们似乎已经习惯了只使用强制转换来关闭编译器的警告。

我们看看下面的函数原型:

LRESULT CALLBACK DlgProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);

上面的函数原型是错误的,正确的版本请看下面:

INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg,WPARAM wParam, LPARAM lParam);

如果你这样调用:

DialogBox(hInst, MAKEINTRESOURCE(IDD_CONTROLS_DLG), hWnd, DlgProc);

编译器会马上发出如下的编译器错误信息:

error C2664: ‘DialogBoxParamA’ : cannot convert parameter 4 from ‘LRESULT (HWND,UINT,WPARAM,LPARAM)’ to ‘DLGPROC’.

然后,你想懒惰一下,使用下面的强制转换来关闭错误信息:

DialogBox(hInst, MAKEINTRESOURCE(IDD_CONTROLS_DLG), hWnd, reinterpret_cast(DlgProc));

“噢,拜托,谁会这么愚蠢,会在没有实际修复代码错误的情况下,仅仅是加入强制类型转换来以使编译错误消失?”

看来,大部分人都会这样做。

在网络上,我还看到了很多开发者犯了这样的错误,这里就不一一列举了。

带有这些错误的程序代码是如何工作的?

当然,这些程序在某种程度上可以正常工作,要不然使用者肯定会注意到并要求开发者修复这个错误。

但是,程序如何在被破坏的堆栈中生存呢?(这个问题我后面会回答)

总结

强制类型转换,不应该出现在任何一个完美代码主义者的字典里。

但,没它,还真不行。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。

本文来自:《What can go wrong when you mismatch the calling convention?》

标签:

如果调用约定不匹配,会发生什么?|天天快播报

蝎子信不信由你,调用约定不匹配是程序经常出问题的原因之一。当你的程序代码中出现不相匹配的调动约定...

02-22 20:02:45

【全球报资讯】向日葵什么时候开花 向日葵花期是几月

向日葵的开花期是每一年的七月到八月。解析1向日葵的开花期是每一年的七月到八月,可以绽放1个月左右,...

02-22 18:23:05

天天快资讯:【开学季】大庆市公安局肇州县局扎实开展“护学岗”工作

【开学季】大庆市公安局肇州县局扎实开展“护学岗”工作

02-22 17:04:25

【世界时快讯】如何构建路由表

你需要的东西(1)1 8英寸胶合板,3x2英尺建筑铅笔卷尺拼图(2)1英尺的木屑,3 8英寸厚(2)1

02-22 15:41:40

涨停雷达:造纸个股异动 五洲特纸触及涨停 每日热门

今日走势:五洲特纸今日触及涨停板,该股近一年涨停5次。  异动原因揭秘:1、据纸引未来网,五洲特种...

02-22 13:29:27

特斯拉 4D 毫米波雷达或即将量产上车 这只概念股一度暴涨 70%_今日精选

《科创板日报》2月22日讯(编辑邱思雨)当地时间周二,4D成像毫米波雷达供应商ArbeRobotics(ARBE US)...

02-22 11:07:42

铜还有上涨空间吗?-焦点观察

隔夜伦铜继续上涨,沪铜突破70000关口。宏观情绪回暖,临近两会,市场一片欣欣向荣的景象。海外挤仓情绪...

02-22 09:25:31

环球微资讯!八一钢铁:融资净买入2575.39万元,融资余额1.92亿元(02-21)

2023年2月21日八一钢铁融资净买入2575 39万元,融资余额1 92亿元

02-22 07:20:46

今日热搜:2023年度海军大学生选拔飞行学员报名时间规定

2023年度海军大学生选拔飞行学员报名时间规定推荐报名(2月底前)。通过海军招飞网下载填报《海军招收飞行...

02-22 02:58:25

湛江市科学技术局_关于湛江市科学技术局介绍

1、根据广东省机构编制委员会《关于印发湛江市人民政府机构改革方案的通知》(粤机编〔2009〕18号)精神...

02-21 22:49:31

龙虎榜 | 金发拉比今日跌8.06%,上榜营业部席位合计净卖出1174.39万元 当前头条

2月21日,金发拉比今日跌06%,龙虎榜数据显示,上榜营业部席位全天成交48亿元,占当日总成交金额比例为1...

02-21 19:51:35

西游记二郎神简介20字_西游记二郎神简介

1、三尖两刃刀一种类似于大刀但又结合枪特点的一种兵器。本文分享完毕,希望对大家有所帮助。

02-21 17:51:23

环球微头条丨白城市县两级公安机关 集中销毁一批危爆物品

白城市县两级公安机关集中销毁一批危爆物品,白城市,治安,白城市公安局,公安

02-21 16:10:19

春天的图画简单又漂亮 简笔画_春天的图画简单又漂亮 天天快看

1、我们准备好了画图用的纸和笔。先画树干,再画树干上的细枝。2、然后画一棵椭圆形的树。3、接下来,继...

02-21 14:48:37

世界看热讯:第十一届内燃机可靠性技术国际研讨会召开

2月18日至19日,第十一届内燃机可靠性技术国际研讨会在山东济南召开,大会由内燃机与动力系统全国重点实...

02-21 12:08:14

一汽解放2月21日快速上涨

以下是一汽解放在北京时间2月21日10:33分盘口异动快照:2月21日,一汽解放盘中快速上涨,5分钟内涨幅超...

02-21 10:42:33

环球精选!省十四届人大一次会议代表建议交办会在长召开

以更高标准持续推进建议办理高质量省十四届人大一次会议代表建议交办会在长召开20日,省人大常委会在长...

02-21 09:05:21

纳粹恶人_纳粹恶狼的介绍

1、第二次世界大战期间,七名平民从高度戒备的监狱成功逃脱。2、并躲藏在一个偏僻的村庄,可是,他们并...

02-21 05:56:39

暖心!南宁市住建局在招聘会上开展来邕购房租房政策咨询,助力人才安居置业|天天头条

2月18日,2023年春季全区人才交流大会在南宁国际会展中心举行,展厅内人头攒动,求职者络绎不绝,十分热...

02-21 01:06:43

天天速讯:河北省文物考古研究院2022年田野考古业务汇报会召开

看2022年河北考古新成果。

02-20 21:18:27

斗鱼一姐宣布退鱼,去上大学给家人一个交代,网友:毕竟书香门第 快资讯

关注斗鱼直播的网友都知道,斗鱼嘉年华再次临近,但是这两天的斗鱼直播平台可是相当的动乱。王者荣耀主...

02-20 18:53:44

株洲芦淞税务:严管厚爱护航青年干部“向阳生长”

“玉不琢,不成器”“千里之堤毁于蚁穴”“人非圣贤,孰能无过”……近日,国家税务总局株洲市芦淞区税...

02-20 16:53:32

社保异地缴纳和本地缴纳区别和相同点是多少 每日动态

社保异地缴纳和本地缴纳区别和相同点现在人们的保险意识越来越强,选择公司通常以五险一金来作为标准,...

02-20 14:59:01

速递!所售三明治被曝吃出带锈刀片!桃李面包回应又秒删

桃李面包吃出2厘米带锈刀片 冲上微博和抖音热搜榜。2月19日,来自辽宁鞍山的一名消费者发布视频称,...

02-20 12:22:19

天天即时:去年,河南新增客运班线公交化运营行政村1070个

2月20日,河南省政府新闻办召开“实事惠民生聚力谋出彩”系列第十场新闻发布会,省交通运输厅党组成员、...

02-20 10:40:54

东莞证券:春季躁动有望延续,关注北向资金流向、量能变化以及板块轮动 世界热消息

东莞证券2月20日指出,从市场来看,2月指数震荡反复。当前处于强经济复苏预期,但数据、政策真空期的阶...

02-20 08:51:17

联赛前22轮17场零封,巴萨创西甲历史同期零封次数纪录

联赛前22轮17场零封,巴萨创西甲历史同期零封次数纪录,西甲,巴萨,加的斯,中超联赛,巴塞罗那队,拉科鲁尼亚

02-20 06:12:00

热讯:葡萄牙语学习方法_葡萄牙语学习方法是什么

欢迎观看本篇文章,小升来为大家解答以上问题。葡萄牙语学习方法,葡萄牙语学习方法是什么很多人还不知...

02-20 01:20:45

开学后,预防流感健康提示 当前热门

点击上方蓝字关注我们冬春季是呼吸道传染病高发季节,开学后,学校和托幼机构属于人群聚集场所,由流感...

02-19 20:50:22

中国最高检:经检察监督推动执行案件1171件、涉案金额5.61亿元 世界观点

中新网北京2月19日电(记者张素)2022年,最高人民检察院与最高人民法院在全国范围内联合开展了职务犯罪案...

02-19 17:44:54

当前视讯!我的空气处理器风扇不会停止

你需要的东西螺丝刀电压表当空调机组的空气处理器鼓风机继续运行时,表明需要解决问题。当HVAC处于加热...

02-19 14:53:34

重实效 强实干 抓落实丨南国铜业强基扩能舞好崇左工业龙头

原标题:南国铜业强基扩能舞好崇左工业龙头该市各大企业以“人一之我十之”的干劲加力开新局00:33视频制...

02-19 12:00:23

全球热文:吕总把张津瑜弄到手,又把她毁了而不负责任?这也太无耻了吧?

吕总把张津瑜弄到手,又把她毁了而不负责任?这也太无耻了吧?,警花,美女,谈资,张津瑜

02-19 09:12:01

速看:科罗拉多州最好的草坪肥料

在秋季和春季中期为科罗拉多州的草坪施肥。科罗拉多州的土壤通常是粘土或沙子,并且通常缺乏有机质。科...

02-19 06:03:06

夜航惊魂-国3D_夜航惊魂_时讯

1、夜航惊魂那部iPad上的模拟开飞机的游戏是“X-Plane”。2、专业模拟飞行-X-PlaneforiPad,

02-19 00:56:56

天天热议:花坭村

1、花泥村。2、行政村。3、位于贵州省毕节市赫章县河镇乡北面。以上就是【花坭村,关于花坭村的简介】相...

02-18 20:56:42

环球即时:解冻火鸡胸肉的最快方法

解冻火鸡胸肉的最快方法。您是否曾经准备好烤火鸡胸肉却发现它仍然是冰冻的?解冻火鸡胸肉需要时间,但...

02-18 17:56:20

每日报道:巴雷特:会合理安排全明星周末 先休息一下再去训练

巴雷特:会合理安排全明星周末先休息一下再去训练,巴雷特,美国篮球,全明星周末,加拿大篮球,纽约尼克斯队...

02-18 15:12:30

马斯克谈OpenAI:它变了,变得面目全非

马斯克谈OpenAI:它变了,变得面目全非,谷歌,特斯拉,埃隆_马斯克,openai

02-18 12:08:56

如何提取葡萄籽油

你需要的东西葡萄籽筒子布细滤网手持式水分测试仪榨油机曲奇表长方形储物容器葡萄籽油用于烹饪,以及制...

02-18 10:05:33

【全球独家】旗舰手机为何偏爱一英寸大底 高像素真被抛弃了?

如今,手机影像系统被越来越多的厂商所重视,从“拍清楚画面”到“创作好照片”这看似简单的改变,实则...

02-18 06:54:08

谨言txt百度云盘下载_谨言txt_全球聚看点

1、《谨言》百度网盘txt最新全集下载:链接:提取码:c5s6《谨言》作者:来自远方文案一朝醒来,穿成高富

02-18 02:54:54

若无相欠,怎会相见_关于若无相欠,怎会相见的简介

1、《若无相欠,怎会相见》为若初文学网签约作者“南厢雁”原创作品,首发、独家签约于若初文学网。本文...

02-17 23:03:14

当前速递!也美丽半命题作文600字七年级_也美丽半命题作文600字

1、写不下,给思路平凡也美丽,可以从自然界的小花小草写起。2、写他们虽平凡却为自然增添光彩;可以写现...

02-17 20:01:03

焦点!或与宋PLUS同堂销售,比亚迪“海狮”谍照曝光

2月17日,网上曝光一组比亚迪海狮(图片)的谍照图,即为海洋生物系列的首款SUV,并预计今年上半年正式发...

02-17 18:02:04

环球速读:全国中小学生学籍信息管理系统基本信息采集表_全国中小学生学籍信息管理

1、“班级名称”在全国中小学学籍管理系统叫做“班号”。2、班号为自动生成可修改,班号命名规则是入学...

02-17 16:58:58

世界微资讯!没签合同工资被扣怎么办

一、没签合同工资被扣怎么办没签合同工资被扣的办法是向当地劳动监察部门投诉,要求其按照规定要求发放...

02-17 15:11:33

成都绕城高速充电桩位置在哪? 焦点热门

成都绕城高速充电桩位置在哪?G4202成都绕城高速绕西段绕西服务区、SA2成都第二绕城高速东段广汉停车区...

02-17 12:57:09

真好啊,能跟你聊这么多下流话题|上野千鹤子 x 汤山玲子-环球微动态

结婚率下降、生育率下降……不知从什么时候开始,曾经世俗眼中的“标准化人生模板”正逐渐远离年轻人的...

02-17 10:52:47

南极光:融资净偿还187.85万元,融资余额1.41亿元(02-16) 报道

2023年2月16日南极光融资净偿还187 85万元,融资余额1 41亿元

02-17 09:00:33

【全球报资讯】向日葵什么时候开花 向日葵花期是几月
天天快资讯:【开学季】大庆市公安局肇州县局扎实开展“护学岗”工作
【世界时快讯】如何构建路由表
涨停雷达:造纸个股异动 五洲特纸触及涨停 每日热门
特斯拉 4D 毫米波雷达或即将量产上车 这只概念股一度暴涨 70%_今日精选
铜还有上涨空间吗?-焦点观察
环球微资讯!八一钢铁:融资净买入2575.39万元,融资余额1.92亿元(02-21)
今日热搜:2023年度海军大学生选拔飞行学员报名时间规定
湛江市科学技术局_关于湛江市科学技术局介绍
龙虎榜 | 金发拉比今日跌8.06%,上榜营业部席位合计净卖出1174.39万元 当前头条
西游记二郎神简介20字_西游记二郎神简介
环球微头条丨白城市县两级公安机关 集中销毁一批危爆物品
春天的图画简单又漂亮 简笔画_春天的图画简单又漂亮 天天快看
世界看热讯:第十一届内燃机可靠性技术国际研讨会召开
一汽解放2月21日快速上涨
环球精选!省十四届人大一次会议代表建议交办会在长召开
纳粹恶人_纳粹恶狼的介绍
暖心!南宁市住建局在招聘会上开展来邕购房租房政策咨询,助力人才安居置业|天天头条
天天速讯:河北省文物考古研究院2022年田野考古业务汇报会召开
斗鱼一姐宣布退鱼,去上大学给家人一个交代,网友:毕竟书香门第 快资讯
株洲芦淞税务:严管厚爱护航青年干部“向阳生长”
社保异地缴纳和本地缴纳区别和相同点是多少 每日动态
速递!所售三明治被曝吃出带锈刀片!桃李面包回应又秒删
天天即时:去年,河南新增客运班线公交化运营行政村1070个
东莞证券:春季躁动有望延续,关注北向资金流向、量能变化以及板块轮动 世界热消息
联赛前22轮17场零封,巴萨创西甲历史同期零封次数纪录
热讯:葡萄牙语学习方法_葡萄牙语学习方法是什么
开学后,预防流感健康提示 当前热门
中国最高检:经检察监督推动执行案件1171件、涉案金额5.61亿元 世界观点
当前视讯!我的空气处理器风扇不会停止
重实效 强实干 抓落实丨南国铜业强基扩能舞好崇左工业龙头
全球热文:吕总把张津瑜弄到手,又把她毁了而不负责任?这也太无耻了吧?
速看:科罗拉多州最好的草坪肥料
夜航惊魂-国3D_夜航惊魂_时讯
天天热议:花坭村
环球即时:解冻火鸡胸肉的最快方法
每日报道:巴雷特:会合理安排全明星周末 先休息一下再去训练
马斯克谈OpenAI:它变了,变得面目全非
如何提取葡萄籽油
【全球独家】旗舰手机为何偏爱一英寸大底 高像素真被抛弃了?
谨言txt百度云盘下载_谨言txt_全球聚看点
若无相欠,怎会相见_关于若无相欠,怎会相见的简介
当前速递!也美丽半命题作文600字七年级_也美丽半命题作文600字
焦点!或与宋PLUS同堂销售,比亚迪“海狮”谍照曝光
环球速读:全国中小学生学籍信息管理系统基本信息采集表_全国中小学生学籍信息管理
世界微资讯!没签合同工资被扣怎么办
成都绕城高速充电桩位置在哪? 焦点热门
真好啊,能跟你聊这么多下流话题|上野千鹤子 x 汤山玲子-环球微动态
南极光:融资净偿还187.85万元,融资余额1.41亿元(02-16) 报道
全球消息!《无量寿经》中赞极乐世界声闻众多是何义?
X 广告
资讯
X 广告

Copyright ©  2015-2022 热讯畜牧网版权所有  备案号:豫ICP备20005723号-6   联系邮箱:29 59 11 57 8@qq.com