Misuse of narrow or wide character string

Узкая (широкая) символьная строка передала широкой (узкой) строковой функции

Описание

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

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

Риск

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

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

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

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

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

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

Фиксация

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

Примеры

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

#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);
}

Информация о результате

Группа: Программирование
Язык: C | C++
Значение по умолчанию: Off
Синтаксис командной строки: NARROW_WIDE_STR_MISUSE
Удар: высоко
ID CWE: 135
Введенный в R2018b