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

Не путайте строки узкого и широкого символа и функции

Описание

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

Не путайте строки узкого и широкого символа и функции. [1]

Примеры

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

Описание

Неправильное употребление строки узкого или широкого символа происходит, когда вы передаете строку узкого символа широкой строковой функции или строку широкого символа к узкой строковой функции.

Неправильное употребление строки узкого или широкого символа не повышает дефекта на операционных системах, где строки узкого и широкого символа имеют тот же размер.

Риск

Используя строку узкого символа с широкой строковой функцией, или наоборот, может привести к неожиданному или неопределенному поведению.

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

  • Усечение данных. Если строка содержит пустые байты, операция копии с помощью strncpy() может остановиться рано.

  • Неправильная длина строки. strlen() возвращает количество символов строки до первого пустого байта. Широкая строка может иметь дополнительные символы после своего первого пустого байта.

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

  • Переполнение буфера. В операции копии с помощью wcsncpy() целевая строка может иметь недостаточно память, чтобы сохранить результат копии.

Фиксация

Используйте узкие строковые функции со строками узкого символа. Используйте широкие строковые функции со строками широкого символа.

Пример - передающий строки широкого символа strncpy()

#include <string.h>
#include <wchar.h>

void func(void)
{
    wchar_t wide_str1[]  = L"0123456789";
    wchar_t wide_str2[] =  L"0000000000";
    strncpy(wide_str2, wide_str1, 10);
}

В этом примере strncpy() копирует 10 широких символов от wide_strt1 до wide_str2. Если wide_str1 содержит пустые байты, операция копии может закончиться преждевременно и обрезать строку широкого символа.

Исправление — использует wcsncpy(), чтобы скопировать строки широкого символа

Одно возможное исправление должно использовать wcsncpy(), чтобы скопировать wide_str1 в wide_str2.

#include <string.h>
#include <wchar.h>

void func(void)
{
    wchar_t wide_str1[]  = L"0123456789";
    wchar_t wide_str2[] =  L"0000000000";
    wcsncpy(wide_str2, wide_str1, 10);
}

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

Группа: правило 07. Символы и строки (STR)

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

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