?

Log in

No account? Create an account
для программистов, знающих язык це - Поклонник деепричастий [entries|archive|friends|userinfo]
Anatoly Vorobey

[ website | Website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Links
[Links:| English-language weblog ]

для программистов, знающих язык це [мар. 3, 2008|11:28 pm]
Anatoly Vorobey
Загадка: написать самую краткую программу на C, которая компилируется, запускается и падает. Под "компилируется" будем для ясности понимать, что "gcc -o example example.c" ее компилирует без ошибок и предупреждений, и создает исполняемый файл example, который при исполнении падает.

Вариант: то же самое, но разрешаются предупреждения при компиляции.

Теперь ответы - это не я придумал, а рассказал Даг Ландауэр (Doug Landauer) во внутренней рассылке, копирую сюда с его разрешения. Поэтому если хотите свой вариант придумать, не заглядывайте под кат:



Вариант без предупреждений: "int main;"

Вариант с предупреждениями: "main;"
СсылкаОтветить

Comments:
Страница 1 из 2
<<[1] [2] >>
[User Picture]From: ohtori
2008-03-03 09:44 pm

Сначала не заметил условие "самую краткую" и долго тормозил: в чём же сложность задачи?
(Ответить) (Thread)
[User Picture]From: avva
2008-03-03 09:52 pm
Сейчас подчеркну специально.
(Ответить) (Parent) (Thread)
[User Picture]From: motto
2008-03-03 09:46 pm

вообще, надо бы об опциях договориться

gcc -Wall test2.c
test2.c:1: warning: ‘main’ is usually a function
(это для первого варианта)
(Ответить) (Thread)
[User Picture]From: avva
2008-03-03 09:48 pm

Re: вообще, надо бы об опциях договориться

Я и договорился: специально написал, как именно вызывать gcc :)
(Ответить) (Parent) (Thread)
(Удалённый комментарий)
[User Picture]From: avva
2008-03-03 09:51 pm
Правда ведь? Я тоже офигел.
(Ответить) (Parent) (Thread)
[User Picture]From: malfet_
2008-03-03 09:53 pm
int main(void) { return *((int *)0)=17;}
(Ответить) (Thread)
[User Picture]From: make4um
2008-03-03 09:56 pm
альтернативный вариант: char main; ;o)))))
(Ответить) (Thread)
[User Picture]From: shabunc
2008-03-03 10:05 pm
он длиннее на целый символ )))
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: malfet_
2008-03-03 09:58 pm

C warningом

int (*main)(void);
(Ответить) (Thread)
[User Picture]From: malfet_
2008-03-03 11:09 pm

Немного подумав

Вообще это решение, так же как и авторское зависит от реализации libc. Я полагаю что можно найти комбинацию из libc+архитектуры на которой подобное переопределение символа main не будет приводить к исключению..
(Ответить) (Parent) (Thread)
From: a7sharp9
2008-03-03 10:08 pm
Ответ можно, наверное, reverse-engineer из псевдокода (вылить воду из чайника и выключить газ), если сообразить, что достаточно записать в инструкцию типа jmp идиотский адрес, и вспомнить про entry point.
(Ответить) (Thread)
[User Picture]From: jsn
2008-03-03 10:36 pm
да-да. в досовские времена на 386+ код ребута можно было вместить в четыре байта. поэтому самый короткий reboot.c, который я писал, выглядел как main = 0xнепомнючто.
(Ответить) (Thread)
[User Picture]From: spamsink
2008-03-03 11:02 pm
Да, сейчас посложнее будет. (В линуксе) нужно перед собственно системным вызовом занести в SI значение 0x28121969 (да-да, это именно то, что вы подумали), а в DI - 0xFEElDEAD.
(Ответить) (Parent) (Thread)
[User Picture]From: itman
2008-03-03 10:54 pm
Ха-ха, остроумно, все мы знаем, что не слинкуется, если нет символа main. Нате вам, жрите символ main :-)
(Ответить) (Thread)
From: 9000
2008-03-03 11:01 pm
круто 8-)
(Ответить) (Thread)
[User Picture]From: zigmar
2008-03-03 11:15 pm
Придумать вариант не удалось, так как выяснилось что Reader автоматически показывает текст по катом :)
(Ответить) (Thread)
[User Picture]From: vashik
2008-03-03 11:30 pm
main(int argc,char **argv)
{
return *argv[argc];
}


Написал, вставил, и увидел первую строчку под катом.
До второй дошел сам. Спасибо, занимательно.
(Ответить) (Thread)
From: urbanserj
2008-03-03 11:33 pm
браво!

сам додумался только до main(){main();}
(Ответить) (Thread)
[User Picture]From: getman
2008-03-04 06:29 am
Компайлер ждет здесь символ main'а...
(Ответить) (Thread)
[User Picture]From: flaass
2008-03-04 07:20 am
А программа, подвешивающая gcc? Или таких уже не осталось?
(Ответить) (Thread)
From: oblomov_jerusal
2008-03-04 08:36 am
Если на C++ c темплэйтами, то, наверно, можно вполне легальным способом сделать переполнение стэка или ввести в бесконечный цикл?
(Ответить) (Parent) (Thread) (Развернуть)
Страница 1 из 2
<<[1] [2] >>