Няшная / Говнокод #2374 Ссылка на оригинал

0

  1. 1
  2. 2
if (cmd[1] == RESET) // если принятая команда RESET
{((void(*)(void))0)();} // что-то из черной магии

Сломай себе голову!!!!
друг прислал, незнаю где накопал, но выглядит круто!

Запостил: LuCiFer LuCiFer, (Updated )

Комментарии (45) RSS

  • чо тут непонятного... вызов voidwalker'a, все правильно сделал 😀
    Ответить
  • Интересно, а для чего может понадобиться такая конструкция?
    Ответить
  • Это не г-код.
    Это ребут, переход на нулевой адрес, с которого запускается этот "пребор". Там располагается ромка.
    Ответить
    • Вообще это можно было и ввиде более красивой процедурки оформить. А не вызывать везде в коде конструкцию из скобочек... К томуже это не платформо-переносимо. Вдруг в другом девайсе будет другой способ перезагрузки. Предёться везде в коде менять...
      Ответить
  • Кстати а нормально то что происходит вызов нулевого адресса это понятно, мне до сих пор не понятно что происходит со стеком??? все что было в нем плюс адресс возврата из той функции останеться в стеке... пару десятков таких вызовов на МК и все стэк оверфлоу....
    Ответить
    • Стек тоже сбрасываеться, если микросхема ребутиться.
      Ответить
      • так ведь если мне отшибает память(хотя может) в нулевом адрессе находиться вектор прерываний, первый из которых фактический jmp main_procedure, где main_procedure - entry point.... там сбросов стека помоему нету... мож че путаю, поправьте если туплю.
        Ответить
        • Обычно там jmp reset_vect в котором идет инициализация памяти, стека, загрузка начальных значений в память, а потом jmp main
          Ответить
  • Я как бы интуитивно понимаю, что это как бы вызов процедуры, расположенной по нулевому адресу, но можете разгрести эту кучу скобочек и особенно звёздочку в скобочках поподробнее?
    Ответить
    • Я такое не асилю. Это нужен жесткий говнокодер(1) или лучший профессионал(2). Я даже представить себе не могу, что тут написанно, хотя и программирую на С++ уже лет так 7... Тоже надеюсь на ваши разьяснения. 🙂
      Ответить
      • Всё просто: идёт указатель на функцию void. названия функции нет, просто передаем управление по адресу который следует сразу за этим войдом - т.е. на нулевой адрес
        Первый void определяет тип возвращаемого значения - таковое отсутствует.
        Ответить
  • В одном из файлов исходника линукса видел такой же способ.
    Ответить
  • Говнокод ли это? Гугль на запрос "{((void(*)(void))0)();}" возвращает 275000000 (!) результатов.
    Ответить
    • Мало ли где что есть... Наркотики вон тоже в каждом городе есть, но темнеменее вредны...
      Ответить

Добавить комментарий

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8