Проблема
Недопустимое положение файла происходит когда аргумент положения файла 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;
}