Намеренное разименование нулевого указателя
От: alzt  
Дата: 22.12.09 09:21
Оценка:
Добрый день.

Какой может быть смысл в намеренном разименовании указателя:

*(int *) 0 = 1;             //здесь
*(volatile int *) 0 = 2;    //и здесь

?
Re: Намеренное разименование нулевого указателя
От: Николай Ивченков  
Дата: 22.12.09 09:24
Оценка: :))) :)))
alzt:

A>Добрый день.


A>Какой может быть смысл в намеренном разименовании указателя:


A>
A>*(int *) 0 = 1;             //здесь
A>*(volatile int *) 0 = 2;    //и здесь
A>

A>?

Чтобы день перестал быть добрым?
Re: Намеренное разименование нулевого указателя
От: rg45 СССР  
Дата: 22.12.09 09:53
Оценка:
Здравствуйте, alzt, Вы писали:

A>Добрый день.


A>Какой может быть смысл в намеренном разименовании указателя:


A>
A>*(int *) 0 = 1;             //здесь
A>*(volatile int *) 0 = 2;    //и здесь
A>

A>?

Какие цели преследовал тот, кто это писал, сказать трудно. Но полученный результат имеет вполне определенное название — неопределенное поведение.
--
Справедливость выше закона. А человечность выше справедливости.
Re: Намеренное разименование нулевого указателя
От: ononim  
Дата: 22.12.09 10:10
Оценка: +2
чтобы свалиться
Как много веселых ребят, и все делают велосипед...
Re: Намеренное разименование нулевого указателя
От: jazzer Россия Skype: enerjazzer
Дата: 22.12.09 10:12
Оценка: +2
Здравствуйте, alzt, Вы писали:

A>Добрый день.


A>Какой может быть смысл в намеренном разименовании указателя:


A>
A>*(int *) 0 = 1;             //здесь
A>*(volatile int *) 0 = 2;    //и здесь
A>

A>?

Наверное, человек не знает о существовании функции abort()...

Это сферический код в вакууме или все-таки есть какой-то контекст?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Намеренное разименование нулевого указателя
От: tonykent  
Дата: 22.12.09 10:15
Оценка:
J>Наверное, человек не знает о существовании функции abort()...
Сам видел подобные примеры у Саттера (помоему). Чтобы не париться и кинуть Exception
Re[3]: Намеренное разименование нулевого указателя
От: jazzer Россия Skype: enerjazzer
Дата: 22.12.09 10:18
Оценка:
Здравствуйте, tonykent, Вы писали:

J>>Наверное, человек не знает о существовании функции abort()...

T>Сам видел подобные примеры у Саттера (помоему). Чтобы не париться и кинуть Exception

какой еще Exception?
Это неопределенное поведение.
Для кидания Exception есть конструкция throw, гораздо более прямолинейная.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: Намеренное разименование нулевого указателя
От: ononim  
Дата: 22.12.09 10:27
Оценка:
J>какой еще Exception?
J>Это неопределенное поведение.
в винде обращение к виртуальным адресам 0..0xffff вызывает гарантированное SEH/AV
Как много веселых ребят, и все делают велосипед...
Re: Намеренное разименование нулевого указателя
От: denisko http://sdeniskos.blogspot.com/
Дата: 22.12.09 10:28
Оценка:
Здравствуйте, alzt, Вы писали:

A>Добрый день.


A>Какой может быть смысл в намеренном разименовании указателя:


A>
A>*(int *) 0 = 1;             //здесь
A>*(volatile int *) 0 = 2;    //и здесь
A>

A>?
В некоторых маргинальных С-like библиотеках типа используется в качестве попытки бросить исключение. Под Win им это даже может удастся.
Вроде в первой OpenCV иммено такой механизм был (а может и есть).
<Подпись удалена модератором>
Re[5]: Намеренное разименование нулевого указателя
От: Кодт Россия  
Дата: 22.12.09 10:46
Оценка: +1
Здравствуйте, ononim, Вы писали:

O>в винде обращение к виртуальным адресам 0..0xffff вызывает гарантированное SEH/AV


А в досе — вызывает перезапись таблицы прерываний. И откладывание феерверка до момента прерывания...
Говорите, дос — старьё? Возьмите любую другую ОС без защиты памяти — ту же VxWorks, например.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Перекуём баги на фичи!
Re[6]: Намеренное разименование нулевого указателя
От: denisko http://sdeniskos.blogspot.com/
Дата: 22.12.09 10:48
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, ononim, Вы писали:


O>>в винде обращение к виртуальным адресам 0..0xffff вызывает гарантированное SEH/AV


К>А в досе — вызывает перезапись таблицы прерываний. И откладывание феерверка до момента прерывания...

К>Говорите, дос — старьё? Возьмите любую другую ОС без защиты памяти — ту же VxWorks, например.
Перед (а если быть совсем честным вместо) перезаписью, она вызовет GP, по крайней мере в защищенном режиме.
<Подпись удалена модератором>
Re[2]: Намеренное разименование нулевого указателя
От: alzt  
Дата: 22.12.09 12:09
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Наверное, человек не знает о существовании функции abort()...


J>Это сферический код в вакууме или все-таки есть какой-то контекст?


Это я нашёл в проекте gawk, файл stackoverflow2.c (насколько я понял это тест):
/* Provoke two stack overflows in a row.  */
  switch (setjmp (mainloop))
    {
    case -1:
      printf ("emergency exit\n"); exit (1);
    case 0: case 1:
      printf ("Starting recursion pass %d.\n", pass + 1);
      recurse (0);
      printf ("no endless recursion?!\n"); exit (1);
    case 2:
      *(volatile int *) (page + 0x678) = 42;
      break;
    case 3:
      *(volatile int *) 0 = 42;
      break;
    case 4:
      break;
    default:
      abort ();
    }
Re: Намеренное разименование нулевого указателя
От: Basil2 Россия https://starostin.msk.ru
Дата: 22.12.09 12:40
Оценка:
Здравствуйте, alzt, Вы писали:

A>Какой может быть смысл в намеренном разименовании указателя:


A>
A>*(int *) 0 = 1;             //здесь
A>*(volatile int *) 0 = 2;    //и здесь
A>


Человеку захотелось секса?
Проект Ребенок8020 — пошаговый гайд как сделать, вырастить и воспитать ребенка.
Re: Намеренное разименование нулевого указателя
От: spartakuz  
Дата: 22.12.09 19:10
Оценка:
Здравствуйте, alzt, Вы писали:

A>Добрый день.


A>Какой может быть смысл в намеренном разименовании указателя:


A>
A>*(int *) 0 = 1;             //здесь
A>*(volatile int *) 0 = 2;    //и здесь
A>

A>?

думаю, это фрагмент кода на С, эмулирующий exceptions на С++.
посмотри связку setjmp/longjmp.
Re[3]: Намеренное разименование нулевого указателя
От: spartakuz  
Дата: 22.12.09 19:40
Оценка: 4 (1)
Здравствуйте, alzt, Вы писали:

A>Здравствуйте, jazzer, Вы писали:


J>>Наверное, человек не знает о существовании функции abort()...


J>>Это сферический код в вакууме или все-таки есть какой-то контекст?


A>Это я нашёл в проекте gawk, файл stackoverflow2.c (насколько я понял это тест):

A>
A>/* Provoke two stack overflows in a row.  */
A>  switch (setjmp (mainloop))
A>    {
A>    case -1:
A>      printf ("emergency exit\n"); exit (1);
A>    case 0: case 1:
A>      printf ("Starting recursion pass %d.\n", pass + 1);
A>      recurse (0);
A>      printf ("no endless recursion?!\n"); exit (1);
A>    case 2:
A>      *(volatile int *) (page + 0x678) = 42;
A>      break;
A>    case 3:
A>      *(volatile int *) 0 = 42;
A>      break;
A>    case 4:
A>      break;
A>    default:
A>      abort ();
A>    }
A>


конкретно здесь разыменовывание нулевого указателя нужно для генерации SIGSEGV.
в обработчике, видимо, вызывается longjmp на выход 4, и получается корректный выход
из программы, а не abort().

ps. это юнит тест походу
Re: Намеренное разименование нулевого указателя
От: MasterZiv СССР  
Дата: 25.12.09 15:48
Оценка:
alzt wrote:

> Какой может быть смысл в намеренном разименовании указателя:

>
> *(int *) 0 = 1; //здесь
> *(volatile int *) 0 = 2; //и здесь

Грохнуться в корку. Т.е. вызвать ошибку приложения,
гарантированно приводящую к снятию приложения с выполнения
на данной платформе (потому как это непереносимо).
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Намеренное разименование нулевого указателя
От: MasterZiv СССР  
Дата: 25.12.09 15:49
Оценка:
tonykent wrote:

> J>Наверное, человек не знает о существовании функции abort()...

> Сам видел подобные примеры у Саттера (помоему). Чтобы не париться и
> кинуть Exception

Некоторые на С пишут. А вот abort не знаю, чем им не понравился.
Ну, кто его знает, возможно на каких=то платформах он как-то не
так себя ведёт и не нравится.
Posted via RSDN NNTP Server 2.1 beta
Re[7]: Намеренное разименование нулевого указателя
От: ДимДимыч Украина http://klug.org.ua
Дата: 25.12.09 16:03
Оценка:
Здравствуйте, denisko, Вы писали:

D>Перед (а если быть совсем честным вместо) перезаписью, она вызовет GP, по крайней мере в защищенном режиме.


Это смотря как сегменты настроить.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.