Как стать автором
Обновить

Комментарии 33

Придумано в 2016 году!


"Конкурс не закончен" — потому что это stackoverflow, там отвечать можно когда угодно. Подсайт code golf, на котором как раз изощряются в "напиши странную штуку за минимальное количество байт".

Это alizar, ему можно
while !terminated {
++i--;
}
Компилировать на продакшн-машине не рекомендуется.
«Достаточно одной таблетки.» — «Доктор, а можно две?» — «Не рекомендуется, но можно.» — «А три?» — "… Можно, но не рекомендуется." «72 метра»
НЛО прилетело и опубликовало эту надпись здесь
Проверил на gcc 10.1 в MSYS. Не работает.
ttldt@DESKTOP-FT9USOD MINGW64 /c/w/cpp/bmb
$ time gcc -mcmodel=medium main.c -o cbomb
main.c:1:1: warning: data definition has no type or storage class
    1 | main[-1u]={1};
      | ^~~~
main.c:1:1: warning: type defaults to 'int' in declaration of 'main' [-Wimplicit-int]

real    3m38,529s
user    0m0,000s
sys     0m0,015s


ttldt@DESKTOP-FT9USOD MINGW64 /c/w/cpp/bmb
$ ls -al
итого 125
drwxr-xr-x 1 ttldt ttldt      0 июл  7 13:35 .
drwxr-xr-x 1 ttldt ttldt      0 июл  7 13:23 ..
-rwxr-xr-x 1 ttldt ttldt 126395 июл  7 13:35 cbomb.exe
-rw-r--r-- 1 ttldt ttldt     14 июл  7 13:24 main.c
Вероятно, зависит от платформы. У меня (Arch, GCC 10.1.0 со включённым LTO) виновником торжества отказалось линковка, отожравшая всю оперативную память, хотя сама компиляция слишком долго не длилась.
「 dvrpd@lptp 」 ~/test % time gcc -mcmodel=medium bomb.c -o bomb
bomb.c:1:1: предупреждение: определение данных не содержит ни типа, ни класса хранения
1 | main[-1u]={1};
| ^~~~
bomb.c:1:1: предупреждение: в декларации «main» по умолчанию установлен тип «int» [-Wimplicit-int]
gcc -mcmodel=medium bomb.c -o bomb 46,30s user 62,75s system 95% cpu 1:53,73 total
「 dvrpd@lptp 」 ~/test % ls -l bomb
-rwxr-xr-x 1 dvrpd users 17179885600 июл 7 17:36 bomb
А вот clang собирать отказался.
bomb.c:1:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
main[-1u]={1};
^
bomb.c:1:1: warning: variable named 'main' with external linkage has undefined behavior [-Wmain]
fatal error: error in backend: invalid number of bytes
clang норм, в отличие от, мягко говоря, сомнительного gcc.
Не каждая машина осилит такую компиляцию

Нда, это уж точно.
fatal error: error in backend: invalid number of byte
1:1: error: 'main' does not name a type

Еще один отличный пример, показывающий необходимость огораживать CI (либо не допуская в него кого попало, либо используя одноразовые виртуалки или контейнеры с ограничениями на ресурсы).

Это не наилучший вариант, а самый заплюсованный.
Если проскролить ниже, есть варианты и с петабайтами готового бинаря.
Там потом сменили условие на «минимальный код, создающий файл больше 4 гигабайт»
А как его скомпилировать правильно? Пробовал вот так, на выходе 1Кб файл:
python -m compileall file.py
python -m py_compile file.py
С чего бы?
image

Ну или формулируйте вопрос более внятно. Может, в какой-то среде/компиляторе и ограничен.

Речь о формате .exe, а не файле с расширением exe, заполненном нулями.

Самораспаковывающиеся архивы легко могут больше 4 гигов
Насколько я знаю самораспаковывающиеся архивы состоят из 2-х частей первая часть exe file который не очень большой, и вторая часть это сам архив читается как внешний ресурс.
Играет другое ограничение что 32-х битная программа может адресовать только 4Gb памяти, из них как правило 2Gb это адресное пространство ОС(включая порты вводы вывода и т.д.) а 2GB остается на программу где будет куча и стеки всех запущенных потоков. Для 64-х битной программы такого ограничения нету.
Для 64-х битной программы такого ограничения нету.

Из описания формата PE на сайте MS:


PE32+ images allow for a 64-bit address space while limiting the image size to 2 gigabytes.

Или это относится к чему-то другому?


Насколько я помню, ещё есть "забавные особенности" винды в виде ограничения размера стека в 1GB, с которыми тоже мало кто сталкивается.


Но суть в том, что в заголовке статьи .exe, а в тексте статьи — RedHat.

Физически 1 процесс 32-битный не может тратить более 2 ГБ оперативки. А по поводу архивов — по крайней мере с точки зрения CireIt! прога типа «Zip-архив, способный распаковать себя куда захочет и прописать свои файлы в реестр» — это архив. Если не выбрать галочки «сканировать архивы», то его не будут сканировать.
По поводу «адресное пространство ОС» — скажем виртуалка (вся ОС) с 2 ГБ и Win 7 x86 могла тратить только 800 МБ на стадии закачки обнов, если установить сначала 2 нужные обновы. Если не установить — процесс поиска обнов именно падает на том, что svchost.exe превышает 2 ГБ памяти.
НЛО прилетело и опубликовало эту надпись здесь
Стало интересно, решил попробовать — скомпилилось за 1.5 минуты, получился файл 17 179 885 752 байт (16 ГБ).
Аналогично, с точностью до байта.
Компилировать на продакшн-машине не рекомендуется.
продакшн-машина грустит в стороне
А что это делает в новостях?
План по количеству новостей в единицу времени горит, премия в опасности!
На приличных компиляторах ничего подобного нет

Пример:

$ gcc cbomb.c -o cbomb.o
cbomb.c:1:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
main[-1u]={1};
^
cbomb.c:1:1: warning: variable named 'main' with external linkage has undefined behavior [-Wmain]
fatal error: error in backend: invalid number of bytes
$ gcc -mcmodel=medium cbomb.c -o cbomb.o
cbomb.c:1:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
main[-1u]={1};
^
cbomb.c:1:1: warning: variable named 'main' with external linkage has undefined behavior [-Wmain]
fatal error: error in backend: invalid number of bytes
$ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 11.0.0 (clang-1100.0.33.17)
Target: x86_64-apple-darwin18.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
PNG-бомбы (которая в своё время положила Хабр)

… до слез. Вмятины от укладываний остались? Фото в студию.
main[-1u]={1};
Очень эмоционально написано. Это не бомба, это протест! Если помочь этому блоку в volatile, то можно унести в кармане облако.
Должно быть — Данный код определяет функцию main как большой массив и инициализирует его ПОСЛЕДНИЙ элемент (а не первый)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Другие новости