Рассмотрите и зафиксируйте неправильные проверки объектно-ориентированного программирования

Выполните один или несколько из этих шагов, пока вы не определите фиксацию для проверки Incorrect object oriented programming. Для описания проверки и примеров кода, смотрите Incorrect object oriented programming.

Для общего рабочего процесса, который применяется ко всем проверкам, смотрите, Интерпретируют Результаты Polyspace Code Prover.

Шаг 1: интерпретируйте информацию о проверке

На панели Results List выберите проверку. Панель Result Details отображает дополнительную информацию о проверке.

Вы видите:

  • Мгновенная причина проверки. Например:

    • Вы разыменовываете указатель функции, который имеет значение NULL или указывает на недопустимую функцию членства.

      Функция членства недопустима, если ее аргумент или возвращается, тип не совпадает с аргументом указателя или возвращает тип.

    • Вы вызываете чистую функцию членства virtual класса из конструктора класса или деструктора.

    • Вы вызываете функцию членства с помощью неправильного указателя this.

      Чтобы видеть, почему указатель this может быть неправильным, смотрите Incorrect object oriented programming.

  • Вероятная первопричина проверки, если обозначено.

Шаг 2: определите первопричину проверки

Если вы не можете определить первопричину на основе информации о проверке, используйте ярлыки навигации в пользовательском интерфейсе, чтобы перейти к первопричине.

На основе определенной ошибки используйте один из следующих методов, чтобы найти первопричину.

ОшибкаКак найти первопричину
Вы разыменовываете указатель функции, который имеет значение NULL.

Щелкните правой кнопкой по указателю функции и выберите Search For All References. Найдите экземпляр, где вы присваиваете NULL указателю функции.

Вы разыменовываете указатель функции, который указывает на недопустимую функцию членства.

Сравните аргумент и возвратите типы указателя функции и функции членства, на которую это указывает.

  1. Щелкните правой кнопкой по указателю функции по Source, разделяют на области и выбирают Search For All References. Найдите экземпляры где вы:

    • Задайте указатель функции.

    • Присвойте адрес функции членства к указателю функции.

  2. Найдите определение функции членства. Щелкните правой кнопкой по имени функции членства по Source, разделяют на области и выбирают Go To Definition.

Вы вызываете чистую функцию членства virtual от конструктора или деструктора.

Найдите объявление функции элемента и определите, намеревались ли вы объявить его как virtual или чистый virtual. Также определите, можно ли заменить вызов чистой функции virtual с другой операцией, например, вызов различной функции членства.

  1. Щелкните правой кнопкой по имени функции по Source, разделяют на области и выбирают Search for function_name in All Source Files.

  2. Найдите объявление функции от результатов поиска.

    Чистая функция virtual имеет объявление, такое как:

    virtual void func() = 0;

Вы вызываете функцию членства с помощью неправильного указателя this.

Определите, почему указатель this является неправильным.

Например, если красная проверка Incorrect object oriented programming появляется на вызове функции, ptr->func() и сообщение указывают, что указатель this является неправильным, проследите поток данных для ptr.

  • Щелкните правой кнопкой по указателю функции по Source, разделяют на области и выбирают Search For All References.

  • Просмотрите все операции записи на указателе. Ищите следующие проблемы:

    • Бросьте между указателями несвязанных типов.

    • Адресная арифметика с указателями, которая берет указатель вне его позволенного буфера, например, границ массива.

Если красная проверка Incorrect object oriented programming появляется на вызове функции obj.func(), проследите поток данных для obj. Смотрите, не инициализируется ли obj ранее.