64 ビット マシンで問題が発生した場合は、元のコードを模倣する必要がありますが、64 ビット マシンでスタックをラップする番号を指定する必要があります。提供された元の番号は次のとおりです。
1073741796
$ bc
z=1073741796
z+28
1073741824
(z+28)*4
4294967296
2^32
4294967296
quit
$
したがって、入力数値を表す 1 つの方法は (ULONG_MAX - 112) / 4 です。
64 ビット マシンのアナログ番号は 4611686018427387876 です。
$ bc
x=2^64
x
18446744073709551616
y=x/4
y
4611686018427387904
y-28
4611686018427387876
quit
$
ただし、これが機能する可能性を維持するには、報告されたコードを変更して使用するstrtroull()
か、同様のものを使用する必要があります。atoi()
は通常 32 ビット整数に制限されており、上記の 64 ビット数値では使用できません。コードには以下も含まれます。
num_as = atoi(argv[1]);
if (num_as < 5) {
errx(1, "Need 5.");
}
p = malloc(num_as);
とnum_as
はです。size_t
_ したがって、膨大な量のスペース (ほぼ 4 EiB)を使用できる必要があります。ほとんどの人は、バッキング用のディスク領域があっても、マシンに十分な仮想メモリがありません。さて、たぶん、たぶん、Linux はオーバーコミットを許可します (そして、後で OOM キラーを急襲させます) が、失敗する可能性が高くなります。p
char *
malloc()
malloc()
64 ビット システムには (まだ) 影響を与えられないが、32 ビット システムに影響を与える、関連するその他の機能がありました。
64 ビット マシンで再現する可能性がある場合は、おそらく 32 ビット コンパイルを行う必要があります。その後、追い風が吹いていて、適切な古いバージョンの関連ソフトウェアがあれば、おそらくそれを再現できます。