メインコンテンツ

文字列のメモリ比較

文字列の NULL 終端以降に格納されたデータを memcmp で比較している

説明

この欠陥は、以下の場合に発生します。

  • 関数 memcmp を使用して、2 つの文字列をバイト単位で比較する。

  • 比較するバイト数が、NULL 終端以降に格納されている無意味なデータまで含んでいる。

次に例を示します。

memcmp(string1, string2, sizeof(string1))
この例では、文字列の NULL 終端以降のバイトを比較する可能性があります。

リスク

NULL 終端は文字列の終わりを示します。NULL 終端以降のバイトの比較は無意味です。NULL 終端より前のバイト列に同じ値が格納されていても、2 つの文字列は等しくないという誤った結論になる可能性があります。

修正方法

文字列の比較には strcmp を使用します。この関数は、NULL 終端までの文字列のみを比較します。

memcmp を使用して 2 つの文字列をバイト単位で比較する場合は、NULL 終端以降のバイトは比較しないようにします。関数 strlen を使用して比較するバイト数を決定します。

すべて展開する

#include <stdio.h>
#include <string.h>

#define SIZE20 20

int func()
{
    char s1[SIZE20] =  "abc";
    char s2[SIZE20] =  "abc";

    return memcmp(s1, s2, sizeof(s1));
}

この例では、sizeof は配列 s1 全体の長さ 20 を返します。ただし、関連するのは文字列の最初の 3 バイトのみです。

s1s2 が同じ値を保持していても、memcmp による比較は等しくないという誤った結果を示す可能性があります。

修正 — 比較するバイト数を決めるために strlen を使用

1 つの修正方法として、関数 strlen を使用して比較するバイト数を決定します。strlen は、NULL 終端よりも "前" の (NULL 終端自体を除く) バイト数を返します。

#include <stdio.h>
#include <string.h>

#define SIZE20 20

int func()
{
    char s1[SIZE20] =  "abc";
    char s2[SIZE20] =  "abc";

    return memcmp(s1, s2, strlen(s1));
}

結果情報

グループ: プログラミング
言語: C | C++
既定値: 手書きコードはオン、生成コードはオフ
コマンド ライン構文: MEMCMP_STRINGS
影響度: Medium

バージョン履歴

R2017a で導入