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

Выполните один или несколько из этих шагов, пока вы не определите фиксацию для проверки 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 и выберите Поиск function_name во всех исходных файлах.

  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 не инициализируется ранее.