CERT C: Rule POS34-C

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

Описание

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

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

Реализация Polyspace

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

Примеры

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

Проблема

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

Риск

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

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

Использование 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 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

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

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