exponenta event banner

CERT C: STR38-C правил

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

Описание

Определение правила

Не путайте узкие и широкие символьные строки и функции. [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);
}

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

Группа: Правило 07. Символы и строки (STR)
Представлен в R2019a

[1] Данное программное обеспечение было создано компанией MathWorks и включает в себя следующие компоненты: «Веб-сайт SEI CERT-C», © 2017 Университет Карнеги-Меллон, веб-сайт SEI CERT-C + + © 2017 Университет Карнеги-Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги-Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ МЕЛЛОНА И/ИЛИ ЕГО ПРОГРАММНОГО ИНЖЕНЕРНОГО ИНСТИТУТА, СОДЕРЖАЩИЙСЯ В НАСТОЯЩЕМ ДОКУМЕНТЕ, ПОСТАВЛЯЕТСЯ КАК ЕСТЬ. УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ, ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, В ОТНОШЕНИИ ЛЮБЫХ ВОПРОСОВ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИИ ПРИГОДНОСТИ ДЛЯ ЦЕЛЕЙ ИЛИ ТОВАРНОЙ ПРИГОДНОСТИ, ИСКЛЮЧИТЕЛЬНОСТИ ИЛИ РЕЗУЛЬТАТОВ, ПОЛУЧЕННЫХ ОТ ИСПОЛЬЗОВАНИЯ УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ В ОТНОШЕНИИ СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКИХ ПРАВ.

Данное программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллона или его Институтом разработки программного обеспечения.