C++ 发现非常相似的程序执行

C++ 发现非常相似的程序执行,c++,c,unix,C++,C,Unix,我想知道是否可能/有人知道有什么工具可以比较两个相关程序的执行情况(例如,一个类上的赋值),看看它们有多相似。例如,不是比较函数名,而是比较它们如何使用系统调用。一个愚蠢的例子是测试一个C字符串是否在多个单独的程序中打印为(参见下面的示例) printf("%s",str) 或作为 for(i=0;i最初的想法是使用ltrace和strace记录调用,然后在日志上使用diff。这显然只包括库和系统调用。如果您需要更精细的日志记录,oprofile可能会有所帮助 如果您有权访问源代码,您可以通过

我想知道是否可能/有人知道有什么工具可以比较两个相关程序的执行情况(例如,一个类上的赋值),看看它们有多相似。例如,不是比较函数名,而是比较它们如何使用系统调用。一个愚蠢的例子是测试一个C字符串是否在多个单独的程序中打印为(参见下面的示例)

printf("%s",str)
或作为


for(i=0;i最初的想法是使用ltrace和strace记录调用,然后在日志上使用diff。这显然只包括库和系统调用。如果您需要更精细的日志记录,oprofile可能会有所帮助


如果您有权访问源代码,您可以通过使用分析信息编译代码来检测代码,然后在运行后解析gcov输出。如果您的代码没有根据外部数据/状态采取不同的路径,则纯静态源代码分析就足够了。

如果您有权访问两个p的源代码rograms,您可以构建一个函数图(每个函数都是一个节点,如果a调用B(),从a到B有一条边),并计算一些图的相似性度量。这将捕获通过重命名和重新组织生成的源代码副本。

我想您可以使用valgrind做这种事情

更细粒度的版本(取决于对程序源的访问以及您在比较方面的确切需求)是使用kprobes

内核动态探测(Kprobes)为内核模块提供了一个轻量级接口,用于植入探测并注册相应的探测处理程序。探测是一个自动断点,在执行(内核空间)时动态植入无需修改其底层源的模块。探测器旨在作为一种特殊的服务辅助工具,在需要对系统造成最小干扰的情况下使用。在不需要使用交互式调试器的生产环境中,特别提倡使用探测器。Kprobes在测试和开发中也具有很大的适用性环境。在测试期间,探测模块可能会注入或模拟故障。在开发过程中,调试代码(例如printk)可以轻松插入,而无需重新编译到测试模块


为什么不检查汇编代码中的分支数等等呢。
for (i=0;i<len;i++) printf("%c",str[i]);