繁体   English   中英

功能范围和增量参数

[英]Function scope & incrementing parameters

一个示例问题要求我们考虑以下代码,并预测函数funct_1将输出什么:

void func_1(int i, int j) {
    printf("i is %d, j is %d\n", i, j);
}
/*   ...   */
/* somewhere in the code, a call to func_1 */
int i = 30;
func_1(i, i++);
/*   ...   */

我认为,当参数以这种形式传递并在其中递增时,无法预测编译器何时递增i。 但是,解决方案是:

The values in the argument are passed as an attack to the function, hence 'j' receives 
a value '30' and then i receives the incremented value which is '31'.

Output: i is 31, j is 30

有人可以解释什么是对函数的攻击以及这种攻击是如何发生的吗?

并非不可能预测; 即使在规范未涵盖或未涵盖的灰色区域,编译器也以确定性的方式工作。 使用特定的编译器参数,则将参数从右向左推,并且后推增量会在推入right参数后不久发生。

该解决方案通常是错误的。 你是对的; 代码的行为是不确定的。 在某些编译器上,答案可能是30和31。 在其他情况下,可能是30和30; 在其他情况下,可能是31和31; 其他可能只是清除硬盘上的所有文件(因为未定义的行为是未定义的)。 幸运的是,在编译器中根本不可能消除所有麻烦的行为。

对于某些特定平台上的某些特定编译器,该解决方案可能是正确的。


实际上,我认为不可能在func_1()获得jfunc_1()但是容易想到产生30和30的操作序列:将i的值推两次,然后将i递增,然后调用该函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM