1. Swift / Говнокод #19104

    −33

    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
    //
    //  How ARC causes memory leaks and leads to crashes out of the blue
    //
    
    import Foundation
    
    let noLeak = 131030          // Empirically found constant
    let withLeak  = noLeak*10
    
    // Single-linked list
    class R {
        var _a : R?
        init(a : R?) {
            _a = a
        }
    
    //    One have to resort to a manual C-like code to fix it
    //
    //    deinit {
    //        var i = self._a;
    //        while let i2 = i {
    //            let t = i2._a
    //            i2._a = nil
    //            i = t
    //        }
    //    }
    }
    
    func test(n:Int, leak:Bool) {
        let p0 = R(a : nil)
        var p = R(a : p0)
        for _ in 1...n {
            p = R(a : p)
        }
        if leak {
            // When the list is not cyclic it will be deleted by ARC just fine...
            p0._a = p
        }
    } // Oh wait, the destructor isn't tail-recursive...
    
    test(withLeak, leak: true)
    print("Bad leaking function")
    test(noLeak, leak: false)
    print("Good function")

    гц -- сила, ARC -- могила
    (язык -- Swift, если что)

    Запостил: CHayT, 28 Ноября 2015

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

    • деструктор падает с BAD_ACCESS
      Ответить
    • if leak {
          p0._a = p
      }

      Внимание! Обнаружена ЖЖ Артем утечка памяти при создании циклических ссылок!

      А вообще, вот из-за, в том числе, таких магических крешей (с BAD_ACCESS, Карл!) Свифт и не готов к продакшну. ObjC ещё минимум года два-три будет основным языком вменяемых разработчиков под эти наши гейфоны.
      Ответить
      • Ты так говоришь, как-будто в Objective C этих проблем нет... Тот же самый ARC с присущими любому reference counting'у проблемами.
        Ответить
    • > cyclic
      Ну а что ты хотел? В крестах std::shared_ptr точно так же течёт от закольцованных структур...

      > деструктор падает с BAD_ACCESS
      ... и точно так же сегфолтится от переполнения стека при разрушении слишком глубоких структур.
      Ответить
      • P.S. И в конце-концов, где в мобильной гуйне на практике нужны самодельные связные списки длиной в километр? Это же не хаскель какой-нибудь, где эти списки для любых целей юзают...
        Ответить
        • Зато удобный способ измерения размера стека.
          Ответить
          • показать все, что скрытоГосподи, что за хуйню ты несеш???
            Ты понимаешь что ты поехавший??
            Ответить
            • Он кобенатор
              Ответить
              • Вспомнилась песенка:

                Я скриптом кобенирую тексты
                Марковской цепью построив коммент
                Силой питона ворцую пространство
                На миллионы комментов за тред.

                Я -- кобенатор. Он -- кобенатор.
                Ты -- кобенатор. Мы -- кобенатор.
                Ответить
                • > Марковской цепью
                  в 2к18 пора осваивать лстм и внимание
                  Ответить
        • > Это же не хаскель какой-нибудь
          запах борща чувствуется там неплохо так
          правда то, что в хаски делается парой классов, в свифтие запилили как кривой синтаксис
          Ответить
      • Суслик
        Ответить
      • > Ну а что ты хотел?
        исключительно срача про модели управления памятью
        Ответить
        • Все модели говно и имеют кучу ограничений. Гц тоже не панацея. [/срач]
          Ответить
          • ГЦ вообще не нужно, потому что оно для анскиллябр заедушных, которым взападло убрать за собой после того, как насрали. Настоящим программистам ГЦ только мешает.
            Ответить
          • вообще говно не нужно, говноязык , животное, потому что оно для питушня для питушков питушня для питушков анскиллябр заедушных, которым взападло , днище галимое, убрать за и ещё раз повторю, тебе животное после того, как говно насрали. настоящим программистам Царь гц только говноязык мешает.
            Ответить
            • p.s. и в ко-ко-ко конце-концов, где , животное, питух, иди кукарекай, в мобильной хасвелл гуйне
              Ответить
    • >131030 // Empirically found constant
      Что-то тут пахнет неточным умножением 128*1024.
      Ответить
      • Ну размер стека, походу, кратен степени двойки (и размер фрейма деструктора тоже). А небольшой недобор съели рантайм, main и test.
        Ответить
    • зато заедушный удобный анскилед способ измерения размера стека
      Сишка, господи, что заедушный за хуйню ты несеш???
      ты понимаешь что ты говно поехавший??
      > это же хасвелл не хаскель, животное, какой-нибудь
      запах борща ко-ко-ко питух чувствуется там питух неплохо так
      правда заедушный то, что , питух, иди кукарекай, говноязык в хаски делается
      Ответить
      • Расчехлил генератор бреда?
        Ответить
        • отговорите меня от написания генереций на основе link grammar
          Ответить
          • Когда делать будешь - дай ссылку на гит, мне интересно

            А лучше стрим на твиче запили
            Ответить
            • На LiveCoding же
              Ответить
              • уже и такое есть?
                сраные хипстеры
                P.S. проект в процессе, парсить грамматику я уже умею, но времени у меня сейчас мало пишу с работы (sic)
                Ответить
          • KobNode 1 (Right (NLPWord {_nlpword = "the", _nlpclass = ""},([],[])))
            KobNode 2 (Right (NLPWord {_nlpword = "gray", _nlpclass = ""},([],[])))
            KobNode 0 (Right (NLPWord {_nlpword = "dog", _nlpclass = ""},([],[])))
            KobNode 3 (Right (NLPWord {_nlpword = "runs", _nlpclass = ""},([KobNode 4 (Left D-)],[])))

            то чувство, когда из-под слоя служебных данных начала показываться сверхтвёрдая синтаксиальная психоза

            ^______^
            Ответить
            • ...
              the dog slowly slowly runs
              the dog slowly soundly runs
              the dog soundly slowly runs
              the dog soundly soundly runs
              the dog slowly runs
              the dog soundly runs
              the dog slowly runs
              the dog soundly runs
              the dog runs
              the dog slowly slowly sleeps
              the dog slowly soundly sleeps
              the dog soundly slowly sleeps
              the dog soundly soundly sleeps
              the dog slowly sleeps
              the dog soundly sleeps
              the dog slowly sleeps
              the dog soundly sleeps
              the dog sleeps

              так оно работает работает на тестовой грамматике
              щас надо сменить вореционный движок, и можно будет засирать тут всё
              Ответить
      • >>это же хасвелл не хаскель
        да и Гарин не Гагарин (с)
        Ответить

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