Incorrect use of offsetof in C++

Неправильные аргументы к offsetof макрос вызывает неопределенное поведение

Описание

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

offsetof макрос:

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

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

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

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

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

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

Риск

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

Фиксация

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

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

Примеры

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

#include <cstddef>

class myClass {
     int member1;
  public:
     int member2;
};

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

В этом примере, класс 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);
  // ...
}

Информация о результате

Группа: Программирование
Язык: C++
Значение по умолчанию: На для рукописного кода, прочь для сгенерированного кода
Синтаксис командной строки: OFFSETOF_MISUSE
Удар: Средняя
Введенный в R2019a