ISO/IEC TS 17961 [libmod]

Изменение строки, возвращаемой getenv, localeconv, setlocale и strerror

Описание

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

Изменение строки, возвращаемой getenv, localeconv, setlocale и strerror.[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);
    }
}

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

Решимость: Undecidable
Введенный в R2019a

[1] Выдержки из стандарта «Техническая спецификация ISO/IEC TS 17961 - 2013-11-15» воспроизводятся с согласия АФНОР. Только оригинальный и полный текст стандарта, опубликованный AFNOR Editions - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.