Строки 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().
Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.
| Группа: библиотека ввода/вывода |
| Категория: необходимый, автоматизированный |