作者saladim (杀拉顶)
看板C_and_CPP
标题[问题] 老书中的一段程式码跟可移植性叙述
时间Tue Jul 7 13:37:18 2020
问题(Question):
在一本老书里面看到一段对於可移植性的叙述跟程式码 但是想不出来原因是什麽
(书名:beginning linux programming, first edition)
程式码如下面所附, 看程式码像是C语言, 因为函数宣告好像是C语言的隐式宣告
书中是说 若此段程式在不同endian的系统下执行, 会有问题, 原因出在(1)取参数
的位址. 没有更多的情境说明惹 @_@
不懂的地方在於参数zz只有char大小,大小端的问题应该"永远"不会发生阿
那如果, 假设这段程式在小端系统下编译然後执行於大端, 且char zz被扩展为int
那使用 (1)的pointer去存取这个int大小的东西, 似乎"有可能"出问题,
但是在这个情境, (2)也可能会有问题吧?
总之 想不出为什麽这段程式可能有移植性问题 跟为什麽(1)不好,(2)安全
请各位先进帮忙解惑阿~~~ 感谢~~~~
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
char z;
func(z);
func(char zz){
char * p,tmp;
p =&zz / *(1) not good * /
tmp = zz;
p =&tmp / *(2)much safer /
/ * ... * /
}
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.226.227.50 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1594100240.A.904.html
1F:→ james732: 这是K&R的style 07/07 19:29
2F:推 chuegou: 跟“对引数取址”这个动作有关吗 07/08 01:08
3F:→ saladim: 对的跟取引数的位址有关 书上是这样说的 码也是这样标示 07/08 02:17
4F:推 MartinJ40: 可能遇到rvalue吧? VS遇到取ravlue位址也会喷警告 07/08 10:38
5F:→ loveme00835: N2176 里除了 6.9.1/9 还有 Annex J J.1/1 里有特别 07/08 18:47
6F:→ loveme00835: 提到: "The layout of the storage for parameters 07/08 18:49
7F:→ loveme00835: is unspecified" 意思是说编译器实作有权利选择如何 07/08 18:50
8F:→ loveme00835: 存放参数的值, 来达成某种目的, 像是 ABI 相容或优化 07/08 18:51
9F:→ loveme00835: 等等, 这个情况下编译器也许会插入转换的程式码让你 07/08 18:52
10F:→ loveme00835: 取得正确的值 (tmp = zz); 但如果直接拿指标去指向参 07/08 18:53
11F:→ loveme00835: 数, 看到的记忆体内容不保证和一般的变数相同 07/08 18:54
12F:→ loveme00835: 但这不是 endianness 的问题, 而是语言设计问题 07/08 19:01
13F:推 LPH66: 举个可能的例子, 或许 ABI 要求前几个参数由暂存器传 07/09 03:53
14F:→ LPH66: 那你显然不能对暂存器取址, 所以可能编译器会插入像是你的 07/09 03:53
15F:→ LPH66: char tmp = zz; 之类的程式码再对 tmp 取址 07/09 03:54
16F:→ LPH66: 但这也只是一种可能而已, 你很难知道在这状况下编译器会去 07/09 03:56
17F:→ LPH66: 做什麽事让你的取址「合理」, 以及这合理的址是不是你要的 07/09 03:56
18F:→ LPH66: 明写的区域变数胜过的点就在於它明确有个位置在 07/09 03:57
19F:→ LPH66: 你对它取值是没什麽问题的, 这并不会受有的没的最佳化影响 07/09 03:58
20F:→ descent: tmp, zz 的位址不同, p 到底想做什麽? 07/09 17:25