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

    −45

    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
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    #define _GNU_SOURCE
    
    #include <ucontext.h>
    #include <unistd.h>
    #include <signal.h>
    #include <stdio.h>
    #include <string.h>
    
    volatile void *retry_address = NULL;
    volatile int *value = NULL;
    int value_holder = 5;
    #define debug_write(MESSAGE) write(1, MESSAGE, sizeof(MESSAGE) - 1)
    
    #if defined(REG_RIP)
    #define REG_IP REG_RIP
    #elif defined(REG_EIP)
    #define REG_IP REG_EIP
    #else
    #error Intel only!
    #endif
    
    void segv_handler(int signum, siginfo_t *info, void *ucontext_ptr)
    {
    	debug_write("You forgot to allocate your memory? Let's try again.\n");
    	value = &value_holder;
    	ucontext_t *ucontext = ucontext_ptr;
    	ucontext->uc_mcontext.gregs[REG_IP] = (greg_t)retry_address;
    }
    
    int main()
    {
    	__label__ retry_label;
    	retry_address = &&retry_label;
    	struct sigaction action;
    	memset(&action, 0, sizeof(action));
    	action.sa_sigaction = segv_handler;
    	action.sa_flags = SA_SIGINFO;
    	if (sigaction(SIGSEGV, &action, NULL) < 0)
    	{
    		perror("sigaction()");
    	}
    retry_label:
    	debug_write("Trying to access *value...\n");
    	printf("The *value is %d\n", *value);
    	return 0;
    }

    К недавнему вопросу о восстановлении после SIGSEGV.
    http://ideone.com/l5pWVp

    Запостил: Bobik, 15 Июля 2016

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

    • Ну и портабельный вариант: http://ideone.com/aeDJ9V
      Ответить
      • код сверху включает ucontext.h - автор скорее думал о getcontext()/setcontext() вместо *jmp(), но до конца не дописал.
        Ответить
    • Если жизнь после сигсегв?
      Ответить
    • В одном армовом проекте так хэндлили исключения внутри падучей унаследованной либы: увеличивали PC на 4 и возобновляли выполнение. Работало, пока либу не переписали.
      Ответить
      • > увеличивали PC на 4 и возобновляли выполнение
        on error resume next
        Ответить
      • > Работало, пока либу не переписали.
        Либу переписали так, что даже игнор падений перестал помогать?
        Ответить
        • видимо перестало совпадать с размером команды в месте падения
          Ответить
          • Разве на АРМе бывают команды с размером, отличающимся от 4 байтов?
            Ответить
            • Thumb
              Ответить
              • Подумаешь, 2 команды пропустит...
                Ответить
                • Особенно если одна из них — это команда переключения из Thumb в обычный режим... Да и пропуск обычного безусловного перехода — это тоже весело.
                  Ответить
                  • > это тоже весело
                    Особенно в сочетании с тем самым хендлером, который будет пропускать все зафейленные команды... Ничто не остановит бульдозер. Разве что сторожевой пёсик прервёт всю эту вакханалию...
                    Ответить
                    • Хахах. У нас в хендлере прерывания таймера дергали за анус смотрящего пса. Так что у нас висяк редко что останавливало)) Хотя в хедлере ав остановить таймер - было бы не плохо
                      Ответить
                      • > хендлере прерывания таймера дергали за анус смотрящего пса
                        Та самая Toyouta Camry, которая любила разгоняться?
                        Ответить
                        • Не, СЧПУ. Ставили на разные станки. Однажды поставили на станок размером со здание. Рабочий орган - гигантский, чуть ли не с человека. Его включили и эти пол тонны начали разгонятся в сторону наших настройщиков прямо в стену. К теме скорее всего не относится. Ошибка видимо была из-за положительной обратной связи, вместо отрицательной ПИД-регулятора.
                          Ответить
                          • Робот Томми на соревнованиях DARPA под управлением Linux с софтом на Java убился об стену на скорости около 100 км/ч.

                            Теперь у нас есть практическое доказательство того, что ява не тормозит.

                            Новость на линукс форуме сейчас не найду.

                            ps
                            а во http://www.linux.org.ru/news/java/1109623
                            Ответить
                          • > положительной обратной связи, вместо отрицательной
                            Кто-то минус пропустил?

                            З.Ы. Неужели этих полутонных няшек сначала на каком-нибудь симуляторе не тестят?
                            Ответить
                            • ну где-то может и тестят, а где-то и коэффициенты пидрегуляции считают по уравнениям устойчивости обратной связи и тд. Но это Россия. Понабрали студентов по объявлению за еду. А те, как в лабах обычно бывает формулу пид-регулятора с википедии скопипастили и потом опытным путем коэффициенты подобрали. Вроде не стоит, вроде не дергается, вроде на автопилоте не разгоняется, - значит норм, хорошо зашло, пропишем в настройки
                              Ответить
                              • > Вроде не стоит, вроде не дергается, вроде на автопилоте не разгоняется, - значит норм
                                Напомнило про хабролифт из ардуины, фольги и соплей.
                                Ответить
                          • Пид регулятор с положительной обратной связью даже в симулинке фейлит. Коэффициенты надо пальцем в небо ткнуть, чтобы её не заметить
                            Ответить
                            • Симулинк - говно
                              https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65077 вот что этот ваш ссаный симулинк на Си блядогенерирует, охренеть не встать. Указатели в плавучие питухи упаковывают
                              https://gcc.gnu.org/bugzilla/attachment.cgi?id=34777

                              I mean - seriously storing a pointer as FP values of the upper/lower word
                              of the pointer? So I suppose this is what Matlab/Simulink generate internally
                              and what gets compiled - thus this is machine generated?
                              Ответить
                              • a[3.14159] = 5;
                                Ответить
                              • Я и не предлагал использовать его для кодогенерации. Простая проверка в три квадратика нарисует график с лимитом в yo mama weight
                                Ответить
                                • Ну вообще я к тому, что странно ожидать чего-то хорошего от тех, которые кодогенерируют в сишку, засовывая указатели в плавучку
                                  Ответить

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