string::c_str() compared to
pointerСтруна до получена из std::string::c_str() сравнивается с указателем (или NULL)
Этот дефект происходит, когда струна до, которая получена путем вызова std::string::c_str функция сравнивается с указателем или NULL. Например, Polyspace® отмечает операции сравнения в if операторы в этом коде:
void foo(){
//...
std::string str{"loren ipsum"};
//...
const char pStr[] = "loren ipsum";
const char* p = str.c_str();
if(p==NULL){//Defect: Unnecessary
}
if(p==pStr){ //Defect: Compares pointer address
//..
}
//..
}
Сравнение указателя на струну до получено из string имеет эти риски:
Когда вы сравниваете выход std::string::c_str к указателю сравнены адреса указателей. Вы можете ожидать, что компилятор сравнит содержимое указателей. Например, в предыдущем коде, вы можете ожидать тот (p==pStr) оценивает к true потому что оба указателя содержат loren ipsum. Компилятор сравнивает адреса p и pStr, который оценивает к false. Сравнение указателей как метод сравнения строк приводит к неожиданным результатам.
Струна до p это получено путем вызова std::string::c_str() является всегда непустым. Выражение (p==NULL) всегда оценивает к false. Сравнение такой струны до к NULL может привести к неожиданным результатам и указывает на логическую ошибку в коде.
Устранить эту проблему:
Чтобы сравнить содержимое строк, используйте строковые функции или используйте операторы с объектами строки непосредственно.
Поскольку std::string::c_str() всегда возвращает ненулевое значение, удалите сравнение с NULL или осуществите рефакторинг свою логику.
| Группа: Программирование |
| Язык: C++ |
| Значение по умолчанию: Off |
Синтаксис командной строки:
STD_STRING_C_STR_COMPARED_TO_POINTER |
| Удар: низко |