CERT C++: ENV30-C

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

Описание

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

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

Реализация Polyspace

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

Примеры

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

Проблема

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

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

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

Невходящие стандартные функции, которые возвращают не const-квалифицированный указатель на внутренний буфер включает 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);
    }
}

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

Группа: 49. Разное (MSC)
Введенный в R2019a

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

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

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