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

    +129

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    #define SPI_BUF_SIZE                                0x400
    #define SDRAM_SPI_0_BUF_MISO           (void*)0x100000
    #define SDRAM_SPI_0_BUF_MOSI           SDRAM_SPI_0_BUF_MISO - SPI_BUF_SIZE
    #define SDRAM_SPI_1_BUF_MISO           SDRAM_SPI_0_BUF_MOSI - SPI_BUF_SIZE
    #define SDRAM_SPI_1_BUF_MOSI           SDRAM_SPI_1_BUF_MISO - SPI_BUF_SIZE
    #define SDRAM_SPI_2_BUF_MISO           SDRAM_SPI_1_BUF_MOSI - SPI_BUF_SIZE
    #define SDRAM_SPI_2_BUF_MOSI           SDRAM_SPI_2_BUF_MISO - SPI_BUF_SIZE
    #define SDRAM_SPI_3_BUF_MISO           SDRAM_SPI_2_BUF_MOSI - SPI_BUF_SIZE
    #define SDRAM_SPI_3_BUF_MOSI           SDRAM_SPI_3_BUF_MISO - SPI_BUF_SIZE
    
    void test()
    {
    void *buf = SDRAM_SPI_3_BUF_MOSI;
    void *buf1 = (void*)0x100000 - 0x400*7;
    *buf = *buf1 = 0xAA;
    
    printf("buf=%.2x \tbuf1=%.2x\n ",*buf, buf1);
    return;
    }

    Расскажу преамбулу. Код писался под проц atmel at91sam7x
    В этом процессоре есть звено SPI (serial pereferial interface). Но так как звено было спроектировано с небольшим косячком (который кстати в эррате был явно описан) буффер для каждой линии нужно было выделять в сдраме.
    Сказано - сделано. Выделили. а так как средства отладки только DBGU и JTAG.
    Все волосы на жопе вырвал пока нашел в чем ошибка.
    Внимание, вопрос. В чем гавно?

    Запостил: ursus, 29 Апреля 2010

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

    • printf("buf=%.2x \tbuf1=%.2x\n ",*buf, *buf1);
      поправка - в примере разименовать второй буффер забыл.
      Ответить
    • ктонить ответит в чём гавно? нешто сильных сишников нет
      Ответить
    • А как у Вас так лихо получается указатель на void разыменовать?
      Ответить
      • показать все, что скрытолег-ко
        Ответить
        • Забавно. У меня вот такой код не компилируется:
          void *p = malloc( sizeof( int ) );
          int data = 42;
          *p = data;
          free( p );
          Ответить
          • Потому что у тебя C++
            Ответить
          • и не должен.
            выдаст варнинг на приведении типов. возьми компилятор потупее.
            Ответить
        • А что в результате разыменования выходит? Байт?
          И вместо этого принтфа первое, что приходит в голову, сравнить, что получается с адресами.
          Если разные, то, может, долбанутый компилятор и приоритет минуса у него не тот:) Если одинаковые, а значения вычитанные разные, то вопрос, куда мы этим адресом попали:)
          Ответить
          • товарищ правильно мыслит. адреса получаются разные и последний выше в памяти третьего
            Ответить
    • хочешь что тебя обосрали как ты макса?
      Ответить
      • соси хуй и фтыкай в код
        Ответить
        • ха, по интонации чувствуется бывалый минетчик
          Ответить
          • показать все, что скрытодаже боюсь представить кто тебя так просветил.
            кстати, как моногамномый гетеросексуалист заявляю что подобные намёки на гомоэротизм характерны только для аналоамериканцев.
            так то. вы случаем не аналоамериканец?
            Ответить
            • моногамномый гетеросексуалист, бля

              Чем кидаться говном в троллей, лучше выучите русский язык.
              Ответить
              • >моногамномый гетеросексуалист, бля
                Знаешь, к какой классификации отнести себя? Молодец.
                Ответить
              • И да. Что-за розовая хуйня у тебя на голве?
                Ответить
                • Ух ты, комментарии, что ли, мочить теперь можно?
                  Ответить
                  • Это как?
                    Ответить
                    • А, не, меня проглючило, я на подобную фразу ответил, но в другом месте. А тут не увидел своего комментария и офигел!
                      Все нормально:)
                      Ответить
        • >соси хуй и фтыкай в код
          Сам соси.
          Ответить
    • показать все, что скрытону так что, состав говнокодру - школьники\дрочеры?
      никто не решит сишную задачку?
      Ответить
      • Мда. Судя по тому, как ты поливал говном своего сотрудника, а теперь нацелился полить говном хоть бы и всю аудиторию сайта, положительного мнения о тебе составить не могу.
        Ответить
        • Я же говорю, обдолбыш он, да ещё из злопамятный.
          Теперь начнёт показывать, какой он невьёбенный кодировщик, не то, что мы, сирые и убогие.
          Тьфу.
          Ответить
        • сложно ответить в чем бага? задачка ориентирована на школьников.
          проблема обозначена. никого обсирать не собираюсь.
          холивар развести - знатное дело.
          Ответить
          • Сначала ты бросаешь вызов в стиле "чё, одни школьники/дрочеры собрались?", а потом, когда тебе указывают на твои недостатки, начинаешь утверждать, что просто обозначил проблему и никого обсирать не собираешься? Взаимоисключающие параграфы соблюдены. Выбирай выражения, и люди к тебе потянутся.
            Ответить
          • ответь где тут бага
            dataflow(remove) -> [check_https, check_permissions,
                                    validate_number, log].
               check_https(_, _) ->
                 case wpart:fget("__https") of
                   true -> {ok, ok};
                   false -> {error, no_https}
                 end.
            
               check_permissions(_, ok) ->
                 case Result of
                   not_logged_in              -> {error, not_logged_in};
                   not_enough_permissions     -> {error, not_enough_permissions};
                   _                          -> {ok, ok}
                 end.
            
               validate_number(_, ok) ->
                 case hd(lists:reverse(string:tokens(wpart:fget("__path"), [$/]))) of
                   N when is_integer(N)  -> {ok, N};
                   _                     -> {error, invalid_url};
                 end.
            
               log(Action, Number) ->
                 {ok, Number}.
            
               error(check_https, no_https) ->
                 {redirect, "https://" ++ e_conf:host() ++ wpart:fget("__path")};
               error(check_permissions, not_logged_in) ->
                 {redirect, "/login"};
               error(check_permissions, not_enough_permissions) ->
                 {template, "errors/not_enough_permissions.html"};
               error(validate_number, invalid_url) ->
                 {error, 404}.
            
               remove(Number) ->
                 {template, "users/list.html"}.
            Ответить
      • >состав говнокодру - школьники\дрочеры
        А ты будто-бы отнас отличаешься. Хуева элита.
        Ответить
    • void *buf1 = (void*) (0x100000 - 0x400*7);
      штоле?
      Ответить
      • нет. ответ будет завтра. он простой и очевидный.
        Ответить
        • Да нам пофиг. Сам не знаешь, что ответить, вот и молчишь.
          Ответить
    • Эй ты? Недорос или пидорос что-ли?
      Всех говном решил полить? Злой.
      Ответить
    • Не вижу говнокода. Ну указатели равны, но это видимо так и задумано.

      Разве что возможно эта область памяти не читабельна, но это всё равно не говнокод.
      Ответить
      • ненененнееее! там есть баг. косяк. он простой на уровне препроцессорных директив. он очевиден и не очевиден.
        и это есть гавно.
        Ответить
        • > там есть баг. косяк. он простой на уровне препроцессорных директив

          ну знаешь, очень весело разбираться в спагетти криво названных макросов
          у меня эти MOSI/MISO в глазах ебутся
          Ответить
        • во фразе 0x400*7 звёздочка сработала как разыменование? Я не сишник, я паскалист, я не ебу, чего там эти звёздочки в сях могут выкинуть.
          Ответить
          • А, во, почему мы сначала привели инт к указателю, а потом вычли? Если нетипизированный указатель автоматом считается за инт*, то -0x400*7 вычтет на самом деле 0x400*7*sizeof(int).
            Ну или наоборот, тот минус, который в макросах будет умножаться на sizeof(int), а тот, который в коде, не будет из-за того, что хз этот си короче.
            Ответить
            • >Если нетипизированный указатель автоматом считается за инт*

              За char* он считается. а точнее считался раньше. Современные компиляторы как минимум ворнинг выдают.
              Ответить
        • выражения препроцессора не взяты в скобки. учитывая как макросы написаны SDRAM_SPI_3_BUF_MOSI может с легкостью стать чем угодно из-за переполнения.
          Ответить
          • Dummy00001 только что # +1
            выражения препроцессора не взяты в скобки
            _________
            кстати да. там проблема была что из за отсутсвия скобок последний буффер был выше третьего. жаль свн базы нет под рукой
            Ответить
      • область читабельна. я же написал что это сдрам
        Ответить
    • void *buf = (void*)0x100000 - 0x400 - 0x400 - 0x400 - 0x400 - 0x400 - 0x400 - 0x400;
      void *buf1 = (void*)0x100000 - 0x400*7;

      ну и что здесь?
      Ответить
      • У меня так-же развернулось.
        Ответить
        • так оно развернуться не могло, вы невнимательны, господа
          Ответить
          • Ничо не знаю:
            # 1 "aaa.c"
            # 1 "<built-in>"
            # 1 "<command-line>"
            # 1 "aaa.c"
            # 11 "aaa.c"
            void test()
            {
            void *buf = (void*)0x100000 - 0x400 - 0x400 - 0x400 - 0x400 - 0x400 - 0x400 - 0x400;
            void *buf1 = (void*)0x100000 - 0x400*7;
            *buf = *buf1 = 0xAA;
            
            printf("buf=%.2x \tbuf1=%.2x\n ",*buf, buf1);
            return;
            }
            Ответить
    • чому семь?
      Ответить
    • > Внимание, вопрос. В чем гавно?

      В коде, наверное?
      Ответить
    • до открытия истины осталось меньше часа.
      Готовы, детишки????
      Ответить
      • да, взрослый дядя, по-взрослому ноющий на взрослого максима прохорова
        Ответить
      • какой-то вы дяденька, не удолетворенный что-ли
        Ответить
      • Неудвалетворённый. Вам девушки не дают.
        Ответить
        • "до открытия истины осталось совсем чуть-чуть!!!! Готова, детка???? Дорогая, не обижайся, но... в целом получилось смешнее, чем я ожидал..."
          Ответить
      • Вы готовы дети?
        Да Капитан.
        Я не слышу.
        Так точно Капитан Очевидность.
        Кто проживает на дне океана?
        Жалкая губка, имбицил без изьяеа.
        Ответить
      • >Готовы, детишки????
        Сам детишка и школота. Убейся. Типичный Пидор-ГдеЗдесьСиПлюсПлюсовец-Задрот.
        Ответить
    • показать все, что скрытомужики, не обижайтесь, но я забыл в чем косяк. в целом получилось смешнее чем ожидал. надо покопаться в старых исходниках где из за директив регистры сдвигались неправильно.
      всем спасибо всех наебали, расходимся.
      Ответить
      • Пиздец...
        Ответить
      • Поздравляю, ты подтвердил свой статус долбоёба
        Ответить
      • Это такой фейл, что даже вин. Слив просто эпичнейший, сразу в нескольких номинациях.
        Ответить
        • Нужно ввести переходящие номинации для говнопостеров. Включая "лучший эпик фейл месяца", "лучший задрот", "наговнопостил сотни кодов Максима Прохорова".
          Да наш топикстартер будет постоянно держаться в топе по пяти-шести наградам.
          Ответить
          • показать все, что скрытотроль сыт, все свободны
            Ответить
            • Какой тролль? Ты просто дурак. Ты не вызвал батхёрта, никого из твоих оппонентов не забанили, никто из них не выставил себя ламером. Троллинг не то чтобы зафейлен, а даже не начинался.
              Ответить
            • А можно я с нашего урсуса не толко уссусь, но и усрусь?
              Ответить
            • http://i065.radikal.ru/1004/3b/f21100d08608.png
              Всё согласно ГОСТу.
              Ответить
            • Тролль ссыт? Не ссы, расскажи, в чём прикол-то.
              Ответить
      • epic fail
        Ответить
      • да ты тупой ламер видимо
        Ответить
      • Мы не обиделись. Ты просто удот.
        Ответить
    • Да... Автор облажался по-полной :))
      Полил всех грязью и сам сел в лужу!
      Слишком много было умных рассуждений, а как до дела дошло...
      Ответить
    • Тред не читал, но на этих атмелах рам с 200000, а 100000 это флэш с кодом.
      Ответить
      • хаха он еще и фейк выложил
        былинный фейл
        Ответить
      • показать все, что скрытоguest 2 часа назад # 0
        Тред не читал, но на этих атмелах рам с 200000, а 100000 это флэш с кодом.
        ____________
        соси хуй, школьник. doc6287.pdf page 20
        internal flash - after 0x100000.
        а мы от верхнего адреса вычитаем и в срам попадаем.
        Ответить
        • ну совсем запизделся
          не поленился щас качнуть ман, так вот в этом pdf 17 страниц
          Ответить
        • Какой наш ursus милый. Ему бы тихо слиться, а нет, продолжает нехило доставлять.
          Ответить
        • и в срам попадаем.

          Верно подмечено.
          Ответить
        • Старик, лучше бы ты просто самоустранился, а то что ни пост, то слив...
          Ответить
          • Штирлиц попробовал слив. Потом он попробовал слив ещё раз. И только на третий раз Штирлиц понял, что слив не работает.
            Ответить
      • Я гарантирую это. В них карта памяти такая
        0x00000000 Boot Memory
        0x00100000 Internal Flash
        0x00200000 Internal SRAM
        0x00300000 Internal ROM
        Вычитая ОП попадает хуй пойми куда. Наверное, в этом и была тонкая подьёбка.
        Ответить
        • ремапинг происходит после разгона.
          Ответить
    • Автор пиздун.
      Ответить
    • Так автор чо, хотел с помощью говнокода баг отыскать?
      Ответить
    • А зачем вообще этой хуйней с дефайнами и адресами заниматься, объяви массивов чаров сколько надо и все, чай не ассемблером страдаем.
      Ответить
    • Про максима прохорова тоже спиздел.
      Ответить
    • Вот на ГК появился первый человек-мем (не считая с++ форсера)
      Ответить
      • Давно уже пора говнокод на Lurkmore записать...
        Ответить
    • ursus
      уссусь
      Ответить
    • Урсус! Урсус! Хочим ещё урсус! Больше хуеты, больше сливов!
      Ответить
    • забавно, что сначала оценка была "+3"

      т.е. ставили "типа я в теме" что ли?)
      Ответить
    • Жуткий код и жуткий компилятор, который это компилирует.
      Ответить
    • свершилась усрус вернулса!
      Ответить
    • Как добавить этот говнокод в избранные говнокоды в моём профиле?
      Ответить
    • Чёрт, нужно отплюсовать рейтинг, а то удалят...
      Ответить
      • не удалят он просто не будет отображаться на главной
        Ответить
        • гуглькеш и архив интернета спасут тебя
          Ответить
    • соси код и втыкай в хуй... ой, не могу, сейчас усрус!
      Ответить
    • просто оставлю здесь
      http://www.yaplakal.com/forum3/topic318893.html
      на память
      Ответить
    • Этот ГК будет вечным!
      Ответить
    • Ну так что посоны, в итоге кто выиграл ошибку-то нашли?
      Ответить
      • Нашли точку входа - entry point- в твой анус, проверь.
        Ответить
        • у тебя она называеться _main, потому что анус это главная и единственная твоя точка

          тфьу
          Ответить
          • Ты пользовался ДепендсВолкер-ом?
            http://www.dependencywalker.com/
            Ответить
            • разумеется, правда у меня еще есть плагин к фару который читает PE. Обычно я пользуюсь им: он конечно не транзитивный, но импорты/экспорты кажет.

              depends.exe сломался на API Sets, помню
              Ответить
          • У него она называется [email protected]
            Ответить
            • Это если его линковали с подсистемой windows. Тогда у него по умолчанию нет сосноли, зато есть НЁХ типа HINSTANCE , он ею может окошки и их классы создавать.

              Кстати, в x64 она не [email protected] И не [email protected] (как можно было бы подумать) а просто WinMain (судя по dumpbin .obj файла) бо другой калконвейншен видимо
              Ответить

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