cod*_*one 8 python code-analysis code-coverage reverse-engineering
我的项目针对的是低成本,低资源的嵌入式设备.我依赖于一个相对庞大且庞大的Python代码库,我对其API的使用非常具体.
我希望通过在Ned Batchelder的覆盖范围或figleaf等覆盖工具中执行我的测试套件,将这个库的代码恢复到最低限度,然后在各种模块/文件中删除未使用代码的脚本.这不仅有助于理解库的内部结构,还可以使编写任何补丁更容易.Ned实际上是指使用覆盖工具在他的一次在线会谈中"反向工程"复杂的代码.
我对SO社区的问题是,人们是否有以这种方式使用覆盖工具的经验,他们不介意分享?有什么陷阱?是覆盖工具是不错的选择?或者我会更好地投入时间与figleaf?
最终游戏是能够基于原始树自动生成库的新源代码树,但仅包括运行nosetests时实际使用的代码.
如果有人开发了一个为他们的Python应用程序和库做类似工作的工具,那么获得一个开始开发的基线是非常好的.
希望我的描述对读者有意义......
你想要的不是"测试覆盖",它是从计算的根源"可以调用"的传递闭包.(在线程应用程序中,您必须包含"can fork").
您希望指定构成应用程序入口点的一些小集(可能只有1个)函数,并希望跟踪该小集的所有可能的被调用者(有条件或无条件).这是您必须具备的一组功能.
由于动态调度,特别是由于"eval",Python一般非常难以理解(IIRC,我不是深度Python专家).对于应用于高动态语言的静态分析器来说,可以调用哪些函数的推理非常棘手.
人们可能会使用测试覆盖率作为一种方式,将"可以调用"关系与特定的"确实调用"事实联系起来; 这可能会捕获大量动态调度(取决于您的测试套件覆盖率).然后你想要的结果是"可以或做"调用的传递闭包.这可能仍然是错误的,但可能不那么严重.
一旦获得一组"必要"功能,下一个问题就是从您拥有的源文件中删除不必要的功能.如果您开始使用的文件数量很大,那么删除死机的手动操作可能会非常高.更糟糕的是,您可能会修改您的应用程序,然后修改应该保留更改的答案.因此,对于每个更改(发布),您需要可靠地重新计算此答案.
我的公司构建了一个对Java包进行分析的工具(有关动态加载和反射的适当警告):输入是一组Java文件和(如上所述)一组指定的根函数.该工具计算调用图,并查找所有死成员变量并生成两个输出:a)据称死方法和成员的列表,以及b)删除了所有"死"内容的修订文件集.如果您相信a),那么您使用b).如果您认为a)是错误的,那么您将a)中列出的元素添加到根集合中并重复分析,直到您认为a)是正确的.为此,您需要一个静态分析工具来解析Java,计算调用图,然后修改代码模块以删除死项.基本思想适用于任何语言.
你需要一个类似Python的工具.
也许你可以坚持只删除完全未使用的文件,尽管这可能仍然是很多工作.