1

Linuxソースコードのリークを検出する際のパフォーマンスをチェックするために、いくつかのオープンソースの静的分析ツールを試してみたい.私はcppcheckerから始めています. Linux では、ほとんどのメモリ割り当て呼び出しは kmalloc()、kzalloc() などの関数を介して行われ、対応する解放関数は kfree() です。デフォルトの malloc() 呼び出しの代わりに kmalloc 呼び出しを追跡するように cppchecker を構成するにはどうすればよいですか?ユーザー設定を定義できる新しい構成ファイルの作成と呼ばれるものがありますが、その方法がわかりません。

また、上記の質問のフォローアップとして、cppcheck はメモリ リーク検出のためにプロシージャ間分析を実行しますか? この目的で使用できるオープンソースの静的解析ツールは他にどのようなものがありますか?

4

2 に答える 2

3

私は Cppcheck 開発者です。

kmalloc などの古い組み込み処理があることは事実です。組み込みの知識を使用してカーネルをチェックすることから始めることをお勧めします。cfg ファイルは必要ありません。

ただし、cfg ファイルを使用すると、cppcheck を拡張できます。

これが始まりです:

<?xml version="1.0"?>
<def format="1">
    <memory>
        <dealloc>kfree</dealloc>
        <alloc init="false">kmalloc</alloc>
        <alloc init="true">kzalloc</alloc>
    </memory>
</def>

そのテキストを kernel.cfg などの名前でファイルに保存し、たとえば --library=kernel を使用して、cppcheck 分析中にその情報を使用します。

この cfg には、不足している情報がたくさんあります。--check-cfg を使用すると、Cppcheck は分析中に混乱し、より多くの cfg-info が必要な場合に文句を言います。主に、関数に関する noreturn 情報が必要であり、関数が「リーク無視」である場合も必要です。

たとえば、strcmp() の構成など、公式の std.cfg ファイルを確認できます。この構成は、strcmp() が noreturn ではないことを明示的に示しています。構成には「leak-ignore」属性もあります-割り当てられたメモリへのポインターを strcmp() に渡すことができる場合、strcmp() は割り当て解除などを引き起こさないため、リークチェッカーはこれを無視する必要があるためです。

仕組みについてご不明な点がございましたら、お問い合わせください。

于 2014-10-10T10:15:02.260 に答える
0

cppcheck がまだカーネル割り当てリークをチェックできないことを確信していますか? ソースコードは、kmalloc などを malloc のように扱っているように見えます。たとえば、cppcheck リポジトリの testmemleak.cpp ファイルを見ると、不適切な kmalloc を実行するテスト ケースが表示されます。

手続き間の分析に関する限り、cppcheck がこれを行うとは思えません。-flto フラグに基づいて GCC で少しはできるのではないかと推測しますが、私は専門家ではありません。

于 2014-10-10T04:06:41.623 に答える