天天看点

windows平台下clang_checker的使用Windows平台下Clang Checker的使用

Windows平台下Clang Checker的使用

写在最前

为什么要写这篇博客呢,因为最近的一个项目涉及到了Clang编译器在Windows平台下的使用,我们原来都是在Linux平台下来对Clang编译器来做工作的,一旦涉及到了平台迁移的问题,可能就会出现很多意想不到的问题。果不其然,我们用了两个星期的时间才不算特别完美的解决了这个问题。就是希望将我们的做法都写出来,让以后想要使用的人少走一些弯路。确实想要在Windows平台下使用比较麻烦。

因为主要想说使用方法的问题,关于Clang编译器是什么,它有什么优缺点,Checker到底是什么东东,不在本篇文章的说明范围之内,网上也有很多资料关于这个,大家可以自己去看看。这个编译器是要比GCC/G++要强大不少,微软大法也要对其大力支持。

要特别感谢王师兄、张师兄、小鹏哥对解决该问题所花费的精力,这篇文档也是由小鹏哥所整理的,我这只是将它发上来而已。感谢三位。

获取一些工具

  1. CMake。这个程序用于生成Visual Studio解决方案和工程文件,可以从http://www.cmake.org/cmake/resources/software.html上获取。安装完成以后将“CMake安装路径”\bin添加到系统PATH环境变量中。
  2. Visual Studio 2013或更高的版本。最近即将发布的VS 2015对于Clang的支持会做的更好。
  3. Python (版本2.7)。这个工具只有当你进行测试的时候是必须的(对于clang开发相当重要)。可以从http://www.python.org/download/上获取。安装完成以后,将“Python安装路径”添加到系统的PATH环境变量中。
  4. GnuWin32 tools。该工具对进行测试是必需的。可以从http://getgnuwin32.sourceforge.net/ 上获取。安装完成以后,用cmd进入GnuWin32的安装目录下执行download.bat下载所有的Linux命令程序;然后再执行install.bat安装所有命令;最后将“GetGunWin32所在目录”\gnuwin32\bin添加到系统的PATH环境变量中即可。

下载源码

  1. LLVM源码。输入网址http://llvm.org/releases/download.html,下载llvm-3.6.0.src.tar.xz,解压到合适的目录下,并重命名为llvm。
  2. clang源代码。从上面的网址中下载cfe-3.6.0.src.tar.xz,并解压到llvm\tools下,再将目录重命名为clang。
  3. compiler-rt的源代码。从上面的网址中下载compiler-rt-3.6.0.src.tar.xz,并解压到llvm\projects下,再将目录重命名为compiler-rt。

生成VS解决方案

  1. 在llvm目录下创建一个名为build的目录,然后打开cmd.exe,切换到这个目录下,执行

然后它会生成很多文件。其中,在build目录下有一个叫llvm.sln的文件。这是visual studio的项目文件。

2. 在Visual Studio中打开llvm.sln。在最上方将编译类型选择为Release。可以选择构建“clang”项目作为编译器的驱动程序和前端。或者“ALL_BUILD”项目以构建所有项目,包括tools。

注册新的Checker

  1. 找到LLVM安装时所在的根目录。
  2. 进入llvm/tools/clang/lib/StaticAnalyzer/Checker目录。
  3. 将编写好的新的checker拷贝到该目录下。为了方便描述,假设当前拷贝的checker名为TestChecker.cpp。
  4. 修改当前目录的CMakeLists.txt文件。将checker的文件名TestChecker.cpp添加到add_clang_library()中。
  5. 修改当前目录下的Checkers.td文件。Checker是以包的形式管理的,Checkers.td中定义了若干个package,而每一个checker都唯一定义于其中的一个package。由于所有开发的checker首先必须位于”alpha”包下,因此将当前checker封装在“alpha.unix”包中。需要添加的代码如下。
let ParentPackage = UnixAlpha in {
        ……
        def TestChecker : Checker<"test">,
        HelpText<"this is a checker for test…">,
        DescFile<"TestChecker.cpp">;
         ……
     } // end "alpha.unix"
           
  1. 如果还需要注册更多的checker,只需要重复执行步骤3-5即可。
  2. 当所有的checker注册完成以后,再重新构建一次clang即可。退回到llvm的根目录,然后进入build目录中执行命令
cmake -G "Visual Studio 12" ..
    sudo make install
           

至此,checker的注册工作就全部完成了。

利用Checker对源代码进行静态检查

Windows下同样使用scan-build命令进行静态分析。然而在Windows平台上使用clang3.6和scan-build时存在一定的BUG。因为clang在Windows上不支持异常处理,并且原始版本的scan-build在调用时会出现挂起的现象,因此在使用scan-build之前需要作如下操作:

  1. 打开https://github.com/llvm-mirror/clang/tree/master/tools/scan-build ,下载其中的scan-build和ccc-analyzer文件并覆盖本地“llvm安装路径”\tools\clang\tools\scan-build下的同名文件。
  2. 由于scan-build是一个perl脚本,需要安装一个perl解释器。安装完成以后,将“perl安装路径”\bin添加到系统的PATH环境变量中。

Windows平台下的scan-build命令形式与Linux下类似,具体示例如下。

scan-build --use-analyzer=”llvm安装路径”\build\Release\bin\clang.exe -enable-checker alpha.unix.test clang++.exe -D_HAS_EXCEPTIONS= -c test.cpp
           
  1. 为了方便在cmd中使用scan-build,需要分别将clang、scan-build和scan-view的路径添加到系统的PATH环境变量中。Clang的路径为“llvm安装路径”\build\Release\bin;scan-build的路径为“llvm的安装路径”\tools\clang\tools\scan-build; scan-view的路径为“llvm的安装路径”\tools\clang\tools\scan-view。
  2. 对命令各部分的解释:

–use-analyzer:选择静态分析时clang可执行程序的路径。这里建议选择clang.exe而不是clang++.exe。有一个关于scan-build的bug(bug编号为24112)称scan-build在clang++.exe的路径作为–use-analyzer的参数时,无法正常工作。

-enable-checker:静态分析时指定某个非默认的checker。

clang++.exe -D_HAS_EXCEPTIONS=0 -c test.cpp:正常的编译源文件的命令。这里需要注意的是-D_HAS_EXCEPTIONS=0这个参数,由于clang在Windows平台上不支持异常处理,所以在用clang编译源文件时需要通过该参数将其关闭。

继续阅读