ISO/IEC TS 17961 [xfilepos]

Использование значения для fsetpos, отличного от значения, возвращенного fgetpos

Описание

Определение правила

Использование значения для fsetpos, отличного от значения, возвращенного fgetpos.[1]

Реализация Polyspace

Эта проверка проверяет недопустимое положение файла.

Примеры

расширить все

Проблема

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

Проверяйте информацию

Решимость: Undecidable
Введенный в R2019a

[1] Выдержки из стандарта «Техническая спецификация ISO/IEC TS 17961 - 2013-11-15» воспроизводятся с согласия АФНОР. Только оригинальный и полный текст стандарта, опубликованный AFNOR Editions - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.