Contenuto principale

MISRA C++:2023 Rule 8.18.1

An object or subobject must not be copied to an overlapping object

Since R2024b

Description

An object or subobject must not be copied to an overlapping object. 1

Rationale

When you assign an object to another object with overlapping memory, the behavior is undefined.

The exceptions are:

  • You assign an object to another object with exactly overlapping memory and compatible type.

  • You copy one object to another with memmove.

Polyspace Implementation

As stated in the rule specification, the checker reports a violation when:

  • A member of a union is copied to another member of the union.

  • The source and destination arguments of memcpy point to the same array in a way that results in an overlapping copy.

Troubleshooting

If you expect a rule violation but Polyspace® does not report it, see Diagnose Why Coding Standard Violations Do Not Appear as Expected.

Examples

expand all

void func (void) {
    union {
        short i;
        int j;
    } a = {0}, b = {1};
    
    a.j = a.i;   //Noncompliant
    a = b;       //Compliant
}

In this example, the rule is violated when a.i is assigned to a.j because the two variables have overlapping regions of memory.

Check Information

Group: Expressions
Category: Mandatory
PQL Name: std.misra_cpp_2023.R8_18_1

Version History

Introduced in R2024b

expand all


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.