Вебинар: Go-Go-Gadg...Error? Смотрим, как ошибаются Go разработчики! - 26.08
Диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Правило актуально только для С.
Вычитание указателей допускается только в том случае, если они оба указывают на элементы одного и того же массива или на элемент, следующий за последним элементом этого массива.
Если указатели принадлежат разным массивам или объектам, то поведение программы не определено (C11 пп. 6.5.6.9).
Рассмотрим пример:
void example(void)
{
int32_t a[10];
int32_t b[10];
int32_t *ptr1 = a;
int32_t *ptr2 = b + 10;
ptrdiff_t offset = ptr2 - ptr1; // <=
// ....
}
В коде вычисляется дистанция между началом первого массива и концом второго. Стандарт гарантирует адресную арифметику только для двух указателей, которые ссылаются на объект одного и того же массива. Поэтому поведение при такой адресной арифметике не определено.
Диагностическое правило классифицируется как:
|
Была ли полезна эта страница документации?
Мы ответим вам на:
Если вы так и не получили ответ, пожалуйста, проверьте, отфильтровано ли письмо в одну из следующих стандартных папок: