CERT C++: STR38-C

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

Описание

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

Не путайте строки узкого и широкого символа и functions.[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(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);
}

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

Группа: 05. Символы и строки (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". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ОПИСАЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

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