1. JavaScript / Говнокод #27579

    0

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    function main() {
        const o = {
            v: "Hi",
            toString() {
                return this.v;
            },
        };
        print(o);
    }

    Хочу напомнить о себе, а то люди начали забывать :)...

    Запостил: ASD_77, 19 Августа 2021

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

    • это каст обжекта в string
      Ответить
    • дампик... https://pastebin.com/WmkiMHrM
      Ответить
    • SEO пост https://github.com/ASDAlexander77/TypeScriptCompiler
      Ответить
    • думаю как захостить мой "компилятор" что бы люди могли поиграть с компилятором в онлайне? Проблема в том что надо сервер который может exe запускать ..а таких думаю не много в мире
      Ответить
      • > exe

        Ну да, виндовая VPS'ка скорее всего будет дороже линуксовой из-за лицензии... А под линух ты ещё не портанул его?

        З.Ы. Можно под вайном попробовать, один фиг тебе там только файлы читать да писать.
        Ответить
        • под линух уже давно работает. там только надо c-функции промапить правильно
          Ответить
          • Ну тогда в чём проблема? Любая VPS'ка за 5 баксов сойдёт.
            Ответить
            • я просто про линух забыл что он тоже умеет :)
              Ответить
              • Линух умеет что? Программы выполнять?:)
                Ответить
                • ну да и что компилятор тоже можно в линухе скомпилировать.. а то я уже думал как его через WASM скомпилять :)
                  Ответить
                  • > через WASM

                    Вместе с LLVM?!
                    Ответить
                    • именно это я и хотел сделать ... но как представлю кол-во не про имплементированных функций - что это задача может быть не реализуема
                      Ответить
                      • Да я не думаю, что конпелятору прям много функций от платформы надо... Я больше за размер боюсь.
                        Ответить
                        • размер приемлемый будет в районе 30-40мб
                          Ответить
    • может кто знает может ли Jekyll запускать CGI?
      Ответить
      • Jekyll только статика AFAIK.

        Но ты рядом можешь поднять nginx или apache и в добрый путь
        Ответить
      • Конкретно им не пользуюсь, но вроде идея всех генераторов статики просто в том, чтобы высрать html, который отдавать как статику без CGI?
        P.S. Как макака ответил, тебе всё равно понядобится сервант, чтобы эту статику раздавать, в конфе у него же можешь и CGI записать.
        Ответить
      • А ты прямо запускать юзерский код планируешь, или отдавать дампики? Если первое, то твой сервант проживёт в интернете примерно пять минут.
        Ответить
        • Можно в докер какой-нибудь завернуть.
          Ответить
          • и как это помешает юзерскрипту послать сообщение "ВЗОРВУ ВАС НАХУЙ" на емейл krenlin.gov.ru ?
            Ответить
            • А зачем давать ему сеть?

              Ну для максимальной паранойи можно в начале экзешника отречься от всех сисколлов кроме read и write. И дальше юзерский код хрен что сделает.
              Ответить
              • seccomp mode 1
                Ответить
                • Это же мой любимый pledge из лучшей в мире ОС
                  Ответить
              • >отречься от всех сисколлов кроме read и write.
                можно, но это сильно ограничит возможности.
                Ответить
                • Ну для тестовых программок как на ideone вполне достаточно будет. Разве что sbrk стоит заранее сделать, потому что потом в mode 1 его уже не позвать, а mode 2 где можно выбрать набор сисколлов настраивать сложнее.
                  Ответить
                  • а mmap тоже не давать? Тогда malloc обосреца на больших кусоках
                    Ответить
                    • Можно другой аллокатор вкомпилить, более простой или более управляемый.
                      Ответить
                      • можно заранее ммапнуть кусок памяти, дать его хендл, и нехай туда срёт

                        гига памяти хватит всем
                        Ответить
              • Даже это много.

                write ведь принимает дескриптор открытого файла? Можно брутом дескриптора насрать во все открытые файлы, запоров файловую систему сервера. Так что ему ещё нужно права лоховские дать.
                Ответить
                • так open(2) не давать

                  дали тебе дескриптор 1 (stdout) и 2 (stderr)
                  туда и серь
                  Ответить
                  • Я просто после TOCTOU стал параноиком.
                    Ответить
                    • без access(2) и open(2) тойстой не страшен
                      Ответить
                      • Кстати, а как это правильно реализовать на пинде?
                        Никак? Sandbox? виртуалка?
                        Ответить
                        • Посмотри в хроме. Секскомп вроде они и завезли в прыщи.
                          Ответить
                          • Ну вот, опять ненужная корпорация что-то завезла в свободолюбивый Linux
                            Ответить
                • > насрать во все открытые файлы

                  А нахуя ты наоткрывал всяких файлов перед запуском юзерского кода?
                  Ответить
            • Кококококой багор )))
              Ответить
          • Докер не про недоверенный код. Нужно что-нибудь типа bubblewrap или Firejail.
            Ответить
        • ыы.. ту думаешь хацкеры настолько суровы что могут работать с ОС.. они хотябы поняли как "маллок" прикрутить динамически :)
          Ответить
          • const a = new Int32Array(1024 * 1024 * 1024 * 8);
            a[1024 * 1024 * 1024] = 42;

            и сипец твоему серверу
            Ответить
            • А есть готовые решения? У «Ideone» какая-то проприетарщина. Вроде у аналогичного сервиса видел свободный движок, но не помню, у какого.
              Ответить
              • ulimit какой-нить? setrlimit(2)?

                у бзды есть login classes, там вообще это красиво сделано, но у прыщей их нет, зато setrlimit есть
                Ответить
              • https://github.com/TryItOnline/tryitonline
                Ответить
          • > работать с ОС

            Ты там вон исполняемый стек ради траплинов включил. Так что с ОС поразвлекаться никаких проблем не будет, имхо. Даже если в самом языке никаких функций для этого нет.
            Ответить
            • Создаёшь трамплин, возвращаешь его адрес, выделяешь буфер под приземление, вызываешь трамплин и полетели.

              З.Ы. Хотя там вроде нельзя взять и напрямую выделить буфер с нужным контентом на стеке? Ну сотню-другую интов положим, не проблема.
              Ответить
        • можно генерировать WASM и возвращать обратно в броузер для запуска.
          Ответить
          • Годный вариант.
            Ответить
          • И как я пойму, что ты меня не нашутил, и не исполнил мой TS код скомпилировав его в JS?
            Ответить
          • Можно всё вынести в вротэнд, т.е. в WASM скомпилировать хуйню, которая генерирует WASM, и ей генерировать WASM через браузер
            Ответить
    • toString() {
                  return this.v;
              },

      это ты ловко тип вывел, или у тебя ``toString()`` any вернул?
      Ответить
      • toString() всегда стринг по определению :)
        Ответить
        • В смысле все объекты неявно наследуют родителя, у которого этот метод определен как возвращающий `string`?

          Я к тому, что не нужно явно
          toString(): string

          ?
          Ответить
          • ну тут просто ... toString() пренадлежит обьекту { v: string }, а тип v определяется из значения поля.
            Ответить
            • Какой алгоритм вывода типов используешь?
              Ответить
              • там все просто.. если тип можно определить по значению.. то берется он. если нельзя тогда тип нужно предоставлять самому. это как "auto" в с++
                Ответить
                • const foo = (true ? "A" : 42);
                  const bar = (buz() === qux() ? "A" : 42);

                  Какой тип foo? А у bar?
                  Ответить
                  • У bar наверное (String | Integer), с точностью до синтаксиса?

                    foo, возможно, получится оптимизнуть и уточнить тип.
                    Ответить
                    • Только наверное

                      ``string | number``
                      Мы же не про жабу говорим

                      В жабе юнионов нет. И не путайте в JS `string` и `String` !
                      Ответить
                      • у меня есть только они еще не допиляны до конца
                        Ответить
                        • Но ведь юнионы это одна из киллфич TS
                          Ответить
                          • не все юнионы одинаково полезны в С. вот такой юнион приветсвтуется

                            type Shape =
                                | { kind: "circle", radius: number }
                                | { kind: "square", sideLength: number };


                            а такой юнион "number | string" - нет
                            Ответить
                            • потому что kind можно проверить в рантайме, а ``typeof`` нет?
                              Ответить
                            • Что мешает реализовать number | string как tagged union? Тем более он у тебя по-любому уже реализован для any.

                              Неэффективно, да. Но программист сам так написал.
                              Ответить
                              • ну я сейчас не думал еще.. но думаю можно просто добавкой невидимого "enum"-а решить эту проблему
                                Ответить
                  • > Какой тип у bar?

                    buz() === qux() ? String : Integer

                    З.Ы. Хотя из-за мутабельности и нечистоты так не получится, скорее всего. Зависимые типы сложно будет подружить с привычными языками...
                    Ответить
                  • ответ да будет юнион .. но в "с"-подобном языке юнионы бесполезная штука т.к. из за отсутствия RTTI определить какой там тип не представляется возможным. т.к. что бы решить вопрос нужно применить общий тип.
                    Ответить
                    • > отсутствия RTTI
                      Ну ты же в курсе как это решает TS, правда?
                      Ответить
      • хотя идея интересная что будет если заменить v на другой тип и позырять что будет
        Ответить
        • Попытается потом позвать toString() у типа, который вернули?
          Ответить
          • ну да... v автоматом будет кастанутый на string т.к. результат toString всегда string
            Ответить
            • А если я напишу что-то в духе toString() { return this; }, то всё повиснет нафиг?
              Ответить
              • Хвала Яхве нет
                > const bormand = {toString: ()=> this};
                > parseInt(bormand);
                Uncaught TypeError: Cannot convert object to primitive value
                    at parseInt (<anonymous>)


                Вернулся объект, и всё упало.

                Обычный же объект вернет `[object Object]`, и будет NaN.

                Удобно, правда?
                Ответить
              • да так и будет :)
                Ответить
    • - Я так раньше никогда не делала. Мне понравилось. А тебее? - сказала она после того, как я влил в неё свой заряд и, уставший, уселся прямо на ковролин на полу кабинета.
      Ответить
    • -Да, мамочка, ты классная блядь! Юрка принялся целовать маму взасос…
      Ответить
    • У жeны oкaзaлся любoвник, и я уeхaл, брoсив всё, в дaльнee Пoдмoскoвьe, гдe у мeня былa oднoкoмнaтнaя квaртирa
      Ответить
    • -Да, мамочка, ты классная блядь! Юрка принялся целовать маму взасос…
      Ответить

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