exponenta event banner

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

Не изменять объект, на который ссылается возвращаемое значение определенных функций

Описание

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

Не изменяйте объект, на который ссылается возвращаемое значение определенных функций. [1 ]

Внедрение Polyspace

Эта проверка проверяет модификацию внутреннего буфера, возвращенного из неинтенсивной стандартной функции.

Примеры

развернуть все

Проблема

Изменение внутреннего буфера, возвращаемого неназначенной стандартной функцией, происходит в следующих случаях:

  • Неназначенная стандартная функция возвращает указатель.

  • Выполняется попытка записи в память, на которую указывает указатель.

неназначенные стандартные функции, возвращающие const-квалифицированный указатель на внутренний буфер include getenv, getlogin, crypt, setlocale, localeconv, strerror и другие.

Риск

Изменение внутреннего буфера, возвращаемого неназначенной стандартной функцией, может привести к следующим проблемам:

  • Возможно, что изменение не будет успешным или изменит другие внутренние данные.

    Например, getenv возвращает указатель на значение переменной среды. При изменении этого значения изменяется среда процесса и повреждаются другие внутренние данные.

  • Даже в случае успешного изменения возможно, что последующий вызов той же стандартной функции не вернет измененное значение.

    Например, можно изменить значение переменной среды, getenv возвращает. Если вызывается другой процесс, поток или обработчик сигналов setenvизмененное значение перезаписывается. Следовательно, последующий вызов getenv не возвращает измененное значение.

Зафиксировать

Избегайте изменения внутреннего буфера с помощью указателя, возвращаемого функцией.

Пример - Изменение getenv Возвращаемое значение
#include <stdlib.h>
#include <string.h>

void printstr(const char*);

void func() {
    char* env = getenv("LANGUAGE");
    if (env != NULL) {
        strncpy(env, "C", 1);
        printstr(env);
    }
}

В этом примере первый аргумент strncpy - возвращаемое значение из неназначенной стандартной функции getenv. Поведение может быть неопределенным, поскольку strncpy изменяет этот аргумент.

Исправление - Копировать возвращаемое значение getenv и Изменить копию

Одним из возможных решений является копирование возвращаемого значения getenv и передать копию в strncpy функция.

#include <stdlib.h>
#include <string.h>
enum {
    SIZE20 = 20
};

void printstr(const char*);

void func() {
    char* env = getenv("LANGUAGE");
    if (env != NULL) {
        char env_cp[SIZE20];
        strncpy(env_cp, env, SIZE20);  
        strncpy(env_cp, "C", 1);        
        printstr(env_cp);
    }
}

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

Группа: Правило 10. Окружающая среда (ENV)
Представлен в R2019a

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

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

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