メインコンテンツ

読み取りのない書き込み

代入後に読み取られない変数

説明

この欠陥は、変数に代入された値が読み取られなかった場合に発生します。

たとえば、変数に値を書き込んだ後、前の値を読み取る前に 2 番目の値を書き込みます。この最初の書き込み操作は冗長です。

この欠陥は、関数で書き込まれるが読み取られないポインターについては報告されません。このようなポインターは、別の場所で使用される変数のエイリアスである可能性があるためです。

リスク

冗長な書き込み操作は多くの場合、プログラミング エラーを示します。たとえば、2 つの連続した書き込み操作の間に変数を読み取るのを忘れていたり、意図せずに別の変数を読み取っていたりします。

修正方法

変数に書き込んだが、後にその変数を読み取っていない理由を特定します。名前が似ている別の変数を誤って読み取っているなど、一般的なプログラミング エラーを探します。

書き込み操作が冗長であると判断したら、その操作を削除します。

すべて展開する

void sensor_amplification(void)
{
    extern int getsensor(void);
    int level;

    level = 4 * getsensor();            
    /* Defect: Useless write */
}

変数 level に値 4 * getsensor() が代入された後、この値は読み取られていません。

修正 — 代入後に値を使用

1 つの修正方法として、代入後に変数 level を使用することができます。

#include <stdio.h>

void sensor_amplification(void)
{
    extern int getsensor(void);
    int level;

    level = 4 * getsensor(); 
    
    /* Fix: Use level after assignment */
    printf("The value is %d", level);
    
}

変数 level は新しい値を読み取ったうえで出力されます。

結果情報

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

バージョン履歴

R2013b で導入

すべて展開する