メインコンテンツ

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

変換において修飾子を削除

変数修飾子が変換中に失われる

説明

このチェッカーは、既定の Polyspace® as You Code 解析では非アクティブにされますPolyspace as You Code 解析で非アクティブにされるチェッカー (Polyspace Access)を参照してください

この欠陥は、ポインターの変換中に、あるポインターには修飾子が含まれているが、別のポインターには修飾子が含まれていない場合に発生します。たとえば、const int* から int* に変換する場合、変換によって const 修飾子が削除されます。

この欠陥は C のプロジェクトのみに当てはまります。

リスク

ポインター宣言における const または volatile などの修飾子を考えます。

const int* ptr;
これは、基になるオブジェクトが const または volatile であることを意味します。これらの修飾子はコンパイラに対する命令として機能します。たとえば、const オブジェクトはコード内で変更されることを想定しておらず、volatile オブジェクトはコンパイラによって最適化されることを想定していません。

2 番目のポインターが同じオブジェクトを指しているが、同じ修飾子を使用していない場合、最初のポインターの修飾子は無効になります。たとえば、const int* ポインターと int* ポインターが同じオブジェクトを指している場合、2 番目のポインターを通じてオブジェクトを変更し、最初のポインターの const 修飾子による暗黙的なコントラクトに違反する可能性があります。

修正方法

あるポインターから別のポインターへの変換を意図する場合は、両方のポインターを同じ修飾子を使用して宣言します。

すべて展開する

void implicit_cast(void) {
    const char  cc, *pcc = &cc;
    char * quo;

    quo = &cc;
    quo = pcc;

    read(quo);
}

文字 q への代入で、変数 cc および pccconst char から char に変換されます。const 修飾子が変換中に削除され、欠陥が生じます。

修正 — 修飾子を追加

1 つの修正方法として、新しい変数に同じ修飾子を追加することができます。この例では、qconst char に変更することで欠陥が修正されます。

void implicit_cast(void) {
    const char  cc, *pcc = &cc;
    const char * quo;

    quo = &cc;
    quo = pcc;

    read(quo);
}
修正 — 修飾子を削除

1 つの修正方法として、変換された変数の修飾子を削除することができます。この例では、const 修飾子を cc および pcc の初期化から削除することで欠陥が修正されます。

void implicit_basic_cast(void) {
    char  cc, *pcc = &cc;
    char * quo;

    quo = &cc;
    quo = pcc;

    read(quo);
}

結果情報

グループ: プログラミング
言語: C
既定値: オフ
コマンド ライン構文: QUALIFIER_MISMATCH
影響度: Low

バージョン履歴

R2013b で導入