Описание
Недопустимое положение файла происходит когда аргумент положения файла 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(), и если это возвращается успешно, используйте аргумент положения в своем вызове 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;
}