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