1. Куча / Говнокод #28799

    +1

    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
    // https://github.com/torvalds/linux/blob/b6dad5178ceaf23f369c3711062ce1f2afc33644/rust/alloc/alloc.rs#L376
    pub const fn handle_alloc_error(layout: Layout) -> ! {
        const fn ct_error(_: Layout) -> ! {
            panic!("allocation failed");
        }
    
        fn rt_error(layout: Layout) -> ! {
            unsafe {
                __rust_alloc_error_handler(layout.size(), layout.align());
            }
        }
    
        unsafe { core::intrinsics::const_eval_select((layout,), ct_error, rt_error) }
    }
    
    
    // https://github.com/torvalds/linux/blob/b6dad5178ceaf23f369c3711062ce1f2afc33644/rust/kernel/lib.rs#L96-L103
    fn panic(info: &core::panic::PanicInfo<'_>) -> ! {
        pr_emerg!("{}\n", info);
        // SAFETY: FFI call.
        unsafe { bindings::BUG() };
        // Bindgen currently does not recognize `__noreturn` so `BUG` returns `()`
        // instead of `!`. See <https://github.com/rust-lang/rust-bindgen/issues/2094>.
        loop {}
    }
    
    
    // https://github.com/torvalds/linux/blob/master/include/asm-generic/bug.h#L51-L68
    /*
     * Don't use BUG() or BUG_ON() unless there's really no way out; one
     * example might be detecting data structure corruption in the middle
     * of an operation that can't be backed out of.  If the (sub)system
     * can somehow continue operating, perhaps with reduced functionality,
     * it's probably not BUG-worthy.
     *
     * If you're tempted to BUG(), think again:  is completely giving up
     * really the *only* solution?  There are usually better options, where
     * users don't need to reboot ASAP and can mostly shut down cleanly.
     */
    #ifndef HAVE_ARCH_BUG
    #define BUG() do { \
    	printk("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \
    	barrier_before_unreachable(); \
    	panic("BUG!"); \
    } while (0)
    #endif

    О том, как в ядре Linux говнораст обрабатывает ошибку аллокации

    Запостил: j123123, 19 Июня 2023

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

    • Поэтому я за Си.
      Ответить
    • > ядре Linux

      Переведи на Си. Мы не обязаны знать какой-то "говнораст".
      Ответить
      • Примерно так:

        void *govnorust_malloc(size_t size)
        {
          void *a = malloc(size);
          if (a == NULL) panic();
          return a;
        }
        Ответить
        • Кстати, а что будет, если я не проверю нанул? Я всё равно ведь упаду в паник
          Ответить
          • Если ты после "непроверки на null" попробуешь записать что-то по ptr[100500], далеко не факт что оно упадет. Оно может испортить где-то какую-то память с хуй знает какими последствиями, которые проявятся(а может и нет) хуй знает когда
            Ответить
            • точно

              нул плюс стопицот будет 100500
              Ответить
            • По адресу 100500 скорее всего находится память другого процесса и тебя пошлют нахуй при обращении.
              Ответить
              • «Реальный режим» был тридцать лет назад, дедуль.
                Ответить
                • в реальном режиме тебя никто не послал бы нахуй, внучок, кстати

                  В современном мире просто не будет такой записи в таблице и тебя пошлет нахуй MMU.

                  Однако же если мы гойворим про ядро, то тут у патриотов преград нету
                  Ответить
                  • Разумеется.

                    Именно поэтому сегодня по адресу 100500 находится только память текущего процесса, как и по всем остальным адресам от 0 до 18446744073709551615.

                    В ядре MMU тоже нахуй пошлёт — это превратится в PAGE_FAULT, а дальше в BUGCHECK() (а если у тебя IRQL достаточно высокий — сразу будет синий экран).
                    Ответить
                    • в ядре ты можешь поломать чужие структуры, и насрать не только своему процессу, но и всем процессам в системе вообще, и вообще всё поломать

                      >баг чек

                      ну мы на прыщах же
                      ``panic()``
                      Ответить
                • Кстати, кто-нибудь из присутствующих видел Win32s? Это прослойка, чтобы из Windows 3.1 (16-битной!) запускать приложения для Win32 API (на 32-битном процессоре, разумеется).

                  Так вот там не было разделения адресных пространств, все приложения запускались в общем пространстве. Из-за этого в Win32s нельзя было запустить программы с отрезанной таблицей релокейшнов. Движок Win32s был вынужден двигать приложения на в известной степени случайный адрес, чтобы адреса программ не пересеклись.

                  Не знаю, почему так сделали. Может быть, все приложения Win32 API были для Windows 3.1 одним процессом. Я уже не помню, что там выводилось в диспетчере задач.
                  Ответить
                  • ASLR за джвадцать лет до Висты!
                    Ответить
                  • Откуда там взяться диспетчеру задач?

                    Что-то делал для ВУЗа томущо 16-битная версия числодробительной прикладнухи херово работала, а мастдай еще хуже
                    Ответить
                  • ну потому что блядь наверное на winшестнадцать не было отдельных таблиц памяти для отдельных процессов, и потому все срали в одну дырку, как хиппи
                    Ответить
              • Опровергаю. По адресу http://www.100500.net/ находится китайская хуета. Насчёт части с пошлют нахуй при обращении претензий не имею.
                Ответить
                • • <789电影网>点击下列链接访问

                  • <789电影网>点击下列链接访问

                  • <789电影网>点击下列链接访问

                  • <789电影网>点击下列链接访问

                  • <789电影网>点击下列链接访问

                  • <789电影网>点击下列链接访问

                  • <789电影网>点击下列链接访问

                  • <789电影网>点击下列链接访问

                  • <789电影网>点击下列链接访问

                  • <789电影网>点击下列链接访问

                  • <789电影网>点击下列链接访问

                  • <789电影网>点击下列链接访问

                  • <789电影网>点击下列链接访问
                  Ответить
                • >китайская
                  и так, песня
                  https://www.youtube.com/watch?v=unW7UYXSQNY
                  Ответить
              • RINGE CUTTE 0 же
                Ответить
          • > проверю нанул? Я всё рав

            Мальчик Боря обманул
            Маму, папу, и дядьёв
            Боря стал теперь нанул
            Боря ловит воробьёв
            Ответить
        • А что не так?
          Ответить
    • Так это торвальдс полощет мозги хипстерам, чтобы они всё, что работало, переписывали на дrustню?
      Ответить
    • Ой я не могу..
      3a_O6e_Horu такой забавный
      Ответить
    • какой багор)) это вместо обычной проверки маллока нанул?
      Ответить
    • > unsafe {
      > unsafe {
      > unsafe {
      БИЗАПАСНЫЙ ЙАЗЫК!!!!1111
      Ответить
      • #define unsafe
        
        int main(int argc, char* argv[]) {
            unsafe {
                do_shit();
            }
            return EXIT_SUCCESS;
        }

        Является ли эта программа в понимании фанатиков дrustни полностью безопасной и современной (в отличие от бумерских «сишек»)?
        Ответить
        • нет, потому что есть ансейф
          Ответить
        • Даже PHP не unsafe. Есть способы крашнуть PHP так, что ошибку невозможно перехватить.
          Ответить
    • Существует ли релокация в Чебаркуль?
      Ответить
    • быть нежирным это расизм
      если ты не расист, то должен быть жирным
      https://twitter.com/nypost/status/1671225688873893893
      Ответить

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