1. Си / Говнокод #2374

    +93.9

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

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

    Запостил: LuCiFer, 05 Января 2010

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

    • баян
      Ответить
    • чо тут непонятного... вызов voidwalker'a, все правильно сделал :D
      Ответить
    • LuCiFer не осилил указатели на функции?
      Ответить
      • Может он и не осилил, но это точно говнокод.
        Ответить
      • я не осилил количество скобок с первого прочтения (((
        Ответить
    • Интересно, а для чего может понадобиться такая конструкция?
      Ответить
    • Это не г-код.
      Это ребут, переход на нулевой адрес, с которого запускается этот "пребор". Там располагается ромка.
      Ответить
      • кэп =)
        Ответить
      • Вообще это можно было и ввиде более красивой процедурки оформить. А не вызывать везде в коде конструкцию из скобочек... К томуже это не платформо-переносимо. Вдруг в другом девайсе будет другой способ перезагрузки. Предёться везде в коде менять...
        Ответить
    • Кстати а нормально то что происходит вызов нулевого адресса это понятно, мне до сих пор не понятно что происходит со стеком??? все что было в нем плюс адресс возврата из той функции останеться в стеке... пару десятков таких вызовов на МК и все стэк оверфлоу....
      Ответить
      • Стек тоже сбрасываеться, если микросхема ребутиться.
        Ответить
        • так ведь если мне отшибает память(хотя может) в нулевом адрессе находиться вектор прерываний, первый из которых фактический jmp main_procedure, где main_procedure - entry point.... там сбросов стека помоему нету... мож че путаю, поправьте если туплю.
          Ответить
          • Обычно там jmp reset_vect в котором идет инициализация памяти, стека, загрузка начальных значений в память, а потом jmp main
            Ответить
    • Я как бы интуитивно понимаю, что это как бы вызов процедуры, расположенной по нулевому адресу, но можете разгрести эту кучу скобочек и особенно звёздочку в скобочках поподробнее?
      Ответить
      • Я такое не асилю. Это нужен жесткий говнокодер(1) или лучший профессионал(2). Я даже представить себе не могу, что тут написанно, хотя и программирую на С++ уже лет так 7... Тоже надеюсь на ваши разьяснения. :)
        Ответить
        • На самом деле мне непонятно только void(*)(void).
          Ответить
        • Всё просто: идёт указатель на функцию void. названия функции нет, просто передаем управление по адресу который следует сразу за этим войдом - т.е. на нулевой адрес
          Первый void определяет тип возвращаемого значения - таковое отсутствует.
          Ответить
    • боян ацкий
      init 0;
      Ответить
    • В одном из файлов исходника линукса видел такой же способ.
      Ответить
    • А тут весело. Надо почаще заглядывать ;D
      Ответить
    • Где сдесь С++?
      Ответить
    • Говнокод ли это? Гугль на запрос "{((void(*)(void))0)();}" возвращает 275000000 (!) результатов.
      Ответить
      • То есть, на этом построена Вселенная???
        Ответить
      • Тогда мало того, что говнокод, то ещё и баян.
        Ответить
    • Такаяже штука есть в ядре линукса -- http://svn.opentom.org/opentom/trunk/linux-2.6/arch/arm26/kernel/process.c
      Ответить
      • Мало ли где что есть... Наркотики вон тоже в каждом городе есть, но темнеменее вредны...
        Ответить

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