樣本問題讓我們思考下面的代碼,並預測哪些將被函數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
有人能解釋一下對某個函數的攻擊是什麼以及這是怎麼發生的?
現在我徹底困惑。這個問題並沒有說明我們要承擔某個平臺,而是明確指出「我是31」而「j是30」。 =/ – raphnguyen 2011-05-09 02:34:37
@raphnguyen:對不起,你很困惑。麻煩的是,這個問題不是很好,就像詢問未定義的行爲一樣。答案不是很好 - 說明福音至多是一種特定(但尚未說明)的編譯器展現的行爲。不幸的是,Mac OS X 10.6.7上GCC 4.6.0設置繁瑣給出了「警告:對'i'的操作可能未定義」,結果「我是31,j是30」,所以我沒有證明我的觀點。 – 2011-05-09 03:10:12
@raphnguyen:我檢查了Solaris 10(SPARC);產生31/30。我檢查了HP-UX 11.23;產生30/30。我檢查了AIX 6.1;產生30/30。 – 2011-05-09 03:35:59