国际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};
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”
原文链接:https://blog.csdn.net/herorenme/article/details/8864351 摘要:IOCCC,即国际混乱C语言代码大赛是一项著名的国际编程赛事迄今已举办2 ...
国际混淆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及其产品定位
摘自:http://www.infoq.com/cn/articles/tq-why-choose-redis 传统MySQL+ Memcached架构遇到的问题 实际MySQL是适合进行海量数据存储 ...
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标签支持(引入头)
https://blog.csdn.net/wangyuxuan_java/article/details/8580318
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 参数存在的问题 本文翻译自< ...
国际c语言混乱编码大赛,国际C语言混乱代码大赛代码赏析(一)【转】相关推荐
- 怎么解c语言逆向编码,逆向还原C语言代码 练习1
找了个C语言100列 用来练习OD还原C语言代码 至于C+的 以后也会写 我们先来看第一个程序,我们先分析Debug的 Debug为了方便调试,代码都是一对一的翻译 没做什么优化,还原起来比较好上手, ...
- c语言 文件编码转换为字符串,c语言下汉字转换(字符串改为utf-8编码)
相信大家应该都知道,汉字经过utf-8后转码会变成一串字串,其中以/分割,如:\xE7\x98\x91............,其中每三个/(十六进制)代表一个汉字,也就是一个汉字转换为了三个字节. ...
- 国际c语言混乱编码大赛,国际C语言混乱代码大赛优胜作品详解之“A clock in one line”...
下面这段代码即为第19届 IOCCC(国际混乱C语言代码大赛)优胜作品:"A clock in one line". 1 main(_){_^448&&main(- ...
- c语言国际编码标准统一编码,88、国际C语言混乱代码大赛-2020.03.11
国际C语言混乱代码大赛 国际C语言混乱代码大赛官网 1987年国际C语言混乱代码大赛获奖的一行代码 国际C混乱码大赛 2012国际C语言混乱代码大赛冠军代码 膜拜,第 25 届国际 C 语言混乱代码大 ...
- 国际C语言混乱代码大赛优胜作品详解之“A clock in one line
国际C语言混乱代码大赛优胜作品详解之"A clock in one line" 发表于2013-04-11 17:22| 9419次阅读| 来源StackOverflow| 53 ...
- 第21届国际C语言混乱代码大赛获奖作品
小行踪 2012-10-22 14:10 第21届国际C语言混乱代码大赛(IOCCC)正式发布了获奖源代码.IOCCC要求参赛者写出最有创意且最让人难以理解的C语言代码,大小限制在4 kb以内,因此每 ...
- 第二十一届国际C语言混乱代码大赛结果公布
摘要:国际C语言混乱代码大赛(IOCCC, The International Obfuscated C Code Contest)是一项著名的国际编程赛事,从1984年开始到2006年,每年举办一次 ...
- 国际C语言混乱代码大赛结果公布
国际C语言混乱代码大赛(IOCCC, The International Obfuscated C Code Contest)是一项国际编程赛事,从1984年开始,每年举办一次(1997年.1999年 ...
- c语言获奖程序,1987年国际C语言混乱代码大赛获奖的一行代码
最近CoolShell博主做了一个很有意思的在线puzzle,这些谜题很有趣同时也有一定的难度.由于水平有限,我并没有通关,我觉得这些题还是很值得一做的,从中可以学到很多东西. 例如其中的第二题: 题 ...
最新文章
- 从Google代码库找到的好东西
- Windows7 UAC
- php怎么查帮助,需要有关MySQL查询和PHP的帮助
- 【Android 启动过程】Activity 启动源码分析 ( ActivityThread -> Activity、主线程阶段 二 )
- memcached 启动参数
- tp5 批量更新多条记录_tp5批量导入数据库
- Spring注入日期到bean属性-CustomDateEditor
- tinkphp1.0贺岁版小程序应用平台系统源码
- DDoS分布式拒绝服务攻击简介
- 解决 MyEclipse 的耗内存卡死的办法
- 鼠标onfocus或onblur效果
- BZOJ.2816.[ZJOI2012]网络(LCT)
- fork和vfork,exec
- 【网络覆盖优化】基于matlab的网络覆盖遗传优化问题仿真
- 文件搜索工具Listary中文版快速上手使用教程
- python设计贪吃蛇游戏论文_150行python代码实现贪吃蛇游戏
- 一位浙大教授令人寒心的演讲,说出了真话!
- 惊!西游记内幕竟是这样的。
- linux主分区扩容
- oracle数据库添加序列