Codan是一个代码分析框架,可对C / C ++项目执行代码检查。 自2011年以来,Codan已成为Eclipse CDT(C / C ++开发工具)套件的一部分,它不仅提供执行静态代码分析所需的所有基础结构,而且还提供了一些有用的即用型问题检查器(请参阅参考资料 )。
Codan在2012年6月的Eclipse Juno版本中进行了更新,以使开发人员能够在Eclipse中自动执行外部代码分析工具。 对于Eclipse CDT和C / C ++开发人员而言,这是令人激动的进步。 尽管先前提供的问题检查器很好,但是需要更多的东西来使Codan与现有的外部代码分析工具保持功能相同。 Codan现在可以轻松地与成熟的外部工具(例如Cppcheck和clang_check)集成。
有关使用Eclipse CDT开发应用程序的更多信息:
“ 使用Eclipse平台进行C / C ++开发 ” “ 使用Eclipse C / C ++开发工具包开发应用程序 ”将外部代码分析工具与Eclipse CDT集成在一起,比开发人员仅使用Codan就能完成更多,更好的代码检查。 它还应该大大提高整体开发效率。 现在,我们可以从Codan的“首选项”页面配置外部代码分析工具。 与Codan集成后,将自动调用这些工具,并将其输出显示为编辑器标记。
在本文中,我将向您展示如何使用Java代码和一点点XML将您喜欢的代码分析工具集成到Eclipse C / C ++开发环境中。 我的示例将基于Cppcheck与Codan的集成,但是该过程应适用于您选择的工具。
为了遵循本文中的示例,您将需要同时安装Eclipse Juno和CDT。 如果尚未安装Eclipse,则可以安装CDT附带的版本。 为此,只需从Eclipse下载页面中选择C / C ++开发人员的Eclipse IDE 。
如果您已经安装了不包含CDT的Eclipse,请按照以下说明更新您的开发环境:
在Eclipse中,选择菜单帮助>安装新软件...。 在“安装”对话框中,从下拉列表中选择Juno 。 在“编程语言”类别中,选择“ C / C ++开发工具SDK” 。除了CDT,您还需要标准的GNU C / C ++开发工具来编译,构建和调试代码。 请参阅相关主题有关如何安装这些工具的说明。
默认情况下,大多数Codan代码检查均处于启用状态。 您可以分别使用Eclipse的“首选项”或“项目属性”页面在工作区或项目级别分别配置Codan代码检查。
在Codan的Preferences页面(如图2所示)中,您可以看到所有可用的代码检查器以及每个报告的代码问题。
在此页面上,您可以启用,禁用或更改问题的严重性。 如果要配置单个问题的其他属性,则可以选择一个问题,然后单击“ 定制选定的...”按钮。 图3显示了问题“函数的名称约定”的配置选项。
图3中的第三个选项卡允许您指定应该如何启动问题检查:
键入时运行 :当用户在CDT编辑器中对文件进行更改时。 在文件打开时运行 :在CDT编辑器中打开文件时。 在文件保存上运行 :保存CDT编辑器上未保存的更改时。 在增量构建上运行 :发出增量构建时(通常在保存文件并启用项目级选项“自动构建”时)。 如果同时启用此选项和“在文件保存时运行”,则代码检查将运行两次。 在完整版本上运行 :发出完整版本时(例如,在清理项目时)。 按需运行 :当用户从上下文菜单项“运行C / C ++代码分析”手动触发代码检查时。为了让您看到Codan在工作,我将用一个简短的C ++文件创建一个C ++项目。 在此文件中,我将为其分配一个变量。 Codan包含代码检查“对自身的分配”,默认情况下,其严重性级别为“错误”启用。 它被配置为在您键入时运行,因此错误将立即弹出。
在图4中 ,您可以看到Codan在我有机会保存文件之前发现了自我分配错误并报告了该错误。 完善!
要了解有关使用Codan的更多信息,请访问项目的主页(请参阅参考资料 )。
为了将外部代码分析工具与Codan集成,我们需要编写一种特殊的检查程序,该检查程序知道如何调用该工具。 检查器是Codan IChecker接口的实现, IChecker接口对给定的IResource (通常是IFile )执行某种代码检查。
为了证明它是多么容易地创建一个基于外部工具检查,我们将创建一个调用常用的工具Cppcheck(见检查相关主题 )。 这是我们要做的:
创建一个Eclipse插件项目,并将Codan添加为依赖项。 创建一个错误分析器以分析Cppcheck的输出,并在必要时创建编辑器标记。 创建代码检查器,它是负责调用Cppcheck的类。要创建Codan检查器,我们首先创建一个新的Eclipse插件项目:
选择菜单文件>新建>项目...。 在“插件开发”类别中,选择“ 插件项目” 。 输入项目的名称(我的名称为“ CppcheckChecker”),然后单击“ 下一步” 。 接受默认值,然后单击完成 。创建新的插件项目后,Eclipse将立即自动打开MANIFEST.MF文件。 这是我们将添加Codan依赖项的文件。
在编辑器中,选择“依赖关系”选项卡,并将以下内容添加到“必需的插件”列表中:
org.eclipse.cdt.codan.core org.eclipse.cdt.codan.core.cxx org.eclipse.cdt.codan.ui org.eclipse.cdt.codan.ui.cxx org.eclipse.cdt.core org.eclipse.cdt.ui org.eclipse.core.resources org.eclipse.core.runtime org.eclipse.ui我不会在本文中介绍编写Eclipse插件的所有详细信息,因为Eclipse并不是我讨论的重点。 请参阅相关信息的介绍,编写Eclipse插件。
我们将需要一个错误解析器来根据Cppcheck的输出创建编辑器标记,因此下一步是使用插件扩展Eclipse的C / C ++工具。我们将为此目的使用Java代码,因为Eclipse本身就是Java应用程序。
首先,我们将创建一个实现org.eclipse.cdt.core.IErrorParser的类CppcheckErrorParser 。 我们首先找到在报告代码问题时Cppcheck使用的模式。 错误分析器将使用此模式来识别代表问题报告的输出行,然后从该输出中提取创建编辑器标记所需的信息。
清单2显示了错误解析器如何使用该模式提取要检查的文件的路径和名称,以及找到的错误的位置,描述和严重性。 利用此信息,错误分析器将创建一个新的ProblemMarkerInfo并将其传递给给定的ErrorParserManager 。 ErrorParserManager是负责创建编辑器标记的类。
Cppcheck定义了自己的问题严重性,与编辑器标记使用的严重性不同。 例如,Cppcheck严重性“样式”在Eclipse世界中没有对应的严重性。 为了克服这个问题,我们需要在两种问题严重性之间建立映射。 方法findSeverityCode (如清单3所示)演示了实现此映射的直接方法:
创建映射后,由Cppcheck报告的严重性为“样式”的任何问题都将使用严重性SEVERITY_INFO在Eclipse中显示。 此映射仅定义问题严重性的默认值。 如您将在后面看到的,可以从“ Codan首选项”页面配置此映射。
为了使CppcheckErrorParser能够识别CppcheckErrorParser ,需要使用扩展点org.eclipse.cdt.core.ErrorParser将其注册在plugin.xml文件中:
请注意,在清单4中, ErrorParser扩展点最初是为注册CDT的构建工具的解析器而创建的。 它不特定于Codan。 为了表明CppcheckErrorParser应与Codan一起使用,我们添加上下文“ codan 。
AbstractExternalToolBasedChecker是任何基于外部工具的Codan代码检查器的超类。 它提供了调用外部代码分析工具所需的大多数基础结构。 因为我们正在集成Cppcheck,所以我们将其称为CppcheckChecker类。
我们需要做的第一件事是为信息指定与外部工具有关的默认值,该默认值将显示在“ Codan首选项”页面上。
该信息应传递给检查器的构造函数,包括以下内容:
外部代码分析工具的名称,在本例中为Cppcheck。 工具可执行文件的名称,即cppcheck 。 我们不需要为可执行文件指定路径,因为我们假设它位于系统的PATH 。 传递给可执行文件的参数,包含在单个String 。 我们指定“ --enable=all ”以启用所有Cppcheck的检查。请注意,Codan的“首选项”页面允许我们修改可执行路径和要传递的参数。
接下来,我们要指定将要使用的错误解析器的ID,如清单6所示。这些ID必须与plugin.xml文件中使用的ID相同。
返回清单2 ,我们创建了ProblemMarkerInfo并将其传递给给定的ErrorParserManager ,以创建编辑器标记。 ErrorParserManager将把编辑器标记的创建委派给我们新创建的检查器。
要使检查器创建编辑器标记,我们需要重写addMarker(ProblemMarkerInfo)方法(其工作是查找另一种不匹配类型)。 Codan检查器无法直接从ProblemMarkerInfo创建编辑器标记。 他们有自己的机制,该机制使用问题ID来为创建的编辑器标记找出适当的严重性。
问题ID是Codan用来标识代码检查程序报告的代码问题的唯一ID。 所有代码问题都显示在Codan的“首选项”页面上(请参见图2 )。
为了找到与ProblemMarkerInfo的严重性相对应的问题ID,我们需要在严重性和问题ID之间创建映射。 清单8显示了如何实现映射:
使用外部代码分析工具的代码检查器需要指出他们的哪个问题ID被视为“参考”。 参考问题ID用于获取检查器的首选项值(例如,外部工具的名称,如清单5所示)。 哪个问题ID是参考都没有关系,因为所有问题都将共享首选项。
清单8中定义了常量ERROR_PROBLEM_ID 。
为了使代码检查器及其报告的所有问题都显示在Codan的“首选项”页面上(因此用户可以访问),我们需要在Codan的plugin.xml文件中注册检查器。
因为我们不知道Cppcheck可以报告的所有问题,并且因为我们不能阻止Cppcheck在将来的版本中添加或删除代码检查,所以我们将无法注册每个问题。 相反,我们将按严重性对问题进行分组,并将每个组视为一个单独的问题。 在清单10中,我们将错误 , 警告和样式冲突注册为三个独立的问题:
我们在category元素中指定将显示给用户的检查器的名称。 问题的ID应该与检查器中使用的ID相同(请参见清单8 )。
在plugin.xml文件中,我们针对所有三个问题指定以下内容:
默认情况下启用它们。 它们分别具有默认严重性“错误”,“警告”和“信息”。 它们具有消息模式:“ {0}, ”,它迫使Codan使用Cppcheck报告的问题描述。现在,我们可以在Codan Preferences页面上看到CppcheckChecker , 如图6所示:
图7显示了用于配置Cppcheck如何报告代码错误的选项:
图8显示了Cppcheck如何报告代码问题。 请注意,保存文件后会自动调用Cppcheck。
将Codan与外部代码分析工具集成的局限性在于,当用户键入内容时,基于外部工具的检查器无法运行。 这仅仅是因为外部工具无法看到文件的未保存更改。 因此,当打开文件并保存文件时,需要运行外部检查器。
但是,使用成熟的代码分析工具所带来的好处却远远超过了这种限制。 与创建常规检查器相比,将外部工具与Codan集成起来也容易得多,也很简单,后者需要对C或C ++语言以及CDT的AST实现有深入的了解。 相比之下,我们能够用大约100行简单的Java代码(包含在两个类中)和30行XML来编写CppcheckChecker 。
在Eclipse Juno发行版之前,为Codan创建自定义代码检查需要充分了解C / C ++语言和CDT自己的AST实现。 Eclipse CDT的Juno版本通过允许开发人员创建Codan代码检查器来解决此问题,然后将繁重的工作委托给外部代码分析工具。
在本文中,我们仅使用了少量Java代码和XML即可将Cppcheck与Codan集成在一起,将流行的C / C ++代码分析工具与Eclipse中C / C ++程序的内置代码分析框架结合在一起。 如前所述,您应该能够将此处演示的过程应用于您喜欢的代码分析工具。 请参阅相关主题 ,以了解更多信息。
翻译自: https://www.ibm.com/developerworks/java/library/j-codan/index.html
相关资源:eclipse CDT插件