У меня был этот аргумент с некоторыми людьми, говорящими, что C-ориентированные указатели вызывают поведение undefined, даже если они не разыменовываются. Пример:
int a;
int *p = &a;
p = p - 1;
третья строка здесь приведет к поведению undefined, даже если p
никогда не разыменовывается (*p
никогда не используется).
По-моему, звучит нелогично, что C проверяет, не указана ли указатель без используемого указателя (как будто кто-то будет проверять людей на улице, чтобы увидеть, если они несут оружие, если они введут его дом, где идеальная вещь - осмотреть людей, когда они собираются войти в дом). Я думаю, что если C проверит это, тогда произойдет много сбоев во время выполнения.
Кроме того, если C действительно проверяет наличие указателей OOB, то почему это не вызовет UB:
int *p; // uninitialized thus pointing to a random adress
в этом случае, почему ничего не происходит, даже если вероятность p
, указывающая на адрес OOB, высока.
ADD:
int a;
int *p = &a;
p = p - 1;
say &a
равно 1000. Будет ли значение p
после оценки третьей строки:
- 996, но все еще undefined, потому что
p
может быть разыменован где-то еще и вызвать реальную проблему. - undefined значение и что поведение undefined.
потому что я думаю, что "третья строка была вызвана как поведение undefined", в первую очередь, из-за потенциального будущего использования этого указателя OOB (разыменование) и людей со временем принимала его как undefined поведение в нем собственное. Теперь значение p
будет 100% 996, и что все еще undefined поведение или его значение будет undefined?