メインコンテンツ

MISRA C:2012 Rule 21.14

The Standard Library function memcmp shall not be used to compare null terminated strings

説明

ルール定義

The Standard Library function memcmp shall not be used to compare null terminated strings. 1

This rule comes from MISRA C™:2012 Amendment 1.

根拠

memcmp を使用して 2 つの文字列を比較する場合、いずれかの文字列の長さが比較するバイト数より短いと、論理的には等しくても、等しくないという結果になる可能性があります。null 終端以降の文字が、文字列の一部ではないのに比較されます。

次に例を示します。

memcmp(string1, string2, sizeof(string1))
この例では、string1string2 よりも長い場合、null 終端以降のバイト列が比較される可能性があります。

トラブルシューティング

ルール違反を想定していてもその違反が表示されない場合、コーディング規約違反が想定どおりに表示されない理由の診断を参照します。

すべて展開する

extern char buffer1[ 12 ];
extern char buffer2[ 12 ];
void f1(void)
{
    (void) strcpy(buffer1, "abc");
    (void) strcpy(buffer2, "abc");

    if (memcmp(buffer1,    /* Non-compliant */
               buffer2,
               sizeof(buffer1)) != 0) {

    }
}

この例では、if ステートメントでの比較が準拠していません。buffer1buffer2 に格納されている文字列が等しくないと報告される可能性があります。ただし、この差異の原因は null 終端以降の初期化されていない文字にあります。

チェック情報

グループ: 標準ライブラリ
カテゴリ: 必要
AGC カテゴリ: 必要

バージョン履歴

R2017a で導入


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace® Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.