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' を使用しているため、上記のコードは準拠しています。