メインコンテンツ

異なる配列を指すポインター間の減算または比較

異なる配列を指すポインター間の減算または比較による未定義の動作の発生

説明

この欠陥は、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; 
    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;
}
     

結果情報

グループ: 静的メモリ
言語: C | C++
既定値: 手書きコードはオン、生成コードはオフ
コマンド ライン構文: PTR_TO_DIFF_ARRAY
影響度: High

バージョン履歴

R2017b で導入

すべて展開する