Анализатор обнаружил фрагмент кода, содержащий бессмысленное сравнение. С большой вероятностью данный код содержит логическую ошибку.
Пример кода:
class MyClass { public: CObj *Find(const char *name); ... } Storage; if (Storage.Find("foo") < 0) ObjectNotFound();
Кажется практически невероятным, что подобный код может присутствовать в программе. Однако причина его появления может быть достаточно проста. Предположим, что в программе имеется следующий код:
class MyClass { public: // Если объект не найден, то функция // Find возвращает значение -1. ptrdiff_t Find(const char *name); CObj *Get(ptrdiff_t index); ... } Storage; ... ptrdiff_t index = Storage.Find("ZZ"); if (index >= 0) Foo(Storage.Get(index)); ... if (Storage.Find("foo") < 0) ObjectNotFound();
Это корректный, но не изящный код. В процессе рефакторинга класс MyClass может быть переписан следующим образом:
class MyClass { public: CObj *Find(const char *name); ... } Storage;
После такой модернизации класса, необходимо исправить все места в программе, использующие функцию Find(). Первый участок кода пропустить невозможно, так как он не скомпилируется и следовательно он обязательно будет исправлен:
CObj *obj = Storage.Find("ZZ"); if (obj != nullptr) Foo(obj);
Второй фрагмент кода успешно скомпилируется и его легко пропустить, тем самым создав рассматриваемую ошибку:
if (Storage.Find("foo") < 0) ObjectNotFound();
Данная диагностика классифицируется как:
|
Взгляните на примеры ошибок, обнаруженных с помощью диагностики V503. |