Wenn Sie auf einer 64-Bit-Maschine auf das Problem stoßen, müssen Sie den ursprünglichen Code nachahmen, aber eine Nummer angeben, die den Stapel auf einer 64-Bit-Maschine umschließt. Die ursprüngliche Zahl vorgesehen war:
$ bc
z=1073741796
z+28
1073741824
(z+28)*4
4294967296
2^32
4294967296
quit
$
also eine Möglichkeit, die Anzahl der Eingangs beschreibt, ist (ULONG_MAX - 112)/4.
Die analoge Nummer für eine 64-Bit-Maschine ist, 4611686018427387876:
$ bc
x=2^64
x
18446744073709551616
y=x/4
y
4611686018427387904
y-28
4611686018427387876
quit
$
jedoch eine Chance, dieses Arbeits stehen, würden Sie den gemeldeten Code ändern müssen, um ähnliche strtroull()
oder etwas zu verwenden; atoi()
ist normalerweise auf 32-Bit-Ganzzahlen begrenzt und würde bei den obigen 64-Bit-Zahlen nicht verwendet werden. Der Code enthält außerdem:
num_as = atoi(argv[1]);
if (num_as < 5) {
errx(1, "Need 5.");
}
p = malloc(num_as);
Wo num_as
ist ein size_t
und p
ein char *
ist. Also, Sie müssten malloc()
eine gigantische Menge an Platz (fast 4 EiB) haben. Die meisten Leute haben nicht genügend virtuellen Speicher auf ihren Rechnern, auch nicht mit Festplattenspeicher für die Unterstützung, um das zu tun. Nun, vielleicht, nur vielleicht, würde Linux es Ihnen erlauben, zu viel zu committen (und den OOM Killer später hereinfallen zu lassen), aber die malloc()
würde eher scheitern.
Es gab andere Funktionen, die relevant waren und 32-Bit-Systeme so beeinflussen, dass sie 64-Bit-Systeme (noch) nicht beeinflussen können.
Wenn Sie eine Chance haben, es auf einem 64-Bit-Gerät zu reproduzieren, müssen Sie wahrscheinlich eine 32-Bit-Kompilierung durchführen. Dann, wenn der Wind hinter Ihnen ist und Sie entsprechend alte Versionen der relevanten Software haben, können Sie sie vielleicht reproduzieren.
Verwenden Sie Ubuntu 9.04? –
Nein. Es ist eine Barebones Linux 2.6.29.1 Box mit Busybox. – woodstok