CERT.FSETPOS.VALUE

只有从 fgetpos() 函数返回的值才能用作 fsetpos() 函数的参数。

CERT.FSETPOS.VALUE 检查器会标记 fsetpos() 函数被不是由 fgetpos() 函数创建的 fpos_t 类型参数调用的情况。

漏洞与风险

如果使用不是由 fgetpos() 函数创建的 fpos_t 类型参数来调用 fsetpos() 函数,可能会导致未定义的行为。

缓解与预防

验证 fsetpos() 函数是否始终使用从 fgetpos() 函数返回的位置值。

漏洞代码示例

复制
   #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;
  }

在此不符合要求的示例中,Klocwork 在第 15 行报告了 CERT.FSETPOS.VALUE 缺陷,因为 fsetpos() 函数使用了不是由 fgetpos() 函数创建的值 offset。

修正代码示例

复制
    #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。