exponenta event banner

ISO/IEC TS 17961 [xfilepos]

Использование значения для fsetpos, отличного от значения, возвращаемого fgetpos

Описание

Определение правила

Использование значения для fsetpos, отличного от значения, возвращенного fgetpos. [1 ]

Внедрение Polyspace

Эта проверка проверяет недопустимую позицию файла.

Примеры

развернуть все

Проблема

Недопустимая позиция файла возникает, когда аргумент позиции файла fsetpos() использует значение, которое не получено из fgetpos().

Риск

Функция fgetpos(FILE *stream, fpos_t *pos) получает текущее положение файла потока. При использовании любого другого значения в качестве аргумента позиции файла fsetpos(FILE *stream, const fpos_t *pos), вы можете получить доступ к непреднамеренному расположению в потоке.

Зафиксировать

Использовать значение, возвращенное при успешном вызове fgetpos() в качестве аргумента позиции файла fsetpos().

Пример - memset() Задание аргумента позиции файла
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


FILE *func(FILE *file)
{
    fpos_t offset;
    if (file == NULL)
    {
        /* Handle error */
    }
    /* Store initial position in variable 'offset' */
    (void)memset(&offset, 0, sizeof(offset)); 

    /* Read data from file */

    /* Return to the initial position. offset was not
	returned from a call to fgetpos()	*/
    if (fsetpos(file, &offset) != 0)          
    {
        /* Handle error */
    }
    return file;
}
        
      

В этом примере: fsetpos() использование offset в качестве аргумента позиции файла. Однако значение offset устанавливается по memset(). Предыдущий код может получить доступ к неверному местоположению в потоке.

Исправление - использовать позицию файла, возвращенную из fgetpos()

Звонить fgetpos(), и если он успешно возвращается, используйте аргумент position в вызове fsetpos().

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

FILE *func(FILE *file)
{
    fpos_t offset;
    if (file == NULL)
    {
        /* Handle error */
    }
    /* Store initial position in variable 'offset' 
    using fgetpos() */
    if (fgetpos(file, &offset) != 0)         
    {
        /* Handle error */
    }

    /* Read data from file */

    /* Back to the initial position */
    if (fsetpos(file, &offset) != 0)          
    {
        /* Handle error */
    }
    return file;
}

Проверить информацию

Разрешимость: неразрешимая
Представлен в R2019a

[1] Выдержки из стандарта «ISO/IEC TS 17961 Technical Specification - 2013-11-15» воспроизводятся с согласия AFNOR. Нормативную ценность имеет только оригинальный и полный текст стандарта, опубликованный изданиями AFNOR - доступный через веб-сайт www.boutique.afnor.org.