使用Intel编译器SSA

1) 内存相关(初始化、NULL指针引用、内存分配和释放、内存重复释放(double free),内存泄漏、非法内存访问、缓冲区溢出等)

1. 读取没有初始化的变量,Uninitialized read,举例:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int a;
  5. printf("%d\n",a);
  6. }

对于这类问题,往往在编译的时候就能有警告,当然,对于SSA来说,这种错误是critical的。

2. 引用NULL指针的错误,Null dereference,举例

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int* a = NULL;
  5. printf("%d\n",*a);
  6. }

3. 内存分配和释放不对应(c和c++混用),举例:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int* a = new int[5];
  6. //...
  7. free(a);
  8. }

4. 内存泄漏(memory leak),举例:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int* a = new int[5];
  6. *a = 10;
  7. }

5. 非法内存访问(上面的没有初始化读取和访问NULl,都有非有内存访问),内存释放后非法内存访问举例:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int* a = new int[5];
  6. delete[] a;
  7. a[0] = 10;
  8. }

6. 缓冲区溢出,典型例子就是数组了,如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int* a = new int[5];
  6. a[5] = 10;
  7. delete[] a;
  8. }

说明:内存相关的问题大多数属于critical的错误类型。

(2) 代码相关

对于代码相关的比如函数没有返回值,死代码(不会执行的代码),没有定义的函数,没有处理的异常,没有使用的函数,可能被零除等等很多问题都可以被检查。这其中,有些代码是编译的时候就会有警告的,比如函数没有返回值,但是,还是有很多存在安全隐患但是编译器并不会给出警告。

1. 函数没有返回值:

  1. #include <stdio.h>
  2. int foo()
  3. {
  4. printf("foo\n");
  5. }
  6. int main()
  7. {
  8. foo();
  9. return 0;
  10. }

说明:会给出警告。

2. 死代码:

有一些死代码是很容易知道的,如下:

  1. #include <stdio.h>
  2. int foo()
  3. {
  4. printf("foo\n");
  5. return 1;
  6. }
  7. int main()
  8. {
  9. if (false)
  10. foo();
  11. return 0;
  12. }

有些死代码是间接的,如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int foo()
  4. {
  5. printf("foo\n");
  6. abort();
  7. return 1;
  8. }
  9. int main()
  10. {
  11. foo();
  12. printf("main\n");
  13. return 0;
  14. }

由于函数foo永远不会返回,导致了后面的内容为死代码。

3. 没有定义的函数,举例如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. extern void foo();
  4. int main()
  5. {
  6. foo();
  7. printf("main\n");
  8. return 0;
  9. }

当然,这类问题在链接的时候也是可以由编译器报错的。

4. 没有使用的函数,如下,其中bar函数没有被使用:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void foo()
  4. {
  5. printf("foo\n");
  6. }
  7. void bar()
  8. {
  9. }
  10. int main()
  11. {
  12. foo();
  13. printf("main\n");
  14. return 0;
  15. }

5. 除数可能为零,举例如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int a = rand() - 100;
  6. int b = 100/a;
  7. printf("%d\n",b);
  8. return 0;
  9. }

还有很多其他和代码相关的错误,SSA都能检查出来,比如文件操作中对文件close两次。

(3) 线程相关错误

SSA能检查的线程类错误,主要是针对OpenMP和Cilk中多线程使用的错误和数据竞争等隐藏错误的分析,对于普通本地线程,目前SSA无法分析出数据竞争的问题。

时间: 2024-10-24 20:52:29

使用Intel编译器SSA的相关文章

Intel 编译器 静态安全检查 真心的很详细 转

Static Security Analysis with Intel? Parallel Inspector XE ___________________________________________________________________ Intel? Academic Community Disclaimer The information contained in this document is provided for informational purposes only

Intel 编译器 内存安全检查 真心的很详细 转

Managing Memory Errors with Intel? Parallel Inspector XE ___________________________________________________________________ Intel? Academic Community Disclaimer The information contained in this document is provided for informational purposes only a

Intel 编译器 线程安全检查 真心的很详细 转

Managing Threading Errors with Intel? Parallel Inspector XE ___________________________________________________________________ Intel? Academic Community Disclaimer The information contained in this document is provided for informational purposes onl

Linux下用Intel编译器编译安装NetCDF-Fortan库(4.2版本后)

本来这个问题真的没必要写的,可是真的困扰我太久%>_<%,决定还是记录一下. 首先,最权威清晰的安装文档还是官方的: Building the NetCDF-4.2 and later Fortran libraries (写此文时,最近版为4.2) 那这个文档最开始就告诉我们,自NetCDF库4.2版本以后,Fortran的库和C的库就要分开build啦!而且要装Fortran的库必须先装好C的库. 所以先装C的库咯:仍然官方文档: Getting and Building NetCDF-C

使用Intel编译器获得一致的浮点数值计算结果

大多数十进制的浮点数, 用二进制表示时不是完全一致的; 与此同时, 大多数与浮点数值相关的计算结果, 存在着固有的不确定性. 通常, 编写浮点计算应用软件希望达到如下的目标:  - 准确性:     意味着该产品产生的计算结果,应当"接近"于实际计算的结果; 评判的标准是误差值, 有时候也采用最后几位("units in the last place", ulp)  - 可复制性:    意味着该产品始终产生一致的结果, 无论运行的先后, 采用不同的编译选项, 使用

搭建高性能计算环境(三)、安装intel编译器和mpi

很多计算软件都是要从源代码编译的,并且运行也需要mpi的支持,本节我们来安装intel编译器和openmpi. 1. Intel编译器的安装 需要的软件包:parallel_studio_xe_2013_update2_intel64.tgz.License文件 1)首先将软件包上传的Linux系统,可以使用上节介绍的ssh工具. 2)进入上传的目录,解压缩 tar xvf parallel_studio_xe_2013_update2_intel64.tgz 3)进去解压出来的目录 cd pa

x64内联汇编调用API(需intel编译器,vc不支持x64内联汇编)

[cpp] view plain copy #include "stdafx.h" #include <windows.h> STARTUPINFOW StartInfo  = {0}; PROCESS_INFORMATION pi = {0}; TCHAR szCommandLine[MAX_PATH] = TEXT("C:\\Windows\\NOTEPAD.EXE D:\\parallel_studio_xe_2013_update4_for_windows

Centos6.7下安装Intel 的icc / ifort 编译器(非商业版)

一.查看系统环境 [[email protected]_EXERCISE bigdft-1.8.1]# cat /etc/redhat-release CentOS release 6.7 (Final) [[email protected]_EXERCISE bigdft-1.8.1]# uname -a Linux MPI_EXERCISE 2.6.32-573.el6.x86_64 #1 SMP Thu Jul 23 15:44:03 UTC 2015 x86_64 x86_64 x86_

C++ ABI之名字改变,编译器生成符号研究(以Qt为例)

在C++中,由于重载等技术的存在,编译器要将函数.结构体.类等等的信息传递给链接器,就不能像C语言那样简单地通过函数名来完成,它需要提供额外的参数信息,而还要和C语言共用链接器,这就需要用到名字改编(name mangling),又叫名字修饰(name decoration). 名字改编也罢,但由于历史原因,C++没有这方面的标准(C++没有ABI方面的标准,名字改编只是ABI问题的一部分).于是编译器们各自为政,生成的文件无法通用. 于是:在Windows下,你会发现,同一版本的QtCore4