メインコンテンツ

ISO/IEC TS 17961 [restrict]

同じオブジェクトを指すポインターを異なる制限修飾子付きパラメーターに引数として渡す

説明

ルール定義

同じオブジェクトを指すポインターを異なる制限修飾子付きパラメーターに引数として渡す。1

Polyspace 実装

このチェッカーは、オーバーラップするメモリのコピーですをチェックします。

すべて展開する

問題

オーバーラップするメモリのコピーですは、memcpystrcpy などのコピー関数のソース引数とコピー先引数の間にメモリ オーバーラップがある場合に発生します。たとえば、strcpy のソース引数とコピー先引数が、同じ文字列の異なった要素を指すポインターである場合などです。

リスク

コピー関数のソース引数とコピー先引数の間にメモリ オーバーラップがある場合、C 標準によると、動作は未定義になります。

修正方法

メモリ オーバーラップが望ましいものであるかどうかを判断します。もしそうであれば、代替となる関数を見つけます。次に例を示します。

  • memcpy を使用して値を 1 つのメモリ位置から別のメモリ位置にコピーしている場合は、memmovememcpy の代わりに使用します。

  • strcpy を使用して 1 つの文字列を別の文字列にコピーしている場合は、次のように、memmovestrcpy の代わりに使用します。

    s = strlen(source);
    memmove(destination, source, s + 1);

    strlen は null 終端を除いた文字列長を決定します。したがって、s バイトではなく s+1 バイトを移動させなければなりません。

例 - オーバーラップするコピー
#include <string.h>

char str[] = {"ABCDEFGH"};

void my_copy() {
    strcpy(&str[0],(const char*)&str[2]);
}

この例では、ソース引数とコピー先引数が、同じ文字列 str を指すポインターであるため、それらの許容されるバッファー間にメモリ オーバーラップがあります。

チェック情報

決定可能性:決定不可能

バージョン履歴

R2019a で導入


1 Extracts from the standard "ISO/IEC TS 17961 Technical Specification - 2013-11-15" are reproduced with the agreement of AFNOR. Only the original and complete text of the standard, as published by AFNOR Editions - accessible via the website www.boutique.afnor.org - has normative value.