ループの本体で文字配列を宣言するCのループについて考えてみます。各反復で、配列の文字は最後に到達するまで変更されます。最後に、変数が出力されます。説明は次のコードに拡張されます。
#include <stdio.h>
int main(void) {
int i = 0;
for (;;) {/* same as: while(1) { */
char x[5];
x[i] = '0' + i;
if (++i == 4) {
x[i] = '\0'; /* terminate string with null byte */
printf("%s\n", x);
break;
}
}
return 0;
0123
多くの人が出力として期待するかもしれません。しかし、何らかの理由で、GCC 4.7は、最適化を有効にした(およびそれ以降)コンパイル時にそれを行いません-O1
。代わりに、ランダムデータを文字配列の最初のバイトに配置します。これは次のようになります。
| 0 | 1 | 2 | 3 | 4 |
| RANDOM | '3' | '\0' |
これは言語の観点からは論理的な動作だと思います。ブロックが終了すると自動変数がなくなるため、上記の「ランダムな」動作が予想されます。
正しい振る舞いは何でしょうか?ループの外側の宣言を移動すると「修正」されることは知っていx
ますが、このスニペットの動作については何も言えません。実際の問題はNetfilterのバグです。