Неправильное использование offsetof на C++

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

Описание

Неправильное использование offsetof на C++ происходит, когда вы передаете аргументы макросу 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 privateData;
  public:
     int publicData;
};

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

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

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

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

#include <cstddef>
  
class myClass {
     int privateData;
     int publicData;
  public:
     int getpublicData(void) { return publicData;}
};
  
void func() {
  size_t off = offsetof(myClass, publicData);
  // ...
}

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

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

Введенный в R2019a