Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

The macro offsetof(type, member-designator) accepts a restricted set of type arguments in this International Standard. If type is not a standard-layout class, the results are undefined. The expression offsetof(type, member-designator) is never type-dependent and it is value-dependent if and only if type is dependent. The result of applying the offsetof macro to a field that is a static data member or a function member is undefined. No operation invoked by the offsetof macro shall throw an exception and noexcept(offsetof(type, member-designator)) shall be true.

When specifying the type argument for the offsetof() macro, pass only a standard-layout class. The full description of a standard-layout class can be found in paragraph 7 of the [class] clause of the C++ Standard, or the type can be checked with the std::is_standard_layout<> type trait. When specifying the member designator argument for the offsetof() macro, do not pass a bit-field, static data member, or function member. Passing an invalid type or member to the offsetof() macro is undefined behavior.

Noncompliant Code Example

In this noncompliant code example, a type that is not a standard-layout class is passed to the offsetof() macro, resulting in undefined behavior.

Code Block
bgColor#FFcccc
langcpp
#include <cstddef>
 
struct D {
  virtual void f() {}
  int i;
};
 
void f() {
  size_t off = offsetof(D, i);
  // ...
}

...

In this noncompliant code example, the offset to i is calculated so that a value can be stored at that offset within buffer. However, because i is a static data member of the class, this example results in undefined behavior. According to the C++ Standard, [class.static.data], paragraph 1 [ISO/IEC 14882-2014], static data members are not part of the subobjects of a class.

...

Tool

Version

Checker

Description

Axivion Bauhaus Suite

Include Page
Axivion Bauhaus Suite_V
Axivion Bauhaus Suite_V

CertC++-EXP59
Clang
Include Page
Clang_V
Clang_V

-Winvalid-offsetof

Emits an error diagnostic on invalid member designators, and emits a warning diagnostic on invalid types.
CodeSonar
Include Page
CodeSonar_V
CodeSonar_V

BADMACRO.OFFSETOF

Use of offsetof

GCC
Include Page
Gcc_V
Gcc_V

-Winvalid-offsetof

Emits an error diagnostic on invalid member designators, and emits a warning diagnostic on invalid types.
Helix QAC

Include Page
Helix QAC_V
Helix QAC_V

C++3915, C++3916


Parasoft C/C++test

Include Page
Parasoft_V
Parasoft_V

CERT_CPP-EXP59-aUse offsetof() on valid types and members
Polyspace Bug Finder

Include Page
Polyspace Bug Finder_V
Polyspace Bug Finder_V

CERT C++: EXP59-CPPChecks use of offsetof macro with nonstandard layout class (rule fully covered)

...