CERT C: правило EXP43-C

Избегайте, чтобы неопределенное поведение при использовании ограничило - квалифицированные указатели

Описание

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

Избегайте, чтобы неопределенное поведение при использовании ограничило - квалифицированные указатели. [1]

Примеры

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

Описание

Копия перекрывающейся памяти происходит, когда существует перекрытие памяти между источником и целевым аргументом функции копии, такой как memcpy или strcpy. Например, источник и целевые аргументы strcpy являются указателями на различные элементы в той же строке.

Риск

Если существует перекрытие памяти между источником и целевыми аргументами функций копии, согласно стандартам C, поведение не определено.

Фиксация

Определите, является ли перекрытие памяти тем, что вы хотите. Если так, найдите альтернативную функцию. Например:

  • Если вы используете memcpy, чтобы скопировать значения от одной ячейки памяти до другого, используйте memmove вместо memcpy.

  • Если вы используете strcpy, чтобы скопировать одну строку в другого, используйте memmove вместо strcpy, можно следующим образом:

    s = strlen(source);
    memmove(destination, source, s + 1);

    strlen определяет длину строки без пустого терминатора строки. Поэтому необходимо переместить байты s+1 вместо байтов s.

Пример - перекрывающий копию

#include <string.h>

char str[] = {"ABCDEFGH"};

void my_copy() {
    strcpy(&str[0],(const char*)&str[2]);
}

В этом примере, потому что источник и целевой аргумент являются указателями на ту же строку str, между их позволенными буферами существует перекрытие памяти.

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

Группа: правило 03. Выражения (EXP)

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

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