?

Log in

No account? Create an account

Ух ты! - Оживший юзерпик

Sep. 9th, 2014

09:40 am - Ух ты!

Previous Entry Share Next Entry

Before going to the three-day Groovy-sabbath, I was going through some old C/C++ code and came across one of the most brilliant ways to initialize a pointer with an"undefined" value, which would work on a platform where 0x0 is a valid address for data. The code reads:

T* pT = (T*)&pT;

I wonder if they still teach students about fundamentals of this sort. Or do they start with thread pools and dynamic languages, disregarding the basic physics of software development?


Я бы не допёр :)

Comments:

[User Picture]
From:vitus_wagner
Date:September 9th, 2014 05:47 am (UTC)
(Link)
Вот если бы в С/С++ было принято делать проверку указателя на неопределенность маросом IS_NULL(p), а не сравнением p==NULL....
(Reply) (Thread)
[User Picture]
From:tzirechnoy
Date:September 9th, 2014 05:59 am (UTC)
(Link)
Какая разница?
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:dz
Date:September 9th, 2014 05:52 am (UTC)
(Link)
Люди, которые в 21-м веке жрут с кинжала, должны гордиться порезами морды, я считаю.

(Перевожу на русский - использование не-managed ЯП на платформах, отличных от Эльбруса - мазохизм.)

И, кстати, такое должен ловить статический анализатор. Которых, БЛЯДЬ, для си до сих пор, оказывается, тоже нет.
(Reply) (Thread)
[User Picture]
From:d1f
Date:September 9th, 2014 06:08 am (UTC)
(Link)
Зачем? Не мешайте нам стрелять себе в ногу!
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:tzirechnoy
Date:September 9th, 2014 05:58 am (UTC)
(Link)
ЯННП!!!

Какой он undefined, если он указывает на pT? На вполне конкретный pT, который, после записи, будет существенно менять поведение программы, который никогда не вызовет SEGV если просто взять с него int?

И да, напомню всем, что адрес 0 или (void *)0 -- является по стандарту Си неопределённым адресом, не указывающим ни на какой правильный объект, при этом (тожэ по стандарту Си) -- его битовое представление совсем не обязано состоять из нулей.

Т.е. 0 (он жэ NULL, макрос для NULL обычно и определён как (0)) -- это как раз и есть undefined pointer. Независимо от того, нужэн ли программ адрес 0x0.
(Reply) (Thread)
[User Picture]
From:zinal
Date:September 9th, 2014 06:53 am (UTC)
(Link)
+1.
Такие волшебные платформы, где malloc() или new могут вернуть 0 и это не будет ошибкой - сами по себе не совсем прямые.
(Reply) (Parent) (Thread)
[User Picture]
From:kika
Date:September 9th, 2014 05:59 am (UTC)
(Link)
Ну да. А теперь вопрос - а зачем?
(Reply) (Thread)
[User Picture]
From:tobotras
Date:September 9th, 2014 06:12 am (UTC)
(Link)
Красивые вещи красивы вне зависимости от бытовой пользы!
(Reply) (Parent) (Thread)
[User Picture]
From:zinal
Date:September 9th, 2014 06:50 am (UTC)
(Link)
Не совсем изящно с той точки зрения, что указатели могут копироваться, и копию такого указателя трудно проверить на этот "особенный NULL который не NULL".
Как решение описанной проблемы IMHO можно завести глобальную переменную, а затем макрос NULL сделать равным взятию указателя от такой переменной. Тогда немалая часть кода заработает автоматически, кроме, естественно, старого доброго "void *ptr = 0;" ;)
(Reply) (Thread)
[User Picture]
From:jsn
Date:September 9th, 2014 08:57 am (UTC)
(Link)
В самом деле, объясните мне, откуда в этом тексте слово "undefined"? What exactly is "not" "defined" there? Я такой код писал пару раз в жизни, вот последний, кажется: https://gist.github.com/jsn/491302, в районе check_stack(). Very well-defined and useful value.
(Reply) (Thread)
From:vm_lj
Date:September 9th, 2014 08:59 am (UTC)
(Link)
http://stackoverflow.com/questions/1282295/what-exactly-is-nullptr
The new C++09 nullptr keyword designates an rvalue constant that serves as a universal null pointer literal, replacing the buggy and weakly-typed literal 0 and the infamous NULL macro. nullptr thus puts an end to more than 30 years of embarrassment, ambiguity, and bugs. The following sections present the nullptr facility and show how it can remedy the ailments of NULL and 0.
(Reply) (Thread)
[User Picture]
From:sporadic_man
Date:September 9th, 2014 07:39 pm (UTC)
(Link)
> a pointer with an"undefined" value, which would work on a platform where 0x0 is a valid address for data

но зачем.
(Reply) (Thread)
[User Picture]
From:evolver
Date:September 9th, 2014 07:48 pm (UTC)
(Link)
Какие занудные у тебя друзья! :)
(Reply) (Thread)
[User Picture]
From:tobotras
Date:September 10th, 2014 03:13 am (UTC)
(Link)
Но любим мы их не за это же :)
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:rblaze
Date:September 9th, 2014 09:03 pm (UTC)
(Link)
А потом мы делает pT1 = pT и опа, pT1 уже валидный.

Fundamentals of this sort не надо учить. Это не fundamentals, а очень злое колдунство, изучать которое надо не студентам, а суровым бородатым чернокнижникам, которым себя уже не жалко.Способы открывания портала в ад надо прятать от неофитов, они еще не понимают, что там правда неприятно.
(Reply) (Thread)
[User Picture]
From:zaitcev
Date:September 12th, 2014 08:19 pm (UTC)
(Link)
Вот именно. Лучше просто ~0 использовать если нулевой адрес недоступен (как в ядре на s390).
(Reply) (Parent) (Thread)