Здравствуйте, korzhik, Вы писали:
K>Приведённый код есть определение глобальной переменной целого типа с именем main. K>Единственная цель этого кода заткнуть линкёр, который сделает неработающий бинарник.
Насчёт этого, Вы, несомненно, правы. Вот кусок листинга, выданного IDA:
Это код CRT, вызывающий "функцию" main, в то время как main является:
.data:00403028 _main db 0 ; CODE XREF: start+13Ep
.data:00403029 db 0
.data:0040302A db 0
.data:0040302B db 0
Что неудивительно, т. к. глобальные переменные обнуляются. То есть происходит обращение по нулевому адресу, что и приводит к аварийному завершению программы.
Здравствуйте, King Oleg, Вы писали:
KO>Здравствуйте, fAX, Вы писали:
fAX>>Задание несложное: написать самую короткую программу, которая бы завершалась аварийно KO>Она должна компилироваться?
Безусловно!
...Complex problems have simple, easy-to-understand wrong answers...
(Grossman's Misquote of H.L.Mencken)
Здравствуйте, Draqon, Вы писали:
D>Здравствуйте, fAX, Вы писали:
fAX>>Задание несложное: написать самую короткую программу, которая бы завершалась аварийно
D>
D>int main()
D>{
D> int i = 1/0;
D>}
D>
Ужас! Целых 30 символов!!!
...Complex problems have simple, easy-to-understand wrong answers...
(Grossman's Misquote of H.L.Mencken)
Здравствуйте, fAX, Вы писали:
fAX>Здравствуйте, Draqon, Вы писали:
D>>Здравствуйте, fAX, Вы писали:
fAX>>>Задание несложное: написать самую короткую программу, которая бы завершалась аварийно
D>>
Здравствуйте, Neo09, Вы писали:
N>Здравствуйте, fAX, Вы писали:
fAX>>Здравствуйте, Draqon, Вы писали:
D>>>Здравствуйте, fAX, Вы писали:
fAX>>>>Задание несложное: написать самую короткую программу, которая бы завершалась аварийно
D>>>
Здравствуйте, korzhik, Вы писали:
K>Здравствуйте, korzhik, Вы писали:
fAX>>>Задание несложное: написать самую короткую программу, которая бы завершалась аварийно
K>>
K>>main(){main();}
K>>
K>>15 символов
K>ну наверно это нелегально с точки зрения стандарта C, K>ну пусть так: K>
K>int main(){main();}
K>
K>19 символов
Тогда return нужен
А вот если void вместо int то наверное короче уже некуда
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Кодт, Вы писали:
>>Это по-любому нелегально: функцию main нельзя вызывать рекурсивно. Где-то в Стандарте на этот счёт сказано.
А>если не изменяет память, в C, в отличие от C++ как раз можно вызывать функцию main рекурсивно. А>Люди, у кого есть C99 посмотрите пожалуйста.
Здравствуйте, BlackHeretic, Вы писали:
BH>Здравствуйте, korzhik, Вы писали: K>>ну наверно это нелегально с точки зрения стандарта C, K>>ну пусть так: K>>
K>>int main(){main();}
K>>
K>>19 символов BH>Тогда return нужен BH>А вот если void вместо int то наверное короче уже некуда
void вроде нельзя по стандарту
Comeau в режиме C99 вариант с void не скомпилил,
а вот вариант с int и без return скомилил даже без варнингов.
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, korzhik, Вы писали:
K>>>
K>>>main(){main();}
K>>>
K>>>15 символов
K>>ну наверно это нелегально с точки зрения стандарта C,
К>Это по-любому нелегально: функцию main нельзя вызывать рекурсивно. Где-то в Стандарте на этот счёт сказано.
К>Более подходяще было бы К>
main(){abort();}
main(){main();} — скомпилировалось в VC7.1 и вызвало stack overflow
Здравствуйте, Аноним, Вы писали:
А>если не изменяет память, в C, в отличие от C++ как раз можно вызывать функцию main рекурсивно. А>Люди, у кого есть C99 посмотрите пожалуйста.
скачал я себе C99, так что вот:
C99 6.5.2.2#11:
Recursive function calls shall be permitted, both directly
and indirectly through any chain of other functions.
Никаких исключений для функции main здесь не делается.
Хотя в C++ рекурсивный вызов функции main ведёт (насколько я помню) к undefined behavior, в C99 это well defined.
Как я понял return обязателен, так что окончательный вариант полностью соответствующий стандарту C99 такой:
Здравствуйте, korzhik, Вы писали:
K>Здравствуйте, fAX, Вы писали:
fAX>>Задание несложное: написать самую короткую программу, которая бы завершалась аварийно
K>Господа, куда приходить за призом?
K>
Здравствуйте, korzhik, Вы писали:
K>Здравствуйте, fAX, Вы писали:
fAX>>Задание несложное: написать самую короткую программу, которая бы завершалась аварийно
K>Господа, куда приходить за призом?
K>
K>int main;
K>
mini error LNK2019: unresolved external symbol _main referenced in function _mainCRTStartup
mini fatal error LNK1120: 1 unresolved externals
K>9 символов
Сделать человеку приятное очень просто. Не сделайте ему гадость и ему будет приятно!
Баг — это клоп. Таpакан — это, видимо, фича.
Здравствуйте, korzhik, Вы писали:
K>Здравствуйте, fAX, Вы писали:
fAX>>Задание несложное: написать самую короткую программу, которая бы завершалась аварийно
K>Господа, куда приходить за призом?
"ComeauTest.c", line 1: error: this declaration has no storage class or type
specifier, Wild guess: Should this be in a function block?
Wild Guess: You're using export but not using Comeau C++ 4.3.x
main;
^
1 error detected in the compilation of "ComeauTest.c".
In strict mode, with -tused, Compile failed
хотя VC7.1 скомпилир и слинковал
молодец хоть что выдал предупреждение:
: warning C4218: nonstandard extension used : must specify at least a storage class or a type
K>>: warning C4218: nonstandard extension used : must specify at least a storage class or a type
O>Хм... У меня VC 7.1 никак не ругается.
а ты поставь 4-й уровень предупреждений.
>Да вроде в языке C тип возвращаемого значения функции, объявленной без указания такового, по умолчанию -- int.
в С99 помоему не так.
но даже если так, то это здесь не причём.
Код:
main;
скомпилированный VC7.1 с ключом Ze (стоит по умолчанию), то есть с включёнными расширениями
Microsoft, эквивалентен следующему:
int main;
то есть мы можем определить переменную без указания типа
тип подставится автоматически и является типом int.
Приведённый код есть определение глобальной переменной целого типа с именем main.
Единственная цель этого кода заткнуть линкёр, который сделает неработающий бинарник.
5 символов.
Неявный инт не приветствуется, но компилерами всё так же поддерживается
C:\src>gcc -v
Reading specs from c:/MinGW/bin/../lib/gcc-lib/mingw32/3.2/specs
Configured with: ../gcc/configure --with-gcc --with-gnu-ld --with-gnu-as --host=
mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --enable
-languages=f77,c++,objc,ada --disable-win32-registry --disable-shared
Thread model: win32
gcc version 3.2 (mingw special 20020817-1)
C:\src>gcc p.c
p.c:1: warning: data definition has no type or storage class
p.c:1:6: warning: no newline at end of file
C:\src>a.exe (падаем)
C:\src>
Здравствуйте, korzhik, Вы писали:
K>Здравствуйте, fAX, Вы писали:
fAX>>Задание несложное: написать самую короткую программу, которая бы завершалась аварийно
int main() {
while(true) fork();
}
запускать под рутом — завершает аварийно не только программу
(юниксовый вызов )