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