1. Objective C / Говнокод #12196

    −1050

    1. 1
    2. 2
    3. 3
    - (void) closeApp {
       int closer = 1 / 0;
    }

    Закрываем программу легкой арифметикой.
    Найдено в рабочем проекте.

    Запостил: itruf, 25 Ноября 2012

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

    • В питоне элегантнее

      raise 1/0
      Ответить
      • А в PHP просто
        die();
        Ответить
        • Кошмар. Оказывается, в PHP дивижен бай зеро — всего лишь ворнинг, а не еррор, поэтому после него работа программы продолжается.

          А чем можно элегантно остановить программу, кроме стандартной функции die()?
          Ответить
          • > в PHP дивижен бай зеро — всего лишь ворнинг
            Да, я уже как-то пробовал поднять эту тему
            http://govnokod.ru/11978#comment157561
            > А чем можно элегантно остановить программу, кроме стандартной функции die()
            стандартной функцией exit() :)
            Ответить
            • ... или вызовом заведомо несуществующей функции: http://ideone.com/kGTEv9
              Ответить
            • поднятие не менее стандартного исключения throw new Exception('Деление на ноль.');
              Ответить
              • throw new Exception('Деление на ноль. Счастливой вам отладки.');
                Ответить
          • >дивижен бай зеро — всего лишь ворнинг
            И это далеко не самое страшное. Такова идеология PHP - если что-то ломается, лучше промолчать и продолжить работу в поломанном состоянии - 30 секунд позора максимум и программа остановится.

            >А чем можно элегантно остановить программу
            Разрубить катаной сервер на две половинки, как в голливудских фильмах. Чтобы еще не сразу распался на части, а постепенно разъехался.
            Ответить
          • >дивижен бай зеро — всего лишь ворнинг, а не еррор, поэтому после него работа программы продолжается.
            А в чем проблема? 1/0 есть inf.
            http://ideone.com/yzlDDY
            Чего это программа должна останавливаться? Максимум исключение при соответсвующих настройках, если разрешили.
            Ответить
            • Всё правильно. Но старые языки программирования приучили нас к тому, что после деления на ноль должно произойти что-то непоправимое.
              Ответить
              • http://ideone.com/dcndsm
                Это ты про какие языки, бро?
                int то конечно своё возьмет
                Ответить
                • Про Бейсик наверное: http://ideone.com/lsS96M
                  Спойлер я сразу не приметил.
                  Ответить
                  • Точно про бейсик:
                    http://ideone.com/cE4Cgd
                    http://ideone.com/VhXO5d
                    Ответить
                    • У меня всё работает: http://ideone.com/BXaIVc
                      Ответить
                      • Почему ты поставил себе такую позитивную и зеленую аватарку?
                        Тоже такую хочу, но идеи для слогана пока не придумал.
                        Ответить
                        • А я иногда принимаю облик того, что увидел, как Нечто. Шёл по парку, увидел такую симпатичную табличку и подумал, а почему бы не поставить её на аватарку. Мне самому страшно подумать, что в следующий раз может оказаться на моей аватарке.
                          Ответить
                          • Надо написать скрипт, который будет каждый день искать картинку по слову из словаря и ставить ее на аватарку...
                            Ответить
              • > Но старые языки программирования
                Для начала - процессоры со своим int 0.
                Ответить
                • PowerPC игнорирует целочисленное деление на ноль. Питух вот настраивается.
                  А в ARM походу вообще нет инструкции для целочисленного деления, её нужно эмулировать программно.
                  Ответить
          • потому что пхп стабильнее
            Ответить
        • В iOS приложение может закрыть только система, приложение, которое закрывается само - даже в магазин не пустят.
          Ответить
          • 4.2. Мобильный клиент Альфа-банка при отсутствии инета закрывается сам только так.
            Ответить
            • Это уже недосмотр ревьюеров. У них, видимо, интернет бьл :)
              Ответить
      • просто raise, лучше sys.exit(0)
        Ответить
      • 1/0

        raise не нужен
        Ответить
    • а я томат
      Ответить
    • Изящно.
      Ответить
    • Передайте привет написавшему, и пожелайте почитать таки гайдлайны. За самостоятельное закрытие Эппл приложения реджектит.
      Ответить
      • Правильно! Ишь чего выдумали - самим решать, когда закрывать приложение! За всех всё должен решать Яббл!
        Ответить
      • А если приложение свою миссию закончило (вспомогательная утилита, например), то по задумке Эппла оно должно продолжать висеть, отображая статическую картинку?
        Ответить
        • Yes, it is.
          Ответить
        • >продолжать висеть, отображая статическую картинку?
          Статическую картинку рабочего стола.
          Ответить
        • Сообщить пользователю о завершении и предложить повторить действие. Там же, в принципе, самое страшное из приложений - ssh-клиент.
          Яббл придерживается того мнение, что приложение должен закрыть пользователь.
          Ответить
          • > приложение должен закрыть пользователь
            А он может? Или максимум, что он может - переключиться на десктоп или другую прогу?

            P.S. На ведроиде же тоже такая идеология, при которой закрытие проги считается неприличным.
            Ответить
            • Да, может. До введения многозадачности в 4.0 (в принципе, она и раньше была, но только для сервисов) кнопкой home (той, единственной) приложения именно закрывались. Сейчас - уходят в фон, и пользователь их может завершить из специального меню.
              Ответить
              • фон фону рознь: по личным наблюдениям долго висящая в фоне прога выгружается. Значок, правда, продолжает висеть, но по тапу происходит новый запуск, а не восстановление.
                Ответить
                • Да там как повезёт. Начнём с того, что обычно программе, висящей в фоне процессорного времени по умолчанию не выделяется. Есть флаг Geolocation Services, который можно установить прилодению при компиляции, тогда система будет дёргать его раз в 10 минут. Как в iOS работают im-клиенты - для меня тайна покрытая мраком. Надо гуглить этот вопрос, короче говоря :)
                  Ответить
                  • Там AlarmManager'а как на ведре нету?
                    Ответить
                    • А что AlarmManager'а делает в Ведроиде?
                      Ответить
                      • Исполняет определенный метод по таймеру независимо от того загружена ли в данный момент прога.

                        Можно указать флажок, чтобы метод вызывался даже если тело спит (тело уходит в спячку сразу после выхода из него, но если надо что-то длинное, то через PowerManager можно договориться, чтобы не засыпал).
                        Ответить
                        • Нет, не встречал такого. Хотя, как я говорил, я не знаю, как работают im-клиенты, так что возможно я о такой штуке просто не знаю.
                          Ответить
                          • В iOS в бекграунде могут работать только VoIP, GPS и Audio сервисы.
                            Программы в бекграунде висят до тех пор, пока есть свободная память, потом выгружаются в порядке отожранной памяти, и в менюшке остаются только иконки. Поэтому имеет смысл писать оптимизированные в плане памяти приложения, и выгружать не нужный кеш при уходе в бекграунд, что бы программа не убивалась системой.
                            Ответить
            • > при которой закрытие проги считается неприличным
              Я придумал офигенную технологию. Сначала при запуске все установленные приложения запущены, но неиспользуемые вытеснены в медленную память. "Открытие" приложения подгружает его обратно в ОЗУ. Закрытия нет. Когда программа хочет закрыться (по требованию ОС, пользователя или внутреннему событию), она просто суспендится. Но не закрывается никогда. Фу! Нельзя закрываться!
              Срочно бегу патентовать.
              Ответить
              • win 3.1+hibernation на уровне приложения.
                Ответить
              • Ага, и эту систему нужно писать на лиспе или смолтолке, в пределах одной виртуальной машины. Тогда даже удалять проги не надо. Сборщик мусора сам уберет, когда на нее пропадут все ссылки с рабочего стола и т.п.
                Ответить
                • И файловую систему сделать с мусоросборщиком. Файл убирается тогда и только тогда, когда он не открыт ни в одной программе и на него нет ни одной ссылки с рабочего стола.
                  Ответить
                  • Ну тут даже далеко идти не надо. Взять банальнейший ext3. Вместо симлинков на рабочий стол кидать хардлинки. Как только все хардлинки сдохли, и все хендлы закрылись, содержимое файла будет выпилено.
                    Ответить
              • Напоминает какую-то операционку, которая дальше концепта не дошла. Впрочем, учитывая количество быдлокодеров, программа, которая не сохраняет данные, рано или поздно похерит их все. ЕМНИП, её вроде "пилили" в этой стране.
                Это точно не болдженос
                Ответить
                • Фантом ОС что-ли. Давно про нее ничего не слышал.
                  Ответить
        • ))в ios нет понятия "корректное завершение"
          оно должно висеть либо пока его не убьет иос или пользователь, либо ты можешь сам его закрть, но тогда ты мудак
          Ответить
      • http://govnokod.ru/12196#comment162422
        Ответить
    • А вот интересный вопрос, почему оптимизатор не выпиливает нафиг тело этой функции? Неужели догадывается, что побочный эффект нужен?
      Ответить
      • В режиме С или С++ gcc, icc и clang выпиливают такой код нахрен. Походу автор просто не включал оптимизатор, и собирал все на -O0.
        Ответить
        • Хех, по-ходу с такими умелыми программистами, у Эппла не остается такого уж большого выбора: либо поднимать цену на лицензию разработки для иОС, либо писать какой-нибудь клон .НЕТ (автоматическую сборку мусора вроде как уже начали добавлять)...
          Ответить
          • Либо взять как гугл у дяди Ларри жабу.
            Ответить
            • Они ж ее ловко запретили в соглашении разработчика, не? А потом еще с Ораклом судиться... я бы не стал :)
              Ответить
              • >А потом еще с Ораклом судится
                Потому и не хотят брать. С виду бесплатно и никому не впёрлось, а начнешь кодить - плати.
                Лежит жаба - нельзя юзать.
                Ответить
          • А то в иосе и так гц нету?
            Ответить
            • Возрадуйся о Тарас за разработчиков иосовых. Не согрешили они сборщики мусора используючи.
              Ответить
              • Скажешь ещё, в ожбц нету уборщика?
                Ответить
                • нет. все референс каунт
                  Ответить
                  • А, вон оно как? Не знал, не знал.
                    Все три иосовских уборщика - детерминированные шаред поинтеры? Это отвратительно, как же делать граф из объектов чтобы он не тёк?
                    Ответить
                    • "Просто не нужно делать граф объектов" (c) Steve Jobs
                      Ответить
                    • Просто обрежь граф объектов так, чтобы он стал деревом.
                      Ответить
                      • Охуеть, ты ещё скажи "просто возьми и руками удали".
                        Впрочем, да, архитектура тут похожая, отдельно заводишь список ВСЕХ вершин графа, чтобы стопудов ни одна падла не повисла в кольце, а потом перед удалением обходишь граф, помечая вершины и зануляя ссылки на помеченные, да только вот при классической рахитектуре этого делать не обязательно, если только граф не колбасится непрерывно всю жизнь приложения, а это означает, что сложность написания кода тем самым увеличилась.
                        Ответить
                    • > Это отвратительно, как же делать граф из объектов чтобы он не тёк?
                      Слабые ссылки? Думаю си-указатель * в Objective C сойдет за слабую.
                      Ответить
                      • А в ожбс можно сильную ссылку на объект кастовать в слабую?
                        Ответить
                        • Там один тип ссылки - сишный.
                          Все объекты фреймворка являются потомками класса NSObject, который содержит в себе счётчик ссылок. Изменяется в коде он явно - вызовами init, copy, retain, release, autorelease (объект помещается в специальный список, который когда-нибудь вызовет ему release). ARC занимается, по сути, тем, что втыкает вызовы retain/autorelease согласно соглашениям, принятым в языке.
                          Увеличивать или уменьшать счётчик ссылок надо вручную.
                          Для сишных структур счётчиков ссылок нет - всё как в Си, секс по полной.
                          Eщё в Obj-C такой хитрый тип, как id, но по сути он void*, только набор вернингов для него отличается (например, если вы попробуете отправить сообщение объекту с типом id - всё будет нормально, ибо так и задуманно, а если void* - получите warning на этапе компиляции).
                          Ответить
                      • > Думаю си-указатель * в Objective C сойдет за слабую.
                        Си указатель сойдет за опасную ссылку, а не за слабую. Слабая ссылка должна превращаться в null при смерти объекта.
                        Ответить
                        • При нормальной архитектуре сойдёт, не ссы.
                          Ответить
                • Под маки есть. Под ифуны - нет. Там только хардкорный ручной рефкаунтинг, и технология ARC, которая сама напихивает вызовы retain/release куда нужно.
                  Ответить
                  • > и технология ARC, которая сама напихивает вызовы retain/release куда нужно.
                    Суть? Где почитать? Это круто?
                    Ответить
                    • Я хз, на объективном си не пишу, даже ни разу не пробовал, я об этом ARC тут слышал краем уха. Как понимаю - тупо вставляет release на старом значении и retain на новом при присваивании, и release на ссылках, выходящих из зоны видимости. Ну собственно дельфиньи COM интерфейсы на том же принципе работают, да Тарас?
                      Ответить
                      • Это как три оператора объявишь, так и работают.
                        Ответить
                    • http://clang.llvm.org/docs/AutomaticReferenceCounting.html
                      Ответить
          • И вот, спустя 4 года, у нас есть Swift :D
            Ответить
      • Надо вообще все функции выкидывать, возвращающие void, вот весело тогда будет.
        Ответить
    • Я плакалъ, а вообще тут юникс програмисты есть? Многие штуки юниксовые по иос спокойно проскакивают, может там найдется Апиай наналогичная виндовой ExitProcess?
      Ответить
      • При чём здесь юникс? exit(EXIT_SUCCESS);
        Ответить
        • Хм, я про библиотеку языка и забыл - какнить попробую.
          Ответить
        • После чего иос всяко выдаёт сообщение "программа была неожиданно закрыта", и пытается ее перезапустить? ;)
          Ответить
          • А потом к разработчику вламывается агент ФБР и бьет мудака по яйцам.
            Ответить
            • Нет, к нему по ночам приходит призрак Стива Джобса.
              Ответить
          • иос приложения вообще вылетают молча. ни извините, ни пожалуйста. типа так и должно быть.
            Ответить
        • Абсолютно притом. iOS основывается на BSD-ядре. Если поищите - даже исходники ядра, части фреймворков и библиотек найдёте, как того требует лицензия.
          Ответить
          • Я прекрасно это знаю. Мне непонятно, зачем нужно обращаться к POSIX или SUX, если функция завершения приложения exit() определена в стандартной библиотеке ANSI C (stdlib.h).
            Ответить
            • > SUX
              SUS
              хорошая, годная опечатка
              Ответить
            • Потому что афтар идиот ) Как я тут где-то писал, самостоятельно iOS-приложения завершаться не должны, ибо не по гайдлайнам. За такое вообще в апстор могут не пустить.
              Ответить
    • Говорят, для всего есть приложение в AppStore...
      Вот, для деления на ноль тоже есть.
      Ответить
    • у меня не крешит (в симуляторе), проходим бряку со значением на выходе из блока (closer = (int) 0) и работаем дальше
      просто в IDE висит ворнинг:
      "division by zero is undefined"
      Ответить
      • Ну на то оно и undefined behavior. У кого-то на одном наборе из компилятора операционки и железа вылетает, у другого не вылетает. А потом начинаются батхерты и фразы в духе УМВР ЧЯНТД...

        Мораль: видишь UB - никогда не юзай его, и даже не пытайся проверять работает он или нет на твоей системе, спокойней будешь спать, т.к. ты никогда не узнаешь, какое поведение будет на другой железке или в новой версии компилятора\оси. Хотя нет, узнаешь, от недовольных юзеров тех самых других железок..
        Ответить
        • > видишь UB - никогда не юзай его, и даже не пытайся проверять работает он или нет

          В тебе нет духа эксперементатора!
          Ответить
        • так я о другом, у автора кода тоже может не срабатывать :)
          а лишние операции для срабатывания - так это уже не элегантно
          Ответить

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