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 |
Удар: низко |