メインコンテンツ

MISRA C:2012 Rule 21.16

The pointer arguments to the Standard Library function memcmp shall point to either a pointer type, an essentially signed type, an essentially unsigned type, an essentially Boolean type or an essentially enum type

説明

ルール定義

The pointer arguments to the Standard Library function memcmp shall point to either a pointer type, an essentially signed type, an essentially unsigned type, an essentially Boolean type or an essentially enum type. 1

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

根拠

標準ライブラリ関数の

memcmp ( lhs, rhs, num );
は、lhs および rhs が指す 2 つのオブジェクトの先頭から num バイトをバイト単位で比較します。

以下のバイト単位の比較に memcmp を使用しないでください。

タイプ根拠
構造体 構造体のメンバーが異なるデータ型を持っている場合、コンパイラはメモリ内のデータ アライメントのために追加のパディングを導入します。これらの追加のパディング バイトの内容に意味はありません。memcmp で構造体のバイト単位の比較を実行する場合、パディングに格納された意味のないデータも比較されます。対応するメンバーが同じ値であっても、2 つのデータ構造体が等しくないという誤った結論になる可能性があります。
実質的な実数の浮動小数点型と実質的な複素数の浮動小数点型のオブジェクト同じ浮動小数点型の値が異なる表現を使用して保存される可能性があります。memcmp で 2 つの変数のバイト単位の比較を実行する場合、それらが同じ値であっても 2 つの変数は等しくないという誤った結論になる可能性があります。理由は、それらの値が 2 つの異なる表現を使用して格納されているためです。
実質的な char 型の配列実質的な char 型の配列は通常文字列を格納するのに使用されます。文字列内では、NULL 終端以降のバイトのコンテンツに意味はありません。memcmp で 2 つの文字列をバイト単位で比較する場合、NULL 終端より前のバイト列に同じ値が格納されていても、2 つの文字列は等しくないという誤った結論になる可能性があります。

トラブルシューティング

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

すべて展開する

#include <stdbool.h>
#include <stdint.h>

struct S {
//...
};

bool f1(struct S* s1, struct S* s2)
{
    return (memcmp(s1, s2, sizeof(struct S)) != 0); /* Non-compliant */
}

union U {
    uint32_t range;
    uint32_t height;
};
bool f2(union U* u1, union U* u2)
{
    return (memcmp(u1, u2, sizeof(union U)) != 0); /* Non-compliant */
}

const char a[ 6 ] = "task";
bool f3(const char b[ 6 ])
{
    return (memcmp(a, b, 6) != 0); /* Non-compliant */
}

この例では以下のようになります。

  • 構造体 s1s2 が関数 bool_t f1 で比較されています。パディングのため、この関数の戻り値では s1s2 が異なると示される場合があります。この比較は準拠しません。

  • 共用体 u1u2 が関数 bool_t f2 で比較されています。この関数の戻り値は、u1.rangeu2.height または u1.heightu2.range の意図していない比較により、u1u2 は同じであると示される場合があります。この比較は準拠しません。

  • 実質的な char 型の配列 ab が関数 bool_t f3 で比較されています。a の長さ (4) が比較相手のバイト数 (6) より小さい場合、この関数の戻り値は文字列が異なっていると誤って示される可能性があります。この比較は準拠しません。

チェック情報

グループ: 標準ライブラリ
カテゴリ: 必要
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.