Куча говна / Говнокод #28799 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 j123123, (Updated )

Комментарии (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 одним процессом. Я уже не помню, что там выводилось в диспетчере задач.
                Ответить
                • Откуда там взяться диспетчеру задач?

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

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

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

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

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

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

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

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

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

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

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

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

                • <789电影网>点击下列链接访问
                Ответить
        • > проверю нанул? Я всё рав

          Мальчик Боря обманул
          Маму, папу, и дядьёв
          Боря стал теперь нанул
          Боря ловит воробьёв
          Ответить
  • Так это торвальдс полощет мозги хипстерам, чтобы они всё, что работало, переписывали на д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 так, что ошибку невозможно перехватить.
        Ответить
  • Существует ли релокация в Чебаркуль?
    Ответить

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

Помни, guest, за тобой могут следить!

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


    8