LINUX.ORG.RU

История изменений

Исправление tailgunner, (текущая версия) :

То есть так делать нельзя потому, что стандарт C явно запрещает нулевому указателю указывать на какой-нибудь валидный объект?

То есть литерал 0 преобразуется в невалидное значение адреса (при этом побитовое представление указателя, получающегося из преобразования, может отличаться от «все 0»). Поэтому утверждение «с точки зрения конкретной платформы, (0) может быть валидным адресом» неверно; утверждение же «нам нужна проверка (ptr == 0) которая проверяет именно значение, без какого-либо дополнительного смысла» - вообще какая-то бессмыслица.

стандарт C явно запрещает нулевому указателю указывать на какой-нибудь валидный объект?

«Нулевой указатель» - это жаргон для невалидного указателя, в который преобразуется целый литерал 0. Во всех известных мне случаях это дает битовое значение указателя «все 0» (отсюда и «нулевой указатель»), но такое значение не гарантируется. А невалидный указатель, конечно, не может указывать ни на какой валидный объект.

если надо писать/читать/вызывать_функцию по нулевому адресу, то правильное решение - писать такие куски на ассемблере?

Если надо читать адреса памяти, которые не являются (могут не являться) адресами валидных Си-объектов (таблицы прерываний, MMIO, потенциально невалидные адреса юзерспейса) нужно либо пользоваться ассемблером, либо полагаться на поведение компилятора, выходящее за пределы стандарта Си.

Исходная версия tailgunner, :

То есть так делать нельзя потому, что стандарт C явно запрещает нулевому указателю указывать на какой-нибудь валидный объект?

То есть литерал 0 преобразуется в невалидное значение адреса (при этом побитовое представление указателя, получающегося из преобразования, может отличаться от «все 0»). Поэтому утверждение «с точки зрения конкретной платформы, (0) может быть валидным адресом» неверно; утверждение же «нам нужна проверка (ptr == 0) которая проверяет именно значение, без какого-либо дополнительного смысла» - вообще какая-то бессмыслица.

стандарт C явно запрещает нулевому указателю указывать на какой-нибудь валидный объект?

«Нулевой указатель» - это жаргон для невалидного указателя, в который преобразуется целый литерал 0. Во всех известных мне случаях это дает битовое значение указателя «все 0» (отсюда и «нулевой указатель»), но это не гарантируется. А невалидный указатель, конечно, не может указывать ни на какой валидный объект.

если надо писать/читать/вызывать_функцию по нулевому адресу, то правильное решение - писать такие куски на ассемблере?

Если надо читать адреса памяти, которые не являются (могут не являться) адресами валидных Си-объектов (таблицы прерываний, MMIO, потенциально невалидные адреса юзерспейса) нужно либо пользоваться ассемблером, либо полагаться на поведение компилятора, выходящее за пределы стандарта Си.