exponenta event banner

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

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++
По умолчанию: Откл.
Синтаксис командной строки: INVALID_FILE_POS
Воздействие: среднее
Представлен в R2017b