Строки C-стиля не должны использоваться
Строки C-стиля не должны использоваться.
Базовый символьный массив, который хранит строку C-стиля, имеет много недостатков, таких как:
Необходимо явным образом обработать выделение памяти и освобождение, если вы выполняете операции на строке, которые требуют нетривиальных манипуляций с памятью.
Это не всегда ясно ли char*
точки к отдельному символу или к строке C-стиля.
Вы можете случайно преобразовать массив в необработанный указатель, когда вы передаете его значением или указателем на функцию, которая приводит к потере информации о размере массивов (затухание массивов). Например, в этом фрагменте кода, func
распечатывает размер указателя на первый символ cString
(8), в то время как фактический размер cString
6.
void func(char *c){ //function takes array by value cout << sizeof(c); } void main(){ char cString[]{ "pizza" }; //Size is 6 (5 characters + null terminator) func(cString); // Size is 8 (size of char*) }
Вместо этого используйте std::string
класс, чтобы сохранить последовательность символов. Класс обрабатывает выделения и освобождение, и инстанцирует объекта, который можно безопасно передать функциям. Класс также имеет встроенные функциональности, чтобы управлять строкой, такой как итераторы.
Polyspace® отмечает использование:
Указатели, чтобы обуглиться (char*
) и массивы char (char someArray[]
).
Указатели на и массивы char со спецификатором типа, такие как volatile
или const
. Например, char const*
.
Указатели на и массивы типа wchar_t
, char16_t
, и char32_t
.
Если у вас есть объявление функции и его определение в вашем исходном коде, Polyspace помещает нарушение в функциональное определение. Например:
const char* greeter(void); //.... const char* greeter(void){ //Non-compliant return "Hello"; }
Polyspace не отмечает использование:
Указатели на или массивы signed
или unsigned
'char'. Например, signed_c
и unsigned_arr
не отмечаются в этом фрагменте кода:
signed char* signed_c; unsigned char unsigned_arr[2048];
Литеральные строки. Например, возвращаемое значение greeter()
не отмечается в этом фрагменте кода, но использовании const char*
в первой линии отмечается:
const char* greeter(void){ //Non-compliant return "Hello"; // Compliant }
Параметры main()
.
Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.
Группа: библиотека ввода/вывода |
Категория: необходимый, автоматизированный |