[问题] 老书中的一段程式码跟可移植性叙述

楼主: saladim (杀拉顶)   2020-07-07 13:37:18
问题(Question):
在一本老书里面看到一段对于可移植性的叙述跟程式码 但是想不出来原因是什么
(书名:beginning linux programming, first edition)
程式码如下面所附, 看程式码像是C语言, 因为函数宣告好像是C语言的隐式宣告
书中是说 若此段程式在不同endian的系统下执行, 会有问题, 原因出在(1)取参数
的位址. 没有更多的情境说明惹 @[email protected]
不懂的地方在于参数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 /
/ * ... * /
}
作者: james732 (好人超)   2020-07-07 19:29:00
这是K&R的style
作者: chuegou (chuegou)   2020-07-08 01:08:00
跟“对引数取址”这个动作有关吗
楼主: saladim (杀拉顶)   2020-07-08 02:17:00
对的跟取引数的位址有关 书上是这样说的 码也是这样标示
作者: MartinJ40 (Martin J-40)   2020-07-08 10:38:00
可能遇到rvalue吧? VS遇到取ravlue位址也会喷警告
作者: loveme00835 (发箍)   2020-07-08 18:47:00
N2176 里除了 6.9.1/9 还有 Annex J J.1/1 里有特别提到: "The layout of the storage for parametersis unspecified" 意思是说编译器实作有权利选择如何存放参数的值, 来达成某种目的, 像是 ABI 相容或优化等等, 这个情况下编译器也许会插入转换的程式码让你取得正确的值 (tmp = zz); 但如果直接拿指标去指向参数, 看到的内存内容不保证和一般的变量相同但这不是 endianness 的问题, 而是语言设计问题
作者: LPH66 (-6.2598534e+18f)   2020-07-09 03:53:00
举个可能的例子, 或许 ABI 要求前几个参数由暂存器传那你显然不能对暂存器取址, 所以可能编译器会插入像是你的char tmp = zz; 之类的程式码再对 tmp 取址但这也只是一种可能而已, 你很难知道在这状况下编译器会去做什么事让你的取址“合理”, 以及这合理的址是不是你要的明写的区域变量胜过的点就在于它明确有个位置在你对它取值是没什么问题的, 这并不会受有的没的最佳化影响
作者: descent (“雄辩是银,沉默是金”)   2020-07-09 17:25:00
tmp, zz 的位址不同, p 到底想做什么?

Links booklink

Contact Us: admin [ a t ] ucptt.com