exponenta event banner

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

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

Описание

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

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

Риск

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

При передаче широкой символьной строки узкой строковой функции могут возникнуть следующие проблемы:

  • Усечение данных. Если строка содержит пустые байты, операция копирования с использованием 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++
По умолчанию: Откл.
Синтаксис командной строки: NARROW_WIDE_STR_MISUSE
Воздействие: Высокое
ИДЕНТИФИКАТОР CWE : 135
Представлен в R2018b