Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Поведение не определено, когда создаются два объекта, которые частично перекрываются в памяти, и один из них присваивается или копируется в другой.
Такое может случиться, например, при использовании функции 'memcpy', когда перекрываются области памяти источника и приемника:
void func(int *x)
{
memcpy(x, x+2, 10 * sizeof(int));
}
В данном случае указатель на источник данных '(x+2)' смещен относительно приемника данных на 8 байт ('sizeof(int) * 2'). Попытка копирования 40 байт в приемник из источника приведет к частичному перекрытию области памяти источника.
Для исправления ошибки необходимо использовать специальную функцию для таких операций – 'memmove' – или скорректировать заданные смещения источника и приемника, чтобы не происходило перекрытия областей памяти.
Пример корректного кода:
void func(int *x)
{
memmove(x, x+2, 10 * sizeof(int));
}
Данная диагностика классифицируется как:
|