メインコンテンツ

読み取り専用リソースに書き込んでいます

最初から読み取り専用として開かれたファイルが変更される

説明

この欠陥は、読み取り専用モードで開いていたファイルに書き込もうとした場合に発生します。

たとえば、あるファイルを、アクセス モード引数 r を指定した fopen を使用して開き、そのファイルに fprintf ファミリの関数で書き込みを行う場合などです。

リスク

読み取り専用ファイルに書き込むと、未定義の動作の原因となります。

修正方法

ファイルに書き込む場合は、書き込みに適したモードでファイルを開きます。

すべて展開する

#include <stdio.h>

void func(void) {
    FILE* fp ;

    fp = fopen("file.txt", "r");
    fprintf(fp, "Some data");
    fclose(fp);
}

この例では、ファイル file.txt は読み取り専用モードで開かれています。file.txt に関連付けられている FILE ポインターが fprintf の引数として使用されると、読み取り専用リソースに書き込んでいますの欠陥が発生します。

修正 — ファイルを書き込み可能として開く

1 つの修正方法として、アクセス指定子 "a" を、"r" の代わりに使用します。これで、file.txt はファイル末尾への出力ができる形で開かれます。

#include <stdio.h>

void func(void) {
    FILE* fp ;

    fp = fopen("file.txt", "a");
    fprintf(fp, "Some data");
    fclose(fp);
}

結果情報

グループ: リソース管理
言語: C | C++
既定値: 手書きコードはオン、生成コードはオフ
コマンド ライン構文: READ_ONLY_RESOURCE_WRITE
影響度: High

バージョン履歴

R2015b で導入