メインコンテンツ

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

CWE Rule 469

Use of Pointer Subtraction to Determine Size

R2023a 以降

説明

ルールの説明

The application subtracts one pointer from another in order to determine size, but this calculation can be incorrect if the pointers do not exist in the same memory chunk.

Polyspace 実装

ルール チェッカーは、[異なる配列を指すポインター間の減算または比較] をチェックします。

すべて展開する

問題

この問題は、null ポインターまたは別の配列内の要素を指しているポインターを減算または比較した場合に発生します。比較の関係演算子は ><>=、および <= です。

リスク

同じ配列内の要素を指す 2 つのポインターを減算する場合、結果は 2 つの配列要素の添字の間の差になります。同様に、配列の要素を指す 2 つのポインターを比較する場合、結果は相対的なポインターの位置になります。ポインターが null または異なる配列の要素を指している場合、減算や比較演算は未定義です。減算結果をバッファー インデックスとして使用する場合、バッファー オーバーフローが発生する可能性があります。

修正方法

配列要素を指すポインターの減算や比較演算子による比較を行う前に、ポインターが非 null であり同じ配列を指していることをチェックします。

例 — 異なる配列内の要素を指すポインター間の減算
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE20 20

size_t func(void)
{
    int nums[SIZE20];
    int end;
    int *next_num_ptr = nums;
    size_t free_elements;
	/* Increment next_num_ptr as array fills */
	
	/* Subtraction operation is undefined unless array nums 
	is adjacent to variable end in memory. */
    free_elements = &end - next_num_ptr;  //Noncompliant
    return free_elements;
}
    
      

この例では、配列 nums がインクリメントされて埋めらます。その後、空の要素がいくつ残っているか判断するためにポインターの減算が使用されます。endnums の最後の要素を超えたメモリ位置を指していない限り、減算演算は未定義です。

修正 — 同じ配列を指すポインターを減算

配列の最後の要素を指すポインターから埋められた最後の要素を指すポインターを減算します。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE20 20

size_t func(void)
{
    int nums[SIZE20];
    int *next_num_ptr = nums;
    size_t free_elements;
	/* Increment next_num_ptr as array fills */
	
	/* Subtraction operation involves pointers to the same array. */
    free_elements = &(nums[SIZE20 - 1]) - next_num_ptr;  
	
    return free_elements + 1;
}
     

チェック情報

カテゴリ: Pointer Issues

バージョン履歴

R2023a で導入