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
Влияние: Высокий
ИДЕНТИФИКАТОР CWE : 135
Введенный в R2018b