exponenta event banner

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

Не вызывать putenv () с указателем на автоматическую переменную в качестве аргумента

Описание

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

Не вызывайте putenv () с указателем на автоматическую переменную в качестве аргумента. [ 1]

Внедрение Polyspace

Эта проверка проверяет использование автоматической переменной в качестве аргумента функции putenv-family.

Примеры

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

Проблема

Использование автоматической переменной в качестве putenv- аргумент функции family возникает, когда аргумент putenvФункция -family является локальной переменной с автоматической длительностью.

Риск

Функция putenv(char *string) вставляет указатель на предоставленный аргумент в массив среды вместо создания копии аргумента. Если аргумент является автоматической переменной, его память может быть перезаписана после функции, содержащей putenv() возврат вызова. Последующий вызов getenv() из другой функции возвращает адрес переменной вне области действия, которая не может быть дереферифицирована юридически. Эта переменная вне области действия может привести к тому, что переменные среды приобретут непредвиденные значения, перестанут отвечать программе или допустят уязвимости при выполнении произвольного кода.

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

Использовать setenv()/unsetenv() для установки и отмены настройки переменных среды. В качестве альтернативы можно использовать putenv-семейные аргументы функции с динамически выделенной памятью или, если приложение не требует повторного входа, аргументы со статической длительностью. Например, выполнение одного потока без рекурсии или прерываний не требует повторного входа. Его невозможно вызвать (повторно ввести) во время выполнения.

Пример - Автоматическая переменная в качестве аргумента putenv()
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE1024 1024

void func(int var)
{
    char env[SIZE1024];
    int retval = sprintf(env, "TEST=%s", var ? "1" : "0");
    if (retval <= 0) {
        /* Handle error */
    }
	/* Environment variable TEST is set using putenv().
	The argument passed to putenv is an automatic variable. */
    retval = putenv(env);   
    if (retval != 0) {
        /* Handle error */
    }
}
              

В этом примере: sprintf() сохраняет символьную строку TEST=var в env. Значение переменной среды TEST затем устанавливается в значение var с помощью putenv(). Поскольку env - автоматическая переменная, значение TEST может измениться один раз func() возвращает.

Коррекция - использование static Переменная для аргумента putenv()

Объявить env как переменная статической длительности. Расположение памяти env не перезаписывается в течение программы, даже после func() возвращает.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE1024 1024 
void func(int var)
{
	/* static duration variable */
    static char env[SIZE1024]; 
    int retval = sprintf(env,"TEST=%s", var ? "1" : "0");
    if (retval <= 0) {
        /* Handle error */
    }
	
	/* Environment variable TEST is set using putenv() */
    retval=putenv(env);   
	if (retval != 0) {
        /* Handle error */
    }
}
Коррекция - использование setenv() Установка значения переменной среды

Установка значения TEST кому var, использовать setenv().

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE1024 1024 

void func(int var)
{
	/* Environment variable TEST is set using setenv() */
    int retval = setenv("TEST", var ? "1" : "0", 1); 
	
    if (retval != 0) {
        /* Handle error */
    }
}

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

Группа: Правило 50. POSIX (POS)
Представлен в R2019a

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

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

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