Недавно я написал код для сравнения указателей, подобных этому:
if(p1+len < p2)
однако, некоторые сотрудники сказали, что я должен написать вот так:
if(p2-p1 > len)
чтобы быть в безопасности.
Здесь p1 и p2 являются указателями char *
, len - целым числом.
Я понятия не имею об этом. Правильно?
EDIT1: конечно, p1 и p2 указатель на тот же объект памяти при попрошайничестве.
EDIT2: всего минуту назад я нашел bogo этого вопроса в своем коде (около 3K строк), потому что len
настолько велик, что p1+len
не может хранить в 4 байтах указателя, поэтому p1 + len < p2 истинно. Но на самом деле это не так, поэтому я думаю, что мы должны сравнить указатели, подобные этому, в некоторой ситуации:
if(p2 < p1 || (uint32_t)p2-p1 > (uint32_t)len)