次の関数をコンパイルして、gcc が何を作成したかを確認しようとしました。
#include <stdint.h>
#include <stddef.h>
typedef struct giga
{
uint64_t g[0x10000000];
} giga;
uint64_t addfst(giga const *gptr, size_t num)
{
uint64_t retval = 0;
for (size_t i = 0; i < num; i++)
{
retval += gptr[i].g[0];
}
return retval;
}
そして、gccが私のメモリを使い果たし、自分自身をスワップして死に至らしめました。
で最適化するときにこれが発生することがわかりました-O3
。原因となる正確なフラグを分析しようとはしていません。gcc.godbolt で関数をテストすると、これは gcc 固有のものであることがわかりますが、4.8 および 4.9 バージョンに影響を与えます。
これは本物のコンパイラのバグですか、それとも関数が壊れていますか?