Size: a a a

2021 May 01

AN

Alex Noname in rust_offtopic
К чему ведешь? я прикладной код пишу у меня нету таких проблем, так что ничего не знаю)
источник

EG

Emmanuel Goldstein in rust_offtopic
/c
источник

R

Rextester in rust_offtopic
Ok, give me some C code to execute
источник

EG

Emmanuel Goldstein in rust_offtopic
#include <stdio.h>

int main(void) {
 size_t one = 1;
 // Totally not a constant
 void* zero = (void*) (one - one);
 printf("%d", zero == NULL);
 return 0;
}
источник

R

Rextester in rust_offtopic
Result:
1


Note:
gcc assumed, other valid options are clang, visual_c, you can be more specific next time.
источник

EG

Emmanuel Goldstein in rust_offtopic
Поинтер zero точно не NULL, потому что не получен из constant value.
Поинтер NULL точно NULL по стандарту.
Соответственно, они должны compare unequal.
источник

EG

Emmanuel Goldstein in rust_offtopic
Автохуй.
источник

EG

Emmanuel Goldstein in rust_offtopic
Ты получил поинтер неожиданным для компилятора способом — ты сосёшь.
источник

B

Börgar in rust_offtopic
стой а откуда он точно не NULL
источник

EG

Emmanuel Goldstein in rust_offtopic
Потому что NULL должен быть получен из constant value zero.
источник

EG

Emmanuel Goldstein in rust_offtopic
А он получен из вполне динамического zero.
источник

B

Börgar in rust_offtopic
а где это сказано?
источник

EG

Emmanuel Goldstein in rust_offtopic
Более того, есть валидные юзкейсы в ядре для не-нулевого поинтера равного нулю.
источник

AN

Alex Noname in rust_offtopic
смотря как прочесть.
источник

EG

Emmanuel Goldstein in rust_offtopic
Стандарт C99, 6.3.2.3.3
источник

B

Börgar in rust_offtopic
не распарсил
источник

EG

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

EG

Emmanuel Goldstein in rust_offtopic
Более того, mmap() умеет порождать такой поинтер.
источник

EG

Emmanuel Goldstein in rust_offtopic
Поинтер, который на самом деле невозможен на линуксе это usize::MAX
источник

AN

Alex Noname in rust_offtopic
компилер доказал что там всегда ноль вот и всё.
источник