Недопустимое положение файла

fsetpos() вызывается с аргументом положения файла, не полученным из fgetpos()

Описание

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

Риск

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

Фиксация

Используйте значение, возвращенное от успешного вызова до fgetpos() в качестве аргумента положения файла 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' */
    (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(), и если он возвращается успешно, используйте аргумент положения в своем вызове 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;
}

Информация о результате

Группа: Программирование
Язык: C | C++
Значение по умолчанию: 'off'
Синтаксис командной строки: INVALID_FILE_POS
Влияние: носитель

Введенный в R2017b