研究のためのC / C ++コードをその静的解析ツール

研究のためのC / C ++コードをその静的解析ツール

抜粋します。https://www.jianshu.com/p/92886d979401

ブリーフ

静的解析(静的解析)は、ソフトウェアの分析及び評価のその過程でコードを実行することなくすることが重要部分のソフトウェアの品質と安全である、を指します。これは、字句解析、意味解析、制御フロー解析、データフロー解析と実行時に多くのクレードルに首を絞めトリッキーなトラブルをさらされる私たちを助ける問題を解決するために線でコード行を露出させるために他の技術を介してです。

典型的な問題の例

コードの静的解析はここで、間違ったレベルのバグ警告レベル「未使用の変数」に軽度の脆弱性や欠陥の多くの種類、重量のすべての種類を識別することができ、いくつかの一般的な、より深刻な問題は依然として検出することが可能です。

■バッファオーバーフロー

バッファオーバーフローは、それが行くべきではない場所に流れるオーバーフローが生じる容器内に有効なデータの他の領域に冗長データカバレッジをもたらす、データの量を超えるバッファ空間、同様の過剰の水に向けられます、予測不可能な結果が得られ。統計で実用的な外観からは、ソフトウェアのバッファオーバーフローの問題はC / C ++での最も一般的な脆弱性のあるクロスボーダー言語はさらに悪くなる検出するために、このタイプのメモリを提供していません。典型的には、オーバーフローが発生したバッファです。

  • ストリングのソース文字列の長さよりも目標バッファ長少ないコピー、(そのような機能としてはstrcpy_mbscpystrcatwcscatmemcpystrncpy_mbsncpystrncatwcsncatなど)。
// 字符串拷贝之前没有对s做长度判断,如果超过10,就会造成缓冲区溢出。
void func(char* s) { char buf[10]; strcpy(buf, s); } 
  • パラメータが(そのような機能には、書式文字列と一致しない形式の文字列処理、printffprintfsprintfswprintfなど)。
// %n将前面打印的字串长度信息写到相应地址
int len = 0; printf("This is a test string.%n", &len); 
// 错误的写法,此时长度信息会写到地址为0的内存空间中
int len = 0; printf("This is a test string.%n", len); 
  • バッファが読み出される際に、文字列を読み取ること(このような機能には、文字列の長さよりも小さいscanffscanfsscanfgetsgetcfgetsfgetcなど)。
// 用户输入的字串长度不受控制,如果超过10,就会造成缓冲区溢出。
char buf[10]; scanf("%s", &buf); 

■メモリリーク

一般に、メモリリークにリサイクルし、資源の浪費することができないメモリのこの部分で、その結果、アプリケーションプログラムのメモリリソースが適切に解放されません(システムリソースリークもある)、メモリリークをヒープ指します。重症例では、あまりにも多くのメモリリークは、システムがクラッシュします。自動的な回復メカニズムが存在しないC / C ++言語は、閉ループメモリ使用量(自己ことを保証するために、プログラマが必要new/deletealloc/freemalloc/freeGlobalAlloc/GlobalFreeペアで使用します)。

 
 

典型的には、メモリリークが発生です。

  • メモリを割り当てた後、対応する放出機能を呼び出すことを忘れ。
  • プロセスは、理由特定の状態の途中で戻ってメモリを解放する機能を実装するために失敗しました。
  • プログラム設計は、全体としてメモリリーク、最後は一緒にリリースされる、メモリを割り当てることはないが継続し、無理があるが、プロセスにおける資源枯渇の可能性のために醸造された、それはメモリリークに等しいです。

■野生のポインタ

場合は、ポインタ変数が初期化されていない、またはポインタはダングリングポインタとなっているメモリで回収されました。これは、メモリアドレスが違法であると、この地域の不正な操作が予測不可能な結果につながる指します。

// 对指针是否为空的判断看是严谨,其实是无效的。
char *p = (char*)malloc(10); free(p); if (p != NULL) { strcpy(p, "danger"); } 

リサーチツール

3つの領域でプラットフォームとライセンスの考慮を使用して、検出可能な言語から、運用の必要性に基づいて、研究の主流C / C ++コードの20種類以上の静的解析ツールという。

ツール 言語 プラットフォーム オーソライズ
AdLint C WindowsやLinux、Mac OSでは、FreeBSDの オープンソース
ASTREA C Windows、Linux 支払います
バウハウスツールキット C、C ++、Javaの、C#、エイダ Windows、Linux、Solarisの 支払います
BLAST C Linuxの オープンソース
Cppcheck C、C ++ Windows、Linux オープンソース
天道虫 C Linuxの オープンソース
コベリティ C、C ++、C#、Java(登録商標)、JS、PHP、Pythonの、Objective-Cの、ルビー、スウィフト、Fortranの、VB WindowsやLinux、Mac OSでは、FreeBSDの、Solarisの 支払います
CppDepend C、C ++ Windows、Linux 支払います
エクレア C、C ++ WindowsやLinux、Mac OSの 支払います
Flawfinder C、C ++ パイソン オープンソース
Fluctuat C、エイダ WindowsやLinux、Mac OSでは、FreeBSDの 支払います
FRAMA-C C WindowsやLinux、Mac OSでは、FreeBSDの オープンソース/有料
CodeSonar C、C ++、Javaの、バイナリコード WindowsやLinux、Mac OSでは、FreeBSDの 支払います
Klocwork C、C ++、Javaの、C#の Windows、Linux、Solarisの 支払います
LDRA Testbedは C, C++, Java, Ada Windows, Linux, Mac OS 付费
Parasoft C/C++test C, C++ Windows, Linux, Solaris 付费
PC-Lint C, C++ Windows 付费
Polyspace C, C++, Ada Windows, Linux, Mac OS 付费
PRQA QA·Static Analyzers C, C++, Java Windows, Linux 付费
SLAM C Windows 免费
Sparse C Linux, Mac OS, BSD 开源
Splint C Linux, FreeBSD, Solaris 开源
TscanCode C, C++, C#, Lua Windows, Linux, Mac OS 开源

根据以下标准,筛选出3款适用性较高的工具——Cppcheck、Flawfinder、TscanCode——进行详细调研:

  • 语言:支持C/C++代码分析
  • 平台:支持在Windows和/或Linux平台运行
  • 授权:免费

为进行一次实践对比,从TscanCode的GitHub上抓到一组现成的C/C++编码问题示例,共94个CPP文件,考察三者的检测效果。

运行平台:Windows
被测语言:C/C++
测试集:TscanCode/samples/cpp

■ Cppcheck

Cppcheck可检测的问题包括:

  • Dead pointers
  • Division by zero
  • Integer overflows
  • Invalid bit shift operands
  • Invalid conversions
  • Invalid usage of STL
  • Memory management
  • Null pointer dereferences
  • Out of bounds checking
  • Uninitialized variables
  • Writing const data

并将问题分为以下6类:

  • 错误(error):bug。
  • 警告(warning):预防性编程方面的建议。
  • 风格警告(style):出于对代码简洁性的考虑(函数未使用、冗余代码等)。
  • 可移植性警告(portability):64/32位可移植性、编译器通用性等。
  • 性能警告(performance):使代码更高效的建议,但不保证一定有明显效果。
  • 信息消息(information):条件编译方面的警告。

安装十分简便,只需在官网下载最新的可执行安装包(本文目前为cppcheck-1.83-x86-Setup.msi)跟着向导「下一步」即可。

 
Cppcheck有GUI,选择菜单栏「Analyze」下的「文件」或「目录」即可对源代码进行静态分析。
 
运行结果对94个例子的分析十分到位,只不过底侧的代码预览对中文注释似乎不太友好。

除了GUI,Cppcheck还支持与多种IDE(如VS、Eclipse、QtCreator等)、版本管理系统(如Tortoise SVN、Git)集成使用。

可对每次分析进行配置甚至自定义规则,并作为项目文件进行保存或重载。

分析的结果报告可保存为格式化纯文本或XML,并可借助Python pygments将XML生成为HTML。

■ TscanCode

TscanCode是腾讯的开源项目,为此次调研的唯一一款本土工具,起初构建于Cppcheck的基础之上,后来进行了重新实现,并加入了对C#和Lua的支持。

TscanCode可检测的问题包括:

  • 空指针检查,包含可疑的空指针,判空后解引用比如Crash等共3类subid检查
  • 数据越界,Sprintf_S越界共1类subid检查
  • 内存泄漏,分配和释放不匹配同1类subid检查
  • 逻辑错误,重复的代码分支,bool类型和INT进行比较,表达式永远True或者false等共18类检查
  • 可疑代码检查,if判断中含有可疑的=号,自由变量返回局部变量等共计15类检查
  • 运算错误,判断无符号数小于0,对bool类型进行++自增等,共计11类检查

并将问题分为致命、严重、警告、提示、风格5类。

安装同样便捷,下载安装包(本文目前为TscanCodeV2.14.24.windows.exe)跟着向导「下一步」即可。

 
同样具有用户友好的GUI,且UI设计更时尚些。点击「扫描文件夹」或「扫描文件」选定路径后点击「开始扫描」即可使用。
 
扫描结果,对中文注释必然友好。

TscanCode的提示信息可以说直接照搬了Cppcheck,但给出的提示数量明显少于Cppcheck,以mismatchsize.cpp为例:

void Demo()
{ //分配的内存空间不匹配 int i = malloc(3); } 
 
Cppcheck对mismatchsize.cpp的检测结果有4条提示,TscanCode相应地只给出了后两条。

■ Flawfinder

Flawfinder由计算机安全专家David A. Wheeler个人开发,依托于Python,自然而然拥有了跨平台性。

安装:

pip install flawfinder

运行:

cd *python_path*/Scripts
python flawfinder *directory_with_source_code*

实践表明,Flawfinder对中文注释更不友好,直接拿TscanCode的测试集跑会报编码错误,尽管这些CPP文件本来就是Flawfinder文档所建议的UTF-8格式:

UnicodeDecodeError: 'gbk' codec can't decode byte 0xaf in position 92: illegal multibyte sequence

将测试集批量转换为ANSI格式后方可正常运行:

 
94个示例,仅检测出11个问题。

David A. Wheeler本人也在官网特别声明Flawfinder是款相对简单的静态分析工具,不进行数据流和控制流分析,甚至不识别函数的参数类型。

Flawfinder可将结果保存为格式化纯文本HTMLCSV三种格式。

3款工具对比

  • 检测能力:Cppcheck > TscanCode > Flawfinder
  • 友好度:TscanCode > Cppcheck > Flawfinder
  • 易用性:TscanCode > Cppcheck > Flawfinder

参考文献


2018年4月10日~16日 无锡

おすすめ

転載: www.cnblogs.com/LiuYanYGZ/p/11729938.html
おすすめ