国际c语⾔混乱编码⼤赛,国际C语⾔混乱代码⼤赛代码赏析
(⼀)【转】
国际C语⾔混乱代码⼤赛代码赏析(⼀)
近段时间在看《C专家编程》,⾥⾯提到国际C语⾔混乱代码⼤赛(The International Obfuscated C Code Contest IOCCC)。IOCCC有许多令⼈捧腹之处,不管你是⾃⼰编写还是时候分析获胜者的代码,都能够以令⼈惊讶的⽅式扩展你的知识。通常有10种类型的获胜
者:“对规则的最奇怪的滥⽤”,“最具创意的源代码布局”,“最简单的单⾏代码”等。综合性的“最佳上镜”奖授予最难阅读、⾏为最为古怪(但能够运⾏)的C程序的作者。下⾯我们来欣赏并分析1987年,贝尔实验室的David Korn提交的获奖代码:
main() {printf(&unix["\021%six\012\0"], (unix)["have"] + "fun" - 0x60);}
这段代码打印出什么东西?(提⽰:和“have fun⽆关”)。
⾸先看⼀段代码:
#include
int main()
{
int a[5]={1,2,3,4,5};jquery源码在线
printf("%d\n",3[a]);
return 0;
}
在C语⾔中,其实数组的引⽤可以3[a]这样的形式的,等价于a[3]。再看下⾯⼀段代码:
#include
int main()
{
int a[5]={1,2,3,4,5},i=4;
printf("%d\n",3[a]);
printf("%d\n",i[a]);
return 0;
}
这样的表⽰也是可以的。i[a]实际上相当于a[4]了。再看下⾯⼀段代码:
#include
int main()
{
printf("%d\n",unix);
return 0;
}
为什么我没有定义unix也能打印出来呢? 原因是unix被编译器内定为⼀个宏。相当于#define unix 1 这样打印出来1。下⾯来解释⼀下这个问题.
#include
int main()
{
printf("%c\n",(unix)["have"]);
return 0;
}
这⾥的unix相当于1 ,那么unix["have"]相当于 "have"[1] 我们都知道"have"是个字符数组。那么 "have"[1]就相当于引⽤这个"have"数组下标为1的字符了,实际上就是a;:
#include
int main()
{
printf("0x%x",'a');
return 0;
}
a的asc码的16进制表⽰为0x61。(unix)["have"]+"fun"-0x60就相当于0x61-0x60+"fun"相当于 0x01+"fun" ,相当于字符指针后移并指向"un"了 。这样后⾯的部分解释完了。
#include
int main()
{
printf(&unix["\021ix\012\0"]);
return 0;
}
我们⾸先把%s去掉。%s实际上是刚刚讲过的"un"的格式。我们知道unix宏的值 是1,那么
printf(&unix["\021ix\012\0"]);
相当于
printf(&1["\021ix\012\0"]);
根据上贴我说的 1["have"]这个形式,同理能得到:
printf(&"\021ix\012\0"[1]);
这个形式了。这个引⽤和上⾯的有所区别区别在于&。那么⼀个字符数组从它的下标为1 的元素取地址就可以得到⼀个字符串指针。还原回去相当于
printf(&"\021%six\012\0"[1],"un");
也就是说把第⼀个元素跳过去了把\021跳了过去。相当于:
printf("%six\012\0","un")
\012 是asc码⾥的回车。这个串相当于:
printf("%six\n\0","un");
⾄此 这个问题解决了...
总结:该代码主要应⽤了x[a]和指针运算等⼀些知识,对数组和指针的理解有很⼤的帮助!
1987年国际C语⾔混乱代码⼤赛获奖的⼀⾏代码
macb() ? lpcbyu(&gbcq/_\021%ocq\012\0_=w(gbcq)/_dak._=}_ugb_[0q60)s+ 这是CoolShell博主之前做了⼀个⾮常有意思的在线 ...
国际C语⾔混乱代码⼤赛优胜作品详解之“A clock in one line”
国际混淆C代码⼤赛获奖作品部分源码
国际C语⾔混乱代码⼤赛(IOCCC, The International Obfuscated C Code Contest)是⼀项国际编程赛事,从1984年开始,每年举办⼀次(1997年.1999年 ...
C语⾔混乱代码⼤赛
main() {printf(&unix["\021%six\012\0"], (unix)["have"] + "fun" - 0 ...
国际C 语⾔乱码⼤赛(IOCCC )
你也许听说过“国际C 语⾔乱码⼤赛(IOCCC )”,能获奖的⼈毫⽆疑问是世界顶级C 程序员.这是他们利⽤C 语⾔的特点极限挖掘的结果.下⾯这个例⼦就是⽹上⼴为流传的 ⼀个经典作品:// 原始代码如下 ...
C语⾔ 迭代部分的代码编写
C语⾔代码学习 迭代部分 迭代要⽤到函数部分的知识,⼀开始我写了计算n!的计算,代码和运⾏结果如下: 结果只能单⼀的计算出整数内的值,如果输⼊负值则结果为返回值1,显然是不对的,根据查书学习以后,知道 ...
Tinyhttpd - 超轻量型Http Server,使⽤C语⾔开发,全部代码只有502⾏(包括注释),附带⼀个简单的Client(Qt也有很多第三⽅HTTP类)
- 2. Tinyhttpd tinyhttpd是⼀个超轻量型Http Server,使⽤C语⾔开发,全部代码只有502⾏(包括注释),附带⼀个简单的Client,可以通过阅读这段代码理解⼀个 Htt ...
NSGA,NSGA-II,Epsilon-MOEA,DE C语⾔Deb教授原版代码
NSGA,NSGA-II,Epsilon-MOEA,Basic Differential Evolution (DE) C语⾔Deb教授原版代码地址 觉得有⽤的话,欢迎⼀起讨论相互学习~ [Follow ...
c语⾔⼼形告⽩代码实现
c语⾔⼼形告⽩代码实现 1.彩⾊告⽩ include include include include< ...
随机推荐
为什么使⽤ Redis及其产品定位
linux中chmod更改⽂件权限命令
1. 命令格式: chmod [-cfvR] [--help] [--version] mode file
2. 命令功能: ⽤于改变⽂件或⽬录的访问权限,⽤它控制⽂件或⽬录的访问权限.
3. 命令参 ...
jQuery Dialog弹出层对话框插件
Dialog.js的相关注释已经添加,可以按照注释,进⾏相关样式的修改,适⽤于⾃定义的各个系统! dialog.js /** * jQuery的Dialog插件. * *
@param object ...
Video Target Tracking Based on Online Learning—TLD单⽬标跟踪算法详解
视频⽬标跟踪问题分析 视频跟踪技术的主要⽬的是从复杂多变的的背景环境中准确提取相关的⽬标特征,准确地识别出跟踪⽬标,并且对⽬标的位置和姿态等信息精确地定位,为后续⽬标物体⾏为分析提供⾜ ...
主线程中也不绝对安全的 UI 操作
从最初开始学习 iOS 的时候,我们就被告知 UI 操作⼀定要放在主线程进⾏.这是因为 UIKit 的⽅法不是线程安全的,保证线程安全需要极⼤的开销.那么问题来了,在主线程中进⾏ UI 操作⼀定是安全 ...
使⽤springmvc进⾏⽂件的上传和下载
⽂件的上传 SpringMVC⽀持⽂件上传组件,commons-fileupload,commons-fileupload依赖commons-io组件 配置步骤说明 第⼀步:导⼊包 commons-f ...
eclipse中添加jstl标签⽀持(引⼊头)
php header函数导出excel表格
推荐⼀个除了⽤PHPExcel导出表格之外的另外⼀种⽐较简单不需要引⼊类⽂件的表格导⼊⽅法——header()导出excel表格. 导出表格的步骤封装成了⽅法,以便于重复使⽤,代码如下: /** * ...
Delphi 7~XE系列升级安装Indy10.6
由于低版本Indy⽆法满⾜⽹络技术的⽇益更新,如SSL/TLS请求.RawHeaders与Cookie管理等问题处理. 我本⾝⼀直在⽤Delphi 2007,因为D2009开始底层的编码已不同,旧项⽬ ...
在 R 中估计 GARCH 参数存在的问题
⽬录 在 R 中估计 GARCH 参数存在的问题 GARCH 模型基础 估计 GARCH 参数 fGarch 参数估计的⾏为 结论 译后记 在 R 中估计GARCH 参数存在的问题 本⽂翻译⾃< ...
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论