我们希望找到来自类类型的所有指针比较。例如,我们有一个A类,以及从A导出的类,如B,C等。
A *pa;
A *pa2;
B *pb;
所有的比较,如if (pa == pa2)或if (pa != pb),都必须在我们的源代码中找到。
我知道我们可以使用CLang分析器来查找这些比较,但是我们的源代码不兼容CLang。我们正在使用2015。
请不要给出类似的解决方案;从源代码中删除A类,然后尝试编译它,这样就可以找到A类中所有未编译的用法。
有人能找到解决办法吗?像CppCheck这样的工具(检查可能的错误)或Visual扩展?
编辑:
有谁知道,如何在我的代码中找到与CppDepend/CQLinq语法的所有比较?对我也有帮助。CppDepend使用CLang,但是如果它有解析错误,它将继续解析。
发布于 2016-10-14 06:59:33
我的解决方案是:(正如@M.M所述)使用模板包装类包装指针,它实现了操作符重载,比如-> *
(因此减少了编译问题),并删除了像== !=
这样的比较操作符(因此可以找到带有编译错误的比较)。可以用正则表达式替换所有指针。(A *
与A_Wrapper
)
我还发现,在地图中使用指针就像指针比较一样。如果在映射中使用指针,则还应该在包装器类中删除<
-Operator。
当然,我有编译错误,但这些错误并不难解决。这似乎是一定的解决办法。
我希望这能帮上忙。
发布于 2016-08-18 08:59:42
我们的DMS软件重组工具包和它的C++14前端可以用来完成这个任务。
DMS是一种通用的程序分析和转换机制,可以定制,以便在作为插件模块提供给它的编程语言上取得预期的效果。它的C++14前端可配置地处理纯ANSI、GCC/Clang风格的语法或Visual语法。它包括一个完整的预处理器。
为了达到OP的目的,人们可以将DMS配置为:
DMS和C++14前端提供的机器/API非常直接地支持上述每个步骤。这可能需要在DMS中添加几页自定义代码才能达到效果。
发布于 2016-08-18 09:34:47
我猜我错过了这个问题。因此,您只想找到指向A、B、C等类型的指针的所有实例,其中指针用于条件表达式,比较.
所以你知道所有类型的名字。这意味着有有限数量的类型和有限数量的比较,例如== != <= >= <>?
因此,对于由所有类型创建的指针的每个实例,都要构建一个表。这将给出您要查找的每个指针的编码名称。
弗雷德*我的弗雷德,*你的弗雷德,*那个弗雷德;
帐户*基本帐户,*二次帐户;.等等..。
你的桌子是:
米弗雷德
你的
福雷德
初生
二次计算
现在,对于每一个实例--从第一个“myfred”开始,先查找myfred,然后是==,然后是!=等(吸收任何空格),当您找到第一个例子时(例如,第一个例子)。
secondacct<=
然后获得右侧),并将其与您构建的表中的每个指针编码名称进行比较。当你有一场像我弗雷德这样的比赛的时候,你可以用它做你想做的事。让我们简单地说,出于参数的考虑,您想要对给定的比较执行全局搜索和替换,或者进行一系列比较,您可以在执行过程中打开一个额外的文件以供输出,并且当您阅读并发现每个事件时,您可以将其输出到新的源代码文件中。
基本上,只要找到每一个比较,看看它的每一边,看看双方是否有一个编码的名称,在您的表中。实际上,您只是在有限的比较字符串组合的两边使用相同的标识符表解析代码--同样是:== != <= >= <>
我不知道有什么软件工具能做到这一点,但你可以这么快地编写代码。当然,这只会达到这一目的,但它将使这项工作迅速完成。
当然,我假设您的源代码是文本形式的,您可以打开文件并读取它。如果是这样的话,那么您可以得到任何您喜欢的结果,例如,为每个文件列出一个列表,并为每个表达式的比较找到出现的行。
在阅读的时候抓住一整行代码-
在C中-只需使用fget
在C++中-使用getline
然后解析您使用上面描述的逻辑读取的缓冲区。
@YusufRamazanKarag z- Oak -我为过度概括而道歉。您是否有可能提供一个包含其中几个问题的代码示例--比如,如果它包含多行代码呢?我的思维过程是基于您所写的“所有的比较,如if (pa == pa2)或if (pa != pb)必须在我们的源代码中找到”而没有别的,所以我没有扩展到函数返回,等等。至于构建表,您知道类型正确吗?因此,对于那些类型声明了变量的每一行,都是如何构建它的。例如,如果我希望为程序的所有文件在每一行代码中定义一个变量的表,我将搜索所有行中的char。然后,在这一行之后,我会查找逗号分隔的字符串,直到没有逗号或分号(可以继续到下一行,所以使用fgetc代替fget)。其中一些声明将是彻底的,有些声明可能是* char,一些char[] -等等。然后,我将得到char类型的每个变量的列表。我的意思是,当你搜索你所说的类型名时,你看不到它出现在哪一行上,以及它之后声明的所有内容吗?如果可以,则可以构建索引表。还是有什么原因让我不明白为什么不能这么做?查找已抛出的值会完全创建另一组解析规则,从而使任务更加复杂,模板对对象的比较也是如此。直到现在我才真正理解你从最初的问题到现在的进退两难。我真的很想帮忙,但也许一段涵盖了每一个解析范例的代码可以帮助我确定是否可以。事实上,如果你能给我一个关于你为什么要这么做的想法,我就可以有一个更好的思考过程。你想在全球范围内改变什么吗?我当然会听从你的决定,如果你认为努力是徒劳的,我就停止尝试。不过,谢谢您的耐心,我希望您能找到解决方案。
https://stackoverflow.com/questions/39013233
复制相似问题