メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

MISRA C:2012 Rule 18.2

Subtraction between pointers shall only be applied to pointers that address elements of the same array

説明

ルール定義

Subtraction between pointers shall only be applied to pointers that address elements of the same array 1 .

根拠

このルールは、pointer_expression1 - pointer_expression2 形式の式に適用されます。pointer_expression1 および pointer_expression2 が次のいずれかである場合、動作は未定義になります。

  • 同じ配列の要素を指していない。

  • 配列の終端を超えた要素を指していない。

Polyspace 実装

null ポインターまたは別の配列内の要素を指しているポインターを減算すると、Polyspace® はこのルールに対する違反を報告します。

現行の解析で、減算演算で使用されるポインターのいずれかが Polyspace に対して未知である場合、このルールの違反は報告されません。たとえば次のコードでは、Polyspace は arg_ptr および temp の基になるオブジェクトを判断できません。

extern int *getPtr();
void foo(int *arg_ptr) {
	int diff, diff2;
	int c_str[50];
	int *temp = getPtr();

	int diff = c_str - arg_ptr; //No violation
	int diff2 = c_str - tmp;  //No violation
}
これらのポインターが関係する減算は、このルールの違反として報告されません。

トラブルシューティング

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

すべて展開する

#include <stddef.h>
#include <stdint.h>

void f1 (int32_t *ptr)
{
    int32_t a1[10];
    int32_t a2[10];
    int32_t *p1 = &a1[ 1];
    int32_t *p2 = &a2[10];
    ptrdiff_t diff1, diff2, diff3;

    diff1 =  p1 - a1;   // Compliant
    diff2 =  p2 - a2;   // Compliant
    diff3 =  p1 - p2;   // Noncompliant
}

この例では、3 つの減算式で、ポインターの減算が準拠か非準拠かの相違が示されます。減算 diff1 および diff2 は、ポインターが同じ配列を指しているので準拠しています。減算 diff3 は、p1p2 が異なった配列を指しているため準拠していません。

#include <stddef.h>
#include <stdint.h>

void f1()
{
	int32_t var1, var2 = 20;
	int32_t* i;
	int32_t* j;

	i = &var1;
	j = &var2;

	int32_t diff4;

	diff4 = i - j;	//Noncompliant
}

この例では、ポインター ij が配列へのポインターではないため、減算 diff4 が準拠していません。

チェック情報

グループ: ポインターと配列
カテゴリ: 必要
AGC カテゴリ: 必要

バージョン履歴

すべて展開する


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.