Неправильное употребление строки узкого или широкого символа

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

Описание

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

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

Риск

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

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

  • Усечение данных. Если строка содержит пустые байты, операция копии с помощью 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