C代码分析器(一个 公开赛冠军)
最近心血来潮,我希望能写一个通用的代码分析工具(其实这个词有点太。事实上为C代码)。看到这几天我看到代码头晕眼花,尽管Source Insight救命,仍然没有足够的智慧思考很多地方。
如今主要遇到的问题有下面几个:
1。非常多函数被定义为宏,然后被调用。
这个就须要自己搜索到对应的定义。然后再去寻找调用处。
2,程序的结构中非常多用到有限状态机,函数会被放到数组中。
会遇到和上面相同的问题。
3。现有的工具无法展示全部函数的调用和被调用关系,让看代码总是盲人摸象,难免会出现疏漏。
所以希望能自己写一个代码分析的工具。能够帮助更快,更清晰的分析代码。如今初步计划使用Python开发,毕竟第三方库多些,开发比較方便。本帖作为项目開始的处女帖,也相当于给自己的项目开个头。
如今有了一些基本想法,罗列例如以下:
须要实现的功能:
1。分析各个C文件里的函数(须要一定的文本分析算法来推断来定位和区分函数定义和函数调用)并存储起来。
2,利用有向图的方式来存储函数见的关系(调用和被调用),通过邻接链表的结构来存储。
3。假设某个函数没有被调用。推断其是否被替换(定义为宏或成为数组元素),并进行对应处理。
分析代码第一步:建立函数调用关系链表。
伪代码:
while(不是最后一个文件里的最后一个函数)
{
current_function=通过文本分析得到的函数名称
为current_function填加子节点(分析current_function中调用的函数)
if(current_function在图中已有存储)
{
刚才建立的链表放入到图中current_function所在的位置。
}
else
{
current_function作为顶级节点放入到图中
}
}
清理顶级节点(解决上面提出的第三个问题。)
分析代码第二步:显示current_function的调用关系。
函数调用关系图建立完毕后,假设要显示current_function的调用关系,仅仅需对图以current_function为起点进行遍历就可以。
如今我仅仅是到了上面的几个方面。接下来肯定实现所遇到这么多问题。我相信,办法总比困难多。加油。
版权声明:本文博客原创文章,博客,未经同意,不得转载。
C代码分析器(一个 公开赛冠军)的更多相关文章
- 建立标准编码规则(一)-自定义C#代码分析器
1.下载Roslyn的Visual Studio分析器模板插件(VS2015 或VS2017) https://marketplace.visualstudio.com/items?itemName= ...
- 通过 Mesos、Docker 和 Go,使用 300 行代码创建一个分布式系统
[摘要]虽然 Docker 和 Mesos 已成为不折不扣的 Buzzwords ,但是对于大部分人来说它们仍然是陌生的,下面我们就一起领略 Mesos .Docker 和 Go 配合带来的强大破坏力 ...
- 40多行python代码开发一个区块链。
40多行python代码开发一个区块链?可信吗?我们将通过Python 2动手开发实现一个迷你区块链来帮你真正理解区块链技术的核心原理.python开发区块链的源代码保存在Github. 尽管有人认为 ...
- python 控制语句基础---->代码块:以为冒号作为开始,用缩进来划分作用域,代表一个整体,是一个代码块,一个文件(模块)也称为一个代码块 | 作用域:作用的范围
# ### 代码块:以为冒号作为开始,用缩进来划分作用域,代表一个整体,是一个代码块,一个文件(模块)也称为一个代码块 # ### 作用域:作用的范围 print(11) print(12) prin ...
- 建立标准编码规则(三)-CodeFixProvider 给代码分析器增加修复建议
给代码分析器增加修复建议 既然代码分析器,向代码编写者提出了错误或警告,那么有没有可能向代码编写者提交有效的改进建议? 相对于 DiagnosticAnalyzer,代码修复继承与 CodeFixPr ...
- 只用120行Java代码写一个自己的区块链-3挖矿算法
在本系列前两篇文章中,我们向大家展示了如何通过精炼的Java代码实现一个简单的区块链.包括生成块,验证块数据,广播通信等等,这一篇让我们聚焦在如何实现 PoW算法. 大家都无不惊呼比特币.以太坊及其他 ...
- 通过Mesos、Docker和Go,使用300行代码创建一个分布式系统
[摘要]虽然 Docker 和 Mesos 已成为不折不扣的 Buzzwords ,但是对于大部分人来说它们仍然是陌生的,下面我们就一起领略 Mesos .Docker 和 Go 配合带来的强大破坏力 ...
- 30行JavaScript代码实现一个比特币量化策略
精简极致的均线策略 30行打造一个正向收益系统 原帖地址:https://www.fmz.com/bbs-topic-new/262 没错!你听的没错是30行代码!仅仅30行小编我习惯先通篇来看看 代 ...
- 分享如何在github上为代码创建一个链接
从自学前端到现在差不多一个月了,在此期间,一直有一种困惑,如何将自己电脑中编写的代码生成一个链接,以便可以发布呢?今天有幸被高人指点一二,现将其分享. 第一步,网上注册一个github账号 第二步,新 ...
随机推荐
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (初级)
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (初级) 企业库提供了一个很强大的验证应用程序模 ...
- ostringstream使用
ostringstream使用 [本文来源于]http://www.builder.com.cn/2003/0304/83250.shtml http://www.cppblog.com/alanto ...
- Ubuntu常用软件推荐,图文详细说明及下载
抛开Windows,其实在任何一款Linux发行版本中,我们都有超级大量的软件来安装,使用.这次的教程,我就以Ubuntu为例,来给大家推荐一些我认为不错的软件 声明: 1.本文提到的全部软件,都在文 ...
- poj 3259(bellman最短路径)
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 30169 Accepted: 10914 Descr ...
- 更具体的描述JNI
JNI事实上,Java Native Interface缩写,也就是说,java本地接口. 它提供了许多API实现和Java并与其他语言的沟通(主要C&C++). 也许很多人认为Java够劲. ...
- 3D MAX脚本教程1
本文转载自http://jiurong995294.blog.163.com/blog/static/195133243201192531546490/ 方便以后须要时候使用 为什么要学习3D MAX ...
- jQuery来源学习笔记:整体结构
1.1.由于调用一个匿名函数: (function( window, undefined ) { // jquery code })(window); 这是一个自调用匿名函数,第一个括号内是一个匿名函 ...
- RSA算法加密解密
该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1. jar 注意:RSA加密明文最大长度117字节,解密要求密文最大长度为128字节,所以在加密和解密的过程中需要分块 ...
- OpenJDK 阅读源代码 Java 实现字节流输入类
Java 的输入输出总是给人一种非常混乱的感觉.要想把这个问题搞清楚.必须对各种与输入输出相关的类之间的关系有所了解. 仅仅有你了解了他们之间的关系.知道设计这个类的目的是什么.才干更从容的使用他们. ...
- jdk阅读xml文件
前言 你需要阅读的时间来写一个通用组件xml文件,但考虑到组件分布更容易,这样一来在第三方小引用jar包.因此,直接jdk内建的xml分析方法.可能都没有第三发的组件强大. 导入的文件: import ...