您的位置:首页 > 其它

使用Intel编译器(6)SSA(1)SSA介绍

2011-12-29 11:23 239 查看
参考手册:

http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011Update/compiler_c/index.htm

说明:本系列文章为个人笔记,如有不正确之处,请参考官方相关文档,如果错误发现,我会尽量更新修改。另外,以下内容不保证对于所有版本的编译器都正确,编译器的实现也可能有一些变化之处,具体参考官方文档。

更多说明请参考/article/8516772.html中补充说明部分。

Summary:这部分介绍的是Intel编译器的SSA功能,SSA功能需要结合Intel Inspector工具使用(用于查看结果)。

(1) SSA是什么

SSA,Static Security Analysis,静态安全检查,是通过对源代码进行分析,找出错误或者代码中的安全弱点或潜在错误的过程。SSA分析本身是Intel编译器的功能之一,但是其结果需要使用Inspector工具查看。

所谓的静态分析,是因为SSA的分析是不需要运行可执行文件的,在编译时就完成了分析。相应的Inspector工具本身具有的功能是动态分析的过程,其通过对程序运行时的情况分析,能检查很多错误。静态和动态分析是互相补充的,能检查大多数程序中的问题。

SSA可以检查的错误包括:buffer overflow, misuse of pointers and heap storage, unsafe or incorrect use of C/C++ or Fortran language features and libraries, and misuse of OpenMP* and Intel® Cilk(TM) Plus parallel programming constructs(缓冲区溢出、错误的使用指针和堆存储、不安全或错误的使用语言特性和库特性、错误的使用OpenMP或Cilk的并行构造)等。

(2) 静态检查工具

事实上,静态检查是开发人员很喜欢的一个特性。在很多开发语言中,都有一些很优秀的静态检查工具,其中也有很多是开源产品的。而且,静态检查,包含的内容可以很多,有些是强调coding style的检查、有些是强调对代码是否严格符合语言标准的检查、有些是强调对代码的错误的检查、有些是对代码隐藏错误的检查等等。比如C#的工具FxCorp.exe就能检查代码是否符合.net的设计规范等,一般而言,静态工具的检查,往往会有严格,有些在开发人员看来不算错误的也会检查出来,这也是正常的,毕竟,静态检查的目标就是尽量检查出可能的隐藏的错误,严格一点也好。关于静态代码工具(静态分析工具),参考http://www.cnblogs.com/Janry/archive/2011/6/3.html可以知道更多工具,对于C/C++,PC-lint是一个开源的且比较有名的静态检查工具。SSA主要是强调的是Security方面的分析,所以不会对coding
style等检查。

(3) SSA是如何工作的

编译器进行SSA分析的时候,是工作在一个特殊的模式中,在这种模式中,编译器对代码进行分析,并不进行代码生成的过程,因此,SSA编译后是不会得到一个可执行文件的,而是得到分析报告。

在编译阶段,编译器对每个源文件独立处理,得到对应的假的obj模块。对SSA的分析,是发生在链接阶段的。有点类似于IPO优化的过程,先生成一些mock obj,然后链接。所以,SSA编译得到的假的obj文件,只能用Intel的链接器链接,不能使用MS链接器链接。

(4) SSA的使用

SSA需要使用Inspector查看结果,使用SSA可以在VS、Eclipse等中使用,这些使用都比较简单。对于VS,Project->Properties->Configuration Properties->C/C++->Diagnostics[Intel C++]中Level of Static Security Analysis选项设置,相关的Static Security Analysis Results Directory设置输出结果存放的目录。这种方式首先是要先设置了使用Intel C++编译器,事实上,如果是Visual
C++工程,也可以通过菜单Build下的Build for Intel Static Security Analysis选项进行SSA分析,就不需要切换到使用Intel编译器了,当然,其实质上还是调用了Intel编译器的,所以没有安装Intel编译器是肯定不能进行SSA分析的。至于更多使用SSA的方法,参考手册。

当然,也是可以使用命令行来使用SSA编译得到结果,然后使用Inspector-GUI查看结果的,下面就是用这种方式。

(5) SSA的编译选项:

1. /Qdiag-enable:sc{[1|2|3]} && -diag-enable sc{[1|2|3]}

允许进行SSA分析,其中123报错错误的级别,1表示只显示严重错误、2表示所有错误、3表示所有错误和警告。

2. /Qdiag-disable:sc&&-diag-disable sc

禁用进行SSA分析。

3. /Qdiag-enable:sc-include&&-diag-enable sc-include

分析源码的同时也分析系统头文件,默认情况下,系统头文件的明显错误是不会报告的。说明:这里的系统头文件是指使用INCLUDE环境变量指定的目录中的头文件。

4. /Qdiag-sc-dir:dir&&-diag-sc-dir dir

指定输出结果存放的目录。默认情况下,每次运行的结果保存在当前目录下的"r@@@sc"命名形式的子目录中。

(6) 示例:

关于SSA,其重点应该是了解其能分析出来的错误有哪些,以及如何理解。下面先以一个简单的例子,了解一下使用命令行和Inspector-GUI如何使用SSA的功能。

#include <stdio.h>
#include <stdlib.h>

int main()
{
int* a = new int;
*a = 1;
printf("%d\n",*a);
free(a);
return 0;
}


使用:icl test.cpp /Qdiag-enable:sc3 /nologo编译后,得到文件夹r000sc,其中保存了分析的结果。进入文件夹,用inspxe-gui.exe打开其中的inspxe后缀的文件即可看到结果如下:



当然,在Problems中点击还可以进入源码视图等,使用就是和Inspector的使用一样了。需要说明的是,在Problems中每一个问题上,右键有一个选项“Explain Problem”,这个选项会打开一个帮助文档(Static Security Analysis Problem Type Reference),更多的介绍此类问题表示的含义以及一些例子说明,对于有时候不太理解其问题描述的时候,使用此选项能看到详细解释。如果对比此手册来学习SSA能分析的错误类型,是一个不错的选择。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: