CERT C++: EXP59-CPP

Используйте offsetof () на допустимых типах и членах

Описание

Управляйте определением

Используйте offsetof () на допустимых типах и members.[1]

Реализация Polyspace

Это средство проверки проверяет на Неправильное использование offsetof на C++.

Примеры

развернуть все

Проблема

Этот дефект происходит, когда вы передаете аргументы offsetof макрос, для которого не задано поведение макроса.

offsetof макрос:

offsetof(classType, aMember)
возвращает смещение в байтах элемента данных aMember с начала объекта типа classType. Для использования в offsetof, classType и aMember имейте определенные ограничения:

  • classType должен быть стандартный класс макета.

    Например, это не должно иметь virtual функции членства. Для получения дополнительной информации о требованиях для стандартного класса макета смотрите C++, названный требованиями: StandardLayoutType.

  • aMember не должно быть статическим.

  • aMember не должна быть функция членства.

Средство проверки отмечает использование offsetof макрос, где аргументы нарушают один или несколько из этих ограничений.

Риск

Нарушение ограничений на аргументы offsetof макрос приводит к неопределенному поведению.

Фиксация

Используйте offsetof макрос только на нестатических элементах данных стандартного класса макета.

Результат детализирует состояние который ограничение на offsetof макрос нарушен. Зафиксируйте нарушение.

Пример – использование offsetof Макрос с нестандартным классом макета
#include <cstddef>

class myClass {
     int privateData;
  public:
     int publicData;
};

void func() {
  size_t off = offsetof(myClass, publicData);
  // ...
}

В этом примере, класс myClass имеет два элемента данных с различным управлением доступом, одним частным и другой общественностью. Поэтому класс не удовлетворяет требованиям стандартного класса макета и не может использоваться с offsetof макрос.

Коррекция — использует универсальное управление доступом для всех элементов данных

Если использование offsetof важно для приложения, убедитесь, что первый аргумент является классом со стандартным размещением. Например, смотрите, можно ли работать вокруг потребности в общедоступном элементе данных.

#include <cstddef>
  
class myClass {
     int member1;
     int member2;
  public:
     int getMember2(void) { return member2;}
     friend void func(void);
};
  
void func() {
  size_t off = offsetof(myClass, member2);
  // ...
}

Проверяйте информацию

Группа: 02. Выражения (EXP)
Введенный в R2019a

[1]  Это программное обеспечение было создано MathWorks, включающим фрагменты: “Веб-сайт SEI CERT-C”, © 2017 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ-МЕЛЛОН И/ИЛИ ЕГО ИНСТИТУТА ПРОГРАММНОЙ ИНЖЕНЕРИИ СОДЕРЖАЛ, ЗДЕСЬ ПРЕДОСТАВЛЯЕТСЯ НА ОСНОВЕ "ASIS". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ОПИСАЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

Это программное обеспечение и сопоставленная документация не были рассмотрены, ни являются подтвержденным Университетом Карнеги-Меллон или его Институтом программной инженерии.