メインコンテンツ

MISRA C:2023 Rule 19.1

An object shall not be assigned or copied to an overlapping object

R2024a 以降

説明

ルール定義

An object shall not be assigned or copied to an overlapping object 1 .

根拠

オブジェクトをメモリがオーバーラップしている別のオブジェクトにコピーする場合、動作は未定義です。例外は次のとおりです。

  • あるオブジェクトを、メモリが厳密にオーバーラップしており、かつ互換性のある型の別のオブジェクトに代入する。

  • memmove を使用して、あるオブジェクトを別のオブジェクトにコピーする。

トラブルシューティング

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

すべて展開する

void func (void) {
    union {
        short i;
        int j;
    } a = {0}, b = {1};
    
    a.j = a.i;   /* Non-compliant */
    a = b;       /* Compliant */
}

この例では、a.ia.j に代入される場合、ルールに違反します。2 つの変数にオーバーラップしているメモリ領域があるためです。

#include <string.h>

int arr[10];

void func(void) {
    memcpy (&arr[5], &arr[4], 2u * sizeof(arr[0]));    /* Non-compliant */
    memcpy (&arr[5], &arr[4], sizeof(arr[0]));         /* Compliant */
    memcpy (&arr[1], &arr[4], 2u * sizeof(arr[0]));    /* Compliant */
}

この例では、sizeof(arr[0]) の 2 倍に等しいメモリは 2 つの配列要素に占められるメモリ領域になります。メモリ領域が &a[4] および &a[5] から開始する場合、2 つのメモリ領域はオーバーラップします。関数 memcpy がこれら 2 つのオーバーラップするメモリ領域の内容をコピーするのに使用される場合、ルールに違反します。

typedef struct
{
    char init_string[21];
    char new_string[101];
} string_aggr;


string_aggr my_string_aggr;

void copy()
{
    strncpy(&my_string_aggr.new_string[0], /* Non-compliant */
            &my_string_aggr.init_string[0], 100U);  
}

この例では、集合構造体 my_string_aggr のメンバー init_string は 21 文字で構成されています。ただし、このメンバーの文字数が 21 文字を超える場合、余分な文字は隣接メンバー new_string にコピーされ、オーバーラップするコピーが生じます。

チェック情報

グループ: 重複ストレージ
カテゴリ: Mandatory
AGC カテゴリ: Mandatory

バージョン履歴

R2024a で導入


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.