Строки в стиле C не должны использоваться
Строки в стиле C не должны использоваться.
Базовый символьный массив, который хранит строку в стиле C, имеет много недостатков, таких как:
Вы должны явным образом обработать выделение и удаление памяти, если вы выполняете операции со строкой, которые требуют нетривиальных манипуляций с памятью.
Не всегда понятно, char*
ли указывает на один символ или на строку в стиле С.
Вы можете случайно преобразовать массив в необработанный указатель, когда передаете его по значению или по указателю на функцию, что приводит к потере информации о размере массива (распад массива). Например, в этом фрагменте кода, 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 (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()
.
Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».
Группа: Библиотека ввода/вывода |
Категория: Необходимый, Автоматизированный |