欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

对国际C语言混乱代码大赛作品进行分析

最编程 2024-08-14 18:08:02
...
http://blog.chinaunix.net/u1/43436/

这两天闲来无事,重新读《C专家编程》一书,再次看到里面提到的国际C语言混乱代码大赛,突然对那些代码来了兴致,决定分析一番,而书中那个BASIC解释器程序,我认为从原理上说太复杂了(起码要理解如何解释BASIC语言吧?),更不用说从混乱的代码分析了!我记得以前在网上看过另一个大赛作品,程序打印一首英文歌曲的歌词,想想原理应该比这个简单,所以GOOGLE了一下,找到它了:

#include <stdio.h>
main(t,_,a)char *a;{return!0<t?t<3?
main(-79,-13,a+main(-87,1-_,main(-86,0,a+1)+a)):1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13?
main(2,_+1,"%s %d %d\n"):9:16:t<0?t<-72?
main(_,t,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/")
:t<-50?_==*a?putchar(31[a]):main(-65,_,a+1):main((*a=='/')+t,_,a+1)
:0<t?main(2,2,"%s"):*a=='/'||main(0,main(-61,*a,
"!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}


怎么样?乍一看蛮吓人的吧?我们今天就分析它啦!可能有人要说,分析这种程序根本没有意义,那我冒昧借用Linus的一句名言“Just for fun”!只当是没事了自我娱乐而已吧!:-)

如果你有一个支持语法高亮的编辑器,立刻可以看到,程序中有一大段字符串,我们知道,被双引号括起来的字符串里的内容是不会解释成代码语句的(转义字符就算了吧),那我们第一步就是把这些字符串提取出来,现在代码看起来是这样的:

#include <stdio.h>
main(t,_,a)
char *a;
{

char * STRA="%s %d %d\n";
char * STRB="@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/";
char * STRC="%s";
char * STRD="!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry";

return

!0<t?t<3?main(-79,-13,a+main(-87,1-_,main(-86,0,a+1)+a))
:1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13?
main(2,_+1,STRA):9:16:t<0?t<-72?main(_,t,STRB)
:t<-50?_==*a?putchar(31[a]):main(-65,_,a+1):main((*a=='/')+t,_,a+1)
:0<t?main(2,2,STRC):*a=='/'||main(0,main(-61,*a,STRD),a+1);

}
怎么样?代码是不是一下子清晰了很多?好,我们继续观察:在抽取了字符串后,我们发现程序的实际语句只有一个return(如果觉得不可思议你可以搜索一下";" C语言一个分号对应一条语句嘛,可以发现,除了字符串中的内容,的确只有一个分号)。然后我们又发现,语句里有很多"?"和":",这是什么?对了,是三目运算符,而C语言中三目运算符的优先级基本上是最低的(除了赋值和逗号运算符之外,再次搜索代码部分,发现根本没有赋值语句,而逗号运算符只有两个),我们把'?'':'','当作分隔符,任意两个分隔符直接的内容都用大写字母代替,那么程序可以变成这样:

#include <stdio.h>

#define A !0<t
#define B t<3
#define C main(-79,-13,a+main(-87,1-_,main(-86,0,a+1)+a))
#define D1 1
#define D2 t<_
#define E main(t+1,_,a)
#define F1 3
#define F2 main(-94,-27+t,a)&&t==2
#define G _<13
#define H main(2,_+1,STRA)
#define I 9
#define J 16
#define K t<0
#define L t<-72
#define M main(_,t,STRB)
#define N t<-50
#define O _==*a
#define P putchar(31[a])
#define Q main(-65,_,a+1)
#define R main((*a=='/')+t,_,a+1)
#define S 0<t
#define T main(2,2,STRC)
#define U *a=='/'||main(0,main(-61,*a,STRD),a+1)

main(t,_,a)
char *a;
{

char * STRA="%s %d %d\n";
char * STRB="@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/";
char * STRC="%s";
char * STRD="!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry";


return
A ? B ? C : D1 , D2 ? E : F1 , F2 ? G ? H : I : J : K ? L ? M : N ? O ? P : Q : R : S ? T : U ;
}

替换的到底正确与否呢?编译,通过,运行,和原来相同!说明替换成功!
下面的重点就是分析A ? B ? C : D1 , D2 ? E : F1 , F2 ? G ? H : I : J : K ? L ? M : N ? O ? P : Q : R : S ? T : U ;这个语句。
我们需要复习一下运算符的优先级和结合性的知识:
不同运算符之间按优先级识别,相同优先级的运算符直接按结合性识别,而"?:"运算符的结合性是从右向左的,那么我们可以模拟编译器读入此语句的方式得到:
A
A ?
A ? B
A ? (B ?
A ? (B ? C
A ? (B ? C :
A ? (B ? C : D1)
A ? (B ? C : D1) ,
A ? (B ? C : D1) , D2
A ? (B ? C : D1) , (D2 :
A ? (B ? C : D1) , (D2 : E
A ? (B ? C : D1) , (D2 : E :
A ? (B ? C : D1) , (D2 : E : F1)
A ? (B ? C : D1) , (D2 : E : F1) ,
A ? (B ? C : D1) , (D2 : E : F1) , F2
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ?
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? G
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ?
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H :
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I)
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) :
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J)
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) :
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : K
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ?
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? L
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ?
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M :
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : N)
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ?
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? O
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ?
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P :
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P : Q)
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P : Q) :
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P : Q) : R))
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P : Q) : R)) :
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P : Q) : R)) : S)
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P : Q) : R)) : (S ?
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P : Q) : R)) : (S ? T
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P : Q) : R)) : (S ? T :
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P : Q) : R)) : (S ? T : U))
A ? (B ? C : D1) , (D2 : E : F1) , (F2 ? (G ? H : I) : J) : (K ? (L ? M : (N ? (O ? P : Q) : R)) : (S ? T : U));

推荐阅读