UNINIT.HEAP.MIGHT.UNCLEAR
未解決の条件下で初期化されていないヒープが使用される可能性があります
UNINIT.HEAP.MIGHT.UNCLEAR チェッカーは、条件が成立する場合にのみ関数がヒープメモリを読み取り、その条件を Klocwork が証明も否定もできないケースを検出します。このチェッカーをレポートするには、KW_RW_CONDITIONAL 環境変数を 0 以外の値に設定します。このチェッカーはデフォルトで無効です。
脆弱性とリスク
初期化されていないヒープメモリを使用すると、新しく割り当てられたメモリから予期しない値が読み取られる可能性があります。呼び出し元で解決できない条件付きの読み取りでも、予想外の動作につながり、セキュリティに影響を及ぼす可能性があります。
軽減と防止
ヒープメモリを読み取る可能性がある関数に渡す前に、ヒープメモリを初期化します。KW_RW_CONDITIONAL で条件付き R/W ナレッジベースのサポートを有効にすると、一部のプロジェクトでは解析時間が長くなることがあります。
脆弱コード例
コピー
#include <stdlib.h>
extern int get_id(void);
struct s {
int id;
int value;
};
void use_if_ready(struct s *arg) {
if (arg->id != 0) {
int copy = arg->value;
(void)copy;
}
}
int main() {
struct s *ptr = (struct s *)malloc(sizeof(struct s));
ptr->id = get_id();
use_if_ready(ptr);
free(ptr);
return 0;
}
Klocwork は 20 行目にフラグを立てます。これは、use_if_ready 内の条件を解決できない場合、use_if_ready の呼び出しによって ptr->value を通じて未初期化のヒープメモリが読み取られる可能性があるためです。