Это работает на основе множества причуд, которые позволяет вам делать C, и некоторого неопределенного поведения, которое работает в вашу пользу. Чтобы:
main(a) { ...
Предполагается, что типы равны int
, если они не указаны, поэтому это эквивалентно:
int main(int a) { ...
Несмотря на то, что main
должен принимать либо 0, либо 2 аргумента, и это поведение undefined, это может быть разрешено как простое игнорирование отсутствующего второго аргумента.
Далее тело, которое я буду развешивать. Обратите внимание, что a
— это int
согласно main
:
printf(a,
34,
a = "main(a){printf(a,34,a=%c%s%c,34);}",
34);
Порядок оценки аргументов не определен, но мы полагаемся на 3-й аргумент — присваивание — который оценивается первым. Мы также полагаемся на неопределенное поведение, позволяющее присвоить char *
int
. Также обратите внимание, что 34 — это значение ASCII для "
. Таким образом, ожидаемое воздействие программы:
int main(int a, char** ) {
printf("main(a){printf(a,34,a=%c%s%c,34);}",
'"',
"main(a){printf(a,34,a=%c%s%c,34);}",
'"');
return 0; // also left off
}
Что при оценке дает:
main(a){printf(a,34,a="main(a){printf(a,34,a=%c%s%c,34);}",34);}
что было исходной программой. Тада!
person
Barry
schedule
24.04.2015