CERT.FSETPOS.VALUE

'fsetpos()' 関数の引数として使用できるのは、'fgetpos()' 関数から返された値のみです。

CERT.FSETPOS.VALUE チェッカーは、'fgetpos()' 関数によって作成されなかった fpos_t 型の引数によって 'fsetpos()' 関数が呼び出された場合にフラグを立てます。

脆弱性とリスク

'fgetpos()' 関数によって作成されなかった fpos_t 型の引数で 'fsetpos()' 関数を呼び出すと、未定義の動作が発生します。

軽減と防止

'fgetpos()' 関数から返される位置の値を、'fsetpos()' 関数が常に使用することを確認します。

脆弱コード例

コピー
   #include <stdio.h>
   #include <string.h>

   int opener(FILE *file)
   {
       int rc;
       fpos_t offset;
       memset(&offset, 0, sizeof(offset));

      if (file == NULL) {
         return -1;
      }

      /* Read in data from file */
      fsetpos(file, &offset);
      if (rc != 0 ) {
          return rc;
      }
      return 0;
  }

この非準拠の例では、fsetpos() 関数は fgetpos() 関数が作成しなかった値 'offset' を使用しているため、Klocwork は 15 行目で CERT.FSETPOS.VALUE の欠陥を報告します。

修正コード例

コピー
    #include <stdio.h>
    #include <string.h>
    int opener(FILE *file)
    {
        int rc;
        fpos_t offset;
        memset(&offset, 0, sizeof(offset));

        if (file == NULL) {
           return -1;
       }
       fgetpos(file, &offset);
       /* Read in data from file */
       fsetpos(file, &offset);
       if (rc != 0 ) {
           return rc;
       }

       return 0;
   }

fsetpos() 関数は fgetpos() 関数が以前に作成した値 'offset' を使用しているため、上記のコードは準拠しています。

外部参考資料