Если вы столкнулись с проблемой на 64-битной машине, вам придется подражать исходному коду, но предоставить число, которое обертывает стек на 64-разрядной машине. Исходное число было предусмотрено:
$ bc
z=1073741796
z+28
1073741824
(z+28)*4
4294967296
2^32
4294967296
quit
$
Таким образом, один из способов описания числа входа (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
и p
является char *
. Таким образом, вы должны были бы иметь malloc()
гигантское пространство (почти 4 EiB). Для этого большинству людей не хватает виртуальной памяти на своих машинах, даже с дисковым пространством для поддержки. Теперь, может быть, может быть, Linux может позволить вам перехватить (и пусть позже нападет OOM Killer), но скорее произойдет сбой malloc()
.
Были и другие функции, которые были релевантными и влияли на 32-битные системы таким образом, что они не могут повлиять на 64-битные системы (пока).
Если у вас есть шанс воспроизвести его на 64-битной машине, вам, вероятно, придется выполнить 32-битную компиляцию. Затем, если ветер позади вас, и у вас есть соответствующие старые версии соответствующего программного обеспечения, возможно, вы можете воспроизвести его.
Вы используете Ubuntu 9.04? –
Нет. Его бобовый linux 2.6.29.1 box with busybox. – woodstok