CERT C: Rule 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);
    }
}

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

Группа: правило 10. Среда (ENV)

Введенный в R2019a


[1]  Это программное обеспечение было создано MathWorks, включающим фрагменты: “Веб-сайт SEI CERT-C”, © 2017 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

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

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