用于识别catch块中的问题的工具

时间:2013-02-11 07:56:50

标签: variables static try-catch analysis

我正在寻找一个工具(可能是构建时间或eclipse插件),可以帮助我识别我是否没有记录异常跟踪/消息。

我们有一个遗留应用程序,它尝试使用catch块来记录自定义错误消息。异常未记录,也不会被抛出。因此,当出现问题时,日志文件中没有有助于调试问题的堆栈跟踪。一个例子是:

try {  
 do something....  
  } catch (Throwable exception) {  
    Log.log("<<custom message>>");  
  }

我需要像Coverity或Checkstyle这样的工具来帮助我在代码库中识别所有这些事件。

谢谢和问候

1 个答案:

答案 0 :(得分:0)

我希望你能够使用任何可以使用正则表达式搜索文本的工具(例如 grep )做得不错。

正则表达式将是这样的:

     "catch\W*\(.*\)\W*{\W*Log\.log" 

其中W代表一些空白识别器,它们拾取空白和换行符。

你的模式是独一无二的,如果是程序员,我会期待很少的错误命中 与你所展示的惯例一致。

[编辑] OP表示

我正在寻找我不做以下事项的catch块 - '+ exception':

  try { do something.... }
       catch (Throwable exception)
      { Log.log("<<custom message>>" + exception)

我们回到了一个正常的表达,作为一个非常体面的黑客。你需要寻找任何不调用Log.log的地方(“&lt;&lt; ....&gt;”,或者如果它没有,则没有跟随“+异常”)。 编译为没有“非”运算符的正则表达式是很难的,但可能。假设 catch子句存在(一个不同的正则表达式测试),并且Log.log调用存在,这可能会这样做:

  "catch\W*\(.*\)\W*{\W*Log\.log\(\".*\+^[\+]"

最后一次检查看是否有“+”。任何与之匹配的东西都没有“+”。

我们的源代码搜索引擎(SCSE)使用语言的词汇而不是正则表达式来启用直接搜索,因此它具有根据语言词汇编写的略微不寻常的查询语言。它还允许更大规模的“否定”;你可以在两个区域中减去命中,这非常有用。这意味着以下查询可以解决这个问题:

   'catch' '(' I  I ')' '{' I -  I=Log '.' I=log '(' S '+' I ')'

这会找到所有“catch”子句的命中和块的开头(假设它以“Log”开头,并减去与日志习语的任何匹配。引用的术语是语言原子。我代表“我(dentifier) )“;它可以是任何标识符(只是我)或约束到标识符的特定正则表达式(其中”Log“是一个特别简单的正则表达式。)S代表”S(tring)“,也允许我们不喜欢的约束不需要这个查询。这个查询有两个子查询,一个在减号前面找到“catch”子句和一个catch主体的前缀,一个在减号后面找那个成语OP坚持他第二个子查询的结果与第一个子查询的任何重叠导致重叠查询从结果中“减去”(减号)。因此最终结果是“不以记录步骤开始的catch子句”。

更复杂的检查需要查找catch子句和logging子句,并验证catch块中的任何位置都不会出现logging子句。 SCSE本身无法做到这一点。可以使用解析和构建AST的更复杂的引擎来确定这一点。如果OP想要进一步阐述,我也知道可以做的工具。