exponenta event banner

CERT C: FIO44-C правил

Использовать только значения для 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;
}

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

Группа: Правило 09. Входной выход (FIO)
Представлен в R2019a

[1] Данное программное обеспечение было создано компанией MathWorks и включает в себя следующие компоненты: «Веб-сайт SEI CERT-C», © 2017 Университет Карнеги-Меллон, веб-сайт SEI CERT-C + + © 2017 Университет Карнеги-Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги-Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ МЕЛЛОНА И/ИЛИ ЕГО ПРОГРАММНОГО ИНЖЕНЕРНОГО ИНСТИТУТА, СОДЕРЖАЩИЙСЯ В НАСТОЯЩЕМ ДОКУМЕНТЕ, ПОСТАВЛЯЕТСЯ КАК ЕСТЬ. УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ, ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, В ОТНОШЕНИИ ЛЮБЫХ ВОПРОСОВ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИИ ПРИГОДНОСТИ ДЛЯ ЦЕЛЕЙ ИЛИ ТОВАРНОЙ ПРИГОДНОСТИ, ИСКЛЮЧИТЕЛЬНОСТИ ИЛИ РЕЗУЛЬТАТОВ, ПОЛУЧЕННЫХ ОТ ИСПОЛЬЗОВАНИЯ УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ В ОТНОШЕНИИ СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКИХ ПРАВ.

Данное программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллона или его Институтом разработки программного обеспечения.