CERT C: Rule POS30-C

Используйте readlink () функция правильно

Описание

Управляйте определением

Используйте readlink () функция правильно. [1]

Примеры

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

Описание

Неправильное употребление readlink () происходит, когда вы передаете аргумент buffer size readlink() это не оставляет пробел для пустого терминатора строки в буфере.

Например:

ssize_t len = readlink("/usr/bin/perl", buf, sizeof(buf));
Третий аргумент точно равен размеру второго аргумента. Для достаточно больших символьных ссылок, этого использования readlink() не покидает пробел, чтобы ввести пустой терминатор строки.

Риск

readlink() функционируйте копирует содержимое символьной ссылки (первый аргумент) к буферу (второй аргумент). Однако функция не добавляет пустой терминатор строки к скопированному содержимому. После использования readlink(), необходимо явным образом добавить пустой терминатор строки в буфер.

Если вы заполняете целый буфер при использовании readlink, вы не оставляете пробел для этого пустого терминатора строки.

Фиксация

При использовании readlink() функционируйте, убедитесь, что третий аргумент является тем меньше, чем buffer size.

Затем добавьте пустой терминатор строки к буферу. Чтобы определить, где добавить пустой терминатор строки, проверяйте возвращаемое значение readlink(). Если возвращаемое значение-1, ошибка произошла. В противном случае возвращаемое значение является количеством символов скопированные (байты).

Пример - неправильный аргумент размера readlink

#include <unistd.h>

#define SIZE1024 1024

extern void display_path(const char *);

void func() {
    char buf[SIZE1024];
    ssize_t len = readlink("/usr/bin/perl", buf, sizeof(buf));
    if (len > 0) {
        buf[len - 1] = '\0';
    }
    display_path(buf);
}

В этом примере, третьем аргументе readlink точно размер буфера (второй аргумент). Если первый аргумент достаточно длинен, это использование readlink не оставляет пробел для пустого терминатора строки.

Кроме того, если никакие символы не копируются, возвращаемое значение readlink 0. Следующий оператор приводит к недостаточному наполнению буфера когда len 0.

buf[len - 1] = '\0';

Коррекция — Убеждается, что Аргумент Размера является Тем Меньше, Чем Buffer Size

Одна возможная коррекция должна убедиться что третий аргумент readlink тот меньше, чем размер второго аргумента.

Следующий откорректированный код также составляет readlink возврат 0.

#include <stdlib.h>
#include <unistd.h>

#define fatal_error() abort()
#define SIZE1024 1024

extern void display_path(const char *);

void func() {
    char buf[SIZE1024];
    ssize_t len = readlink("/usr/bin/perl", buf, sizeof(buf) - 1); 
    if (len != -1) {
        buf[len] = '\0';
        display_path(buf);
    }
    else {
        /* Handle error */
        fatal_error();
    }
}

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

Группа: правило 50. POSIX (POS)

Введенный в 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". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ВЫРАЗИЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

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