Re[7]: ((SA*)0)->Func();
От: Андрей Тарасевич Беларусь  
Дата: 29.04.02 20:41
Оценка:
Здравствуйте DarkGray, Вы писали:

DG>Здравствуйте Андрей Тарасевич, Вы писали:


АТ>>Из приведенной тобой выдержки, кстати, может показаться, что к статическим членам класса можно доступаться через null-указатель. Это не так. Любое вычисляемое выражение, содержащее разыменование null-указателя порождает неопределенное поведение.


DG>А в чем это "неопределенное поведение" может выражаться при обращении через нулевой указатель к статической функции?


DG>
((S*)0)->>StaticFunc();
DG>


А кто его знает. Буквально такая запись означает

*(S*) 0;
S::StaticFunc();


Неопределенное поведение вызывается именно первым выражением. Вызов статического метода тут, собственно, ни при чем. Если некоторый компилятор возьмется транслировать этот код буквально, то в ответ на первое выражение он может сгенерировать код, загружающий разыменовываемый указатель в некий выделенный адресный регистр. Вот тут-то система и рухнет.

Например, на современной платформе x86, при попытке загрузки неправильного значения в селекторный регистр (DS, ES и т.п.) программа падает сразу, а не при попытке собственно обращения к памяти через такой регистр.

Разумеется, большинство современных компиляторов проигнорирует такое выражение. Но стандарт языка этого не требует. Любой компилятор имеет право генерировать для выражения '*(S*) 0' падающий код.
Best regards,
Андрей Тарасевич
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.