Invalid file position

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()и, если он возвращается успешно, используйте аргумент 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;
}

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

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