Забавные новости 0й-Ti :)

Тема в разделе "WASM.HEAP", создана пользователем UbIvItS, 18 июн 2018.

Статус темы:
Закрыта.
  1. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.241
    ну- это как-то неопределённо :) можно вот crate stacker (https://docs.rs/stacker/latest/stacker/) но тоже от него толку маловато - приходится делать отдельный поток с заданным размером стека :)
     
  2. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.460
    Адрес:
    Россия, Нижний Новгород
    UbIvItS, а что значит отлавливать? Если у тебя вылетает переполнение - ты просто падаешь, смотришь дамп и исправляешь. Ошибки нельзя маскировать и пытаться "выжить".
    По крайней мере, в "обычном" пользовательском софте. Насчёт критичного, который никогда не должен падать, не знаю, но там и языки другие.
    --- Сообщение объединено, 20 дек 2023 ---
    Ну и, к слову, речь была про шарп. На расте ты и OutOfMemory не поймаешь - он кинет панику, что очень странное решение.
    --- Сообщение объединено, 20 дек 2023 ---
    Что бы тебе такого показать... Давай, например, один из мейнстрим-фреймворков для веб-бэкендов: tokio-rs/axum: Ergonomic and modular web framework built with Tokio, Tower, and Hyper (github.com)
    По своему опыту могу сказать, что ансейф нужен только когда ты работаешь с системными апишками или сырыми недоверенными буферами.

    Например, помнишь у меня проектик BeeSynth?
    Можно сделать поиск по "unsafe" и посмотреть, где я его использовал:

    upload_2023-12-20_1-0-5.png

    Обрати внимание: винапи-винапи-винапи-xm, там выше ещё wav и для поиска и патчей в физической памяти.
    В бизнес-логике - ни одного ансейфа.

    И таки да, AV я ловил - как раз в одном из ансейф-мест, где непосредственно ходил по оперативке. Шо поделать, такова жизнь.
     
  3. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.241
    переполнение == сегфолт, а вот предупреждение о стековерфлоу идёт после сравнения свободного места в стеке против размера данных, кои туды нужно запихнуть. stacker, по идее, должен в этом случае просто тихо увеличить размер стека, но (конечно) непрерывного куска памяти должного размера может и не быть, что собс-но и приводит к тупому свалу в панику. поэтому более надёжной схемой оказывается запуск отдельного потока иль процесса.
    сишка и асм тамо, а аду давно выкинули за редким исключением, ибо она в сущности та же ржака :)
    почему? отлавливается а-ля..
    let ret = match fking_smth{
    Some(v) => v,
    _ => default()
    };
     
  4. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.460
    Адрес:
    Россия, Нижний Новгород
    Обычно переполнение происходит из-за двух вещей:
    1. Бесконечная рекурсия.
    2. Несколько фреймов, в каждом из которых на стеке создали относительно небольшие массивы, но которые в сумме переполнили стек.

    И то, и другое - баги.
    С ними нельзя бороться в рантайме, нельзя увеличивать динамически стек (его даже процессор не даст перевыделить вручную, если включен CET).
    Единственное решение - все крупные объекты выделять динамически и избегать рекурсии неопределённой глубины.
    Любые другие костыли в рантайме не решат проблему. Сделаешь стек растущим - упадёшь из-за того, что он съест всю память. Так себе решение.

    Кроме того, ты можешь так удачно переполнить стек, что залезешь не в red zone, а на чью-то валидную страницу, начнёшь там читать и писать - и тоже в конце концов упадёшь.

    Такие ошибки просто невозможно корректно обработать в рантайме. Вообще никак.
    Или добавлять поддержку в компиляторы, чтобы на каждый sub rsp, N они вставляли проверки, а все вызовы функций могли бы корректно возвращать ошибку, если некуда класть адрес возврата.
    Или просто не забивать голову ерундой и оставить всё как есть: вот вам стек, которого вам с избытком хватит для любых программ, если вы не будете хранить в нём мегабайтные буферы и не будете рекурсивно ходить вглубь на миллион фреймов.
    --- Сообщение объединено, 20 дек 2023 ---
    Если выделяешь вручную - можно, но вручную ты не выделяешь: коллекции из std/alloc кидают панику, если не получилось выделить.
    Так как это никого не устраивает, некоторым коллекциям добавили try-методы, которые могут вернуть ошибку, но не всем.
     
  5. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.241
    да, это всё понятно и в том-то весь прикол - жирный рантайм с кучей "сейфовых" чекеров как раз-таки и приводит к бешеному сжиранию стека :)
    вот это, да - ещё одна смехота ржаки (непрозрачность кода) == обёртки маскируют UB прям идеально, тч в куче случаев даже проще да надёжней свою реализацию сделать :)
     
  6. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.460
    Адрес:
    Россия, Нижний Новгород
    Ну кстати нет, стек ведь растёт только на вызовах. Проверки стек не едят, а рантайму нечего хранить. Если остановишься в мейне и посмотришь стактрейс, там будет всего 5-6 фреймов.

    А вот что по-настоящему ест стек - это асинки. Для переключений контекстов им надо сохранять на стек состояние потока, что дешевле, чем выделять память на каждый await, но что имеет повышенные шансы переполнить.

    На самом деле, здесь UB такой, условный.
    В юзермоде если у тебя кончилась память, ты в затруднительном положении: вряд ли ты можешь продолжать.
    А в линуксе тебя ещё и OOM-киллер прибьёт просто потому что. Найс решение убивать всех подряд.
    Но в ядре мы падать не хотим, это уже чересчур, и здесь пока нет хороших решений: где есть - юзаем try-методы, а у кого их нет - остаётся писать свои коллекции (или юзать сторонние, благо есть из чего выбрать).
    Так что именно в случае OOM наверно приемлемо ~
     
  7. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.241
    так чекер и есть функа (либо инлайн, либо внешняя) - она вызывается рантаймом.
    нет памяти - процесс переходит в режим ожидания: ждёт пока манагер освободит место или показывает юзверу сообщение с предложением завершить работу. вообще, память для дефолтных операций должна быть по-определению, иначе же работа должна завершиться ещё во время инициализации процесса.
     
  8. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    Код (Text):
    1. using System.Runtime.CompilerServices;
    2. using System.Collections.Generic;
    3. using System;
    4.  
    5. public class Program {
    6.     public static void Main(string[] args) {      
    7.         StackOverflowTest();
    8.         NullPointerTest();
    9.         OutOfMemoryTest();
    10.     }
    11.  
    12.     private static void StackOverflowTest() {
    13.         void AsRecursiveAsFuck() {
    14.             // Это чит, но всё же...
    15.             RuntimeHelpers.EnsureSufficientExecutionStack();
    16.             AsRecursiveAsFuck();
    17.         }
    18.  
    19.         try { AsRecursiveAsFuck(); }
    20.         catch {
    21.             Console.WriteLine("StackOverflowTest!");
    22.         }
    23.     }
    24.  
    25.     private static void NullPointerTest() {
    26.         unsafe byte UnsafeReadMemory(IntPtr ptr) {
    27.             return *(byte*)ptr;
    28.         }
    29.  
    30.         try { UnsafeReadMemory(IntPtr.Zero); }
    31.         catch {
    32.             Console.WriteLine("NullPointerTest!");
    33.         }
    34.     }
    35.  
    36.     private static void OutOfMemoryTest() {
    37.         try {
    38.             var list = new List<byte[]>();
    39.             for(var i = 0; i < 1000; i++) {
    40.                 list.Add(new byte[1024 * 1024 * 1024]);
    41.             }
    42.         } catch {
    43.             Console.WriteLine("OutOfMemoryTest!");
    44.         }
    45.     }
    46. }
    Код (Text):
    1. > dotnet run
    2. StackOverflowTest!
    3. NullPointerTest!
    4. OutOfMemoryTest!
     
    UbIvItS нравится это.
  9. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.241
    Rel, хорошо, конечно, но речь всё же была про ржаку.. а шарпея я ужо едва ль когда пользовать буду:)
     
  10. Win32Api

    Win32Api Member

    Публикаций:
    0
    Регистрация:
    16 окт 2022
    Сообщения:
    109
    UbIvItS, давно пора понять, на васме спорить бесполезно.

    Речь шла не о си-шарпе? Это не важно )

     
  11. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    А ржавого будешь штоле?
     
  12. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
  13. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    И что изменилось? Цветную картинку в инторнете увидел? Ох уж эти менеждеры... :)
     
    UbIvItS нравится это.
  14. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    q2e74 нравится это.
  15. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.241
    и, чтоб прочитать эту чушь, надо подписаться :)
    --- Сообщение объединено, 27 дек 2023 ---
    плюха всегда была идеальным средством для извратов в коде, а со временем она всё идеальнее для оного :)
     
  16. Win32Api

    Win32Api Member

    Публикаций:
    0
    Регистрация:
    16 окт 2022
    Сообщения:
    109
    UbIvItS, Тиньков пояснил за Цэ лучше, чем все пиндоские книги которые я читал )
     
    Последнее редактирование: 27 дек 2023
  17. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    Плюсы - для извратов, Цэ - мерзость:

    ...на чем теперь спецам писать - не понятно...
    --- Сообщение объединено, 27 дек 2023 ---
     
    q2e74 нравится это.
  18. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.241
    не, сиха ПОЧТИ ИДЕАЛЬНА :) главное помнить, что указатели есмь альфа да омега всей сихи - от них все горести тамо и в них же вся СИла :)
    на всём, что более-менее работает... хотя бы пока :crazy::laugh1::laugh2::laugh3: кстати, сиха - это единственный полноценный яп с инженерным статусом (если не считать асм) :)
     
    Win32Api нравится это.
  19. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    Инженерный статус? Это что-то из серии самовыдуманных спецовых терминов, или что имеется ввиду?
     
  20. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.241
    никакой мистики - что написал, так и работает - компиль не вумничает == на сихе стреляешь себе в ногу, попадаешь в ногу; на ржаке иль аде стреляешь себе в ногу, можно снести себе голову. Пч компиль дюже вумный и не допускает прямой работы с сырыми данными :)
     
Статус темы:
Закрыта.