メインコンテンツ

定数制限付きオブジェクトに書き込んでいます

const 修飾子で宣言されているオブジェクトが変更されている

説明

この欠陥は、次のいずれかが行われた場合に発生します。

  • const 修飾子付きのオブジェクトを代入先として使用する。

  • const 修飾子付きのオブジェクトを、引数を変更する関数に渡す。

たとえば、この欠陥は次のような状態で発生します。

  • const 修飾子付きのオブジェクトが、次に挙げるいずれかの関数で最初の引数として渡されている。

    • mkstemp

    • mkostemp

    • mkostemps

    • mkdtemp

  • const 修飾子付きのオブジェクトが、次に挙げるいずれかの関数の適用先引数として渡されている。

    • strcpy

    • strncpy

    • strcat

    • memset

  • const 修飾子付きのオブジェクトに対し、書き込み操作が実行されている。

リスク

リスクは、const 修飾子付きオブジェクトに対する変更内容によって異なります。

状態リスク
mkstempmkostempmkostempsmkdtemp などに渡すこれらの関数では、最初の引数の最後の 6 文字が文字列に置き換えられる。したがって、変更可能な char 配列が最初の引数として必要とされる。
strcpystrncpystrcatmemset などに渡すこれらの関数では、適用先引数が変更される。したがって、変更可能な char 配列が適用先引数として必要とされる。
オブジェクトへの書き込みconst 修飾子には、そのオブジェクトの値は変更されないという取り決めが含意されている。const 修飾子付きのオブジェクトへの書き込みは、その取り決めに違反する。操作の結果は未定義となる。

修正方法

修正方法は、const 修飾子付きオブジェクトに対する変更内容によって異なります。

状態修正方法
mkstempmkostempmkostempsmkdtemp などに渡す関数の最初の引数として、非 const オブジェクトを渡す。
strcpystrncpystrcatmemset などに渡す関数の適用先引数として、非 const オブジェクトを渡す。
オブジェクトへの書き込み書き込み操作を、非 const オブジェクトに対して実行する。

以下の修正例を参照してください。

問題を修正しない場合は、改めてレビューされないように結果またはコードにコメントを追加します。詳細は、以下を参照してください。

すべて展開する

#include <string.h>
const int **constpp2int;
int *p2int;
const int cint = 5;
void func(const char *buff)
{
// Modifying a const char    
        strcpy((char*)buff, "XXXXXX"); /*Noncompliant */
// Modifying a const pointer        
  constpp2int = &p2int; 
  //...
  *constpp2int = &cint; 
  //...
  *p2int = 0;   /* Noncompliant */        
       

}

この例では、buffconst で修飾されているため、変数の変更は違反になります。const 整数 cint は、*p2int0 に設定されたときに変更されます。Polyspace®const オブジェクトが変更された場合に欠陥を報告します。

修正 — const 修飾子付きのオブジェクトを非 const オブジェクトにコピー

変更されることが意図されているオブジェクトに const 修飾子を使用しないでください。


#include <string.h>
const int **constpp2int;
int *p2int;
int cint = 5;
void func( char *buff)
{
// Modifying a const char    
        strcpy((char*)buff, "XXXXXX"); /*Compliant */
// Modifying a const pointer        
  constpp2int = &p2int; 
  //...
  *constpp2int = &cint; 
  //...
  *p2int = 0;   /* Compliant */        
       

}

結果情報

グループ: プログラミング
言語: C | C++
既定値: 手書きコードはオン、生成コードはオフ
コマンド ライン構文: CONSTANT_OBJECT_WRITE
影響度: High

バージョン履歴

R2015b で導入