Size: a a a

2021 May 01

AN

Alex Noname in rust_offtopic
в реальном коде не будет всегда ноль, значит он не сможет доказать
источник

EG

Emmanuel Goldstein in rust_offtopic
Во-первых, это неважно, это всё равно не NULL и эту проверку можно статически выкинуть полностью.
источник

П

Пух in rust_offtopic
volatile не фиксит это
источник

EG

Emmanuel Goldstein in rust_offtopic
Во-вторых, если ты честно выпишешь void* zero = mmap(0, 1, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_ANON, 0, 0)
то ничего не изменится
источник

EG

Emmanuel Goldstein in rust_offtopic
Я просто упростил пример, чтобы он не требовал прав рута для запуска
источник

EG

Emmanuel Goldstein in rust_offtopic
А ещё б он фиксил. Там нет оптимизации, там честное побитовое сравнение.
источник

EG

Emmanuel Goldstein in rust_offtopic
Которого там быть не должно, потому что с точки зрения стандарта C поинтеры нельзя сравнивать побитово.
источник

EG

Emmanuel Goldstein in rust_offtopic
У них есть provenance, у них есть NULL-статус и прочие страшные слова
источник

EG

Emmanuel Goldstein in rust_offtopic
Но все компиляторы всё равно делают именно побитовое сравнение, и весь наш kernel-код опирается именно на это
источник

EG

Emmanuel Goldstein in rust_offtopic
Как страшно жить
источник

П

Пух in rust_offtopic
Как всегда, в принципе
источник

B

Börgar in rust_offtopic
так, как заставить компилятор поверить в то, что one — динамичен
источник

П

Пух in rust_offtopic
volatile
источник

EG

Emmanuel Goldstein in rust_offtopic
Он уже динамичен. Но ты можешь прочитать его с STDIN, если не веришь.
источник

EG

Emmanuel Goldstein in rust_offtopic
Или получить как результат выполнения какой-нибудь команды.
источник

EG

Emmanuel Goldstein in rust_offtopic
Результат будет тот же самый.
источник

EG

Emmanuel Goldstein in rust_offtopic
Проблема в ==, которое сравнивает поинтеры побитово, хотя не имеет права.
источник

B

Börgar in rust_offtopic
так, тут кста 6.3.2.3.5
источник

B

Börgar in rust_offtopic
не UB
источник

EG

Emmanuel Goldstein in rust_offtopic
Там в других местах не совсем понятно что делать, если этот integer не был получен из поинтера.
источник