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