CERT C++: STR38-C

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

Описание

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

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

Реализация Polyspace

Эта проверка проверяет на Неправильное использование узкой или широкой символьной строки.

Примеры

расширить все

Проблема

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

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

Риск

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

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

  • Усечение данных. Если строка содержит ядро байтов, операция копирования с использованием 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(reinterpret_cast<char *>(wide_str2), reinterpret_cast<const char *>(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);
}

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

Группа: 05. Символы и строки (STR)
Введенный в R2019a

[1] Это программное обеспечение было создано MathWorks, включающее фрагменты: «Сайт SEI CERT-C», © 2017 Университет Карнеги Меллон, Веб-сайт SEI CERT-C + + © 2017 Университет Карнеги Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

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

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