1. PHP / Говнокод #26781

    0

    1. 1
    2. 2
    3. 3
    https://github.com/moscow-technologies/blockchain-voting/tree/voting2020/elec2020/ballot
    https://github.com/moscow-technologies/blockchain-voting/blob/voting2020/elec2020/ballot/public/js/forms/mgik/LeavingPageCheckerInit.js
    https://github.com/moscow-technologies/blockchain-voting/blob/voting2020/elec2020/frontend-library-source/crypto-lib/src/util/numberFromLeBytes.js

    Как и всё в этой стране, обнуление написано на PHP, jQuery и (да-да) местами Rust, а управляется supervisord, ибо для редактирования юнитов systemd нужно sudo, который не дали.

    Какой блокчейн )))

    Запостил: Fike, 30 Июня 2020

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

    • В ДИТ обещали избавиться от уязвимости до начала общероссийского голосования, но так этого и не сделали. На заседании рабочей группы 18 июня, Федин обратил на это внимание главы смарт-проектов мэрии Костырко. Чиновник назвал проблему «ошметком» с прошлогоднего исполнения системы и попросил своих коллег из ДИТ проверить, «чтобы эту штуку убирали». Речь идет о фрагменте в исходном коде web-страницы бюллетеня для голосования, с помощью которого можно подключить дополнительный скрипт (программу) и манипулировать любыми элементами страницы.
      cообщают «Открытые медиа» https://openmedia.io/news/n3/eksperty-u-organizatorov-elektronnogo-golosovaniya-est-texnicheskaya-vozmozhnost-podtasovyvat-rezultaty/


      https://github.com/moscow-technologies/blockchain-voting/blob/voting2020/elec2020/ballot/resources/views/election/show.tpl#L14-L16

      какой секьюрити )))
      Ответить
      • 3. Соглашаемся с условиями и получаем бюллетень. Вот как происходит его выдача, тут происходит несколько переадресаций, видимо, это и есть тот самый "анонимайзер", но спойлер: он ничего не анонимизирует:
        POST https://elec.2020og.ru/#complete
        Cookie: laravel_session=abcdef123
        ответ: HTTP/2 302 Found
        location: https://elec.moscow/election/check/ длинная-длинная-цепочка-из-букв-и-цифр=
        (на самом деле тут скрыт ваш номер бюллетеня, допустим, 777-ggg-aaa. Как проверить: вставить эту длинную цепочку на сайт https://www.base64decode.org/, раскодировать, потом взять из результата url и еще раз раскодировать. Нас наперстками не проведешь!)
        Ответить
    • Какие московские технологии )))
      Ответить
    • >> обнуление написано на PHP

      Именно поэтому я за «PHP».
      Ответить
    • Всего над проектом трудилось больше 10 распределенных команд (около 100 человек) внутри ДИТа без привлечения сторонних специалистов. Из-за сложности задачи мы решили, что каждая из команд будет заниматься разработкой решения в своей части, а на последнем этапе мы сведем все системы воедино с помощью интеграционных, нагрузочных и многофункциональных тестирований.

      НЕ
      ВЫ
      НО
      СИ
      МО
      Ответить
      • https://habr.com/ru/article/480152/
        Ответить
        • После общения с технической рабочей группой появилось дополнительное требование к системе — избирателю нужна была возможность проверить, как учитывается его голос в блокчейне.

          а нахуй был нужен блокчейн без этой функции?
          Ответить
          • У них точно есть блокчейн или это просто модное слово типа датамайнинга бигдаты?
            Ответить
            • возможно, им просто не рассказали про технологию «система управления базой данных»
              Ответить
              • Олимпиадники такой технологией не пользуются. Можно открыть исходник сайта функцией fopen и в нём поправить данные.
                Ответить
    • Анонимайзер генерирует ссылку и доступ к анонимному бюллетеню через личный кабинет mos.ru: такая ссылка создается всего один раз.

      Анонимность уровня /dit.mos.ru/
      Ответить
      • Настоящее анонимное голосование через веб невозможно сделать. По определению. Ибо в вебе нет доверенной зоны, в которую не может подсмотреть сайт.
        Ответить
        • З.Ы. Ну т.е. если привести реальный пример: ты либо голосуешь на виду у чувака, который проверяет твой паспорт и выдаёт тебе бюллетень, либо голосуешь на виду у чувака, который следит чтобы в урну не насрали. А кабинки где можно от них спрятаться и анонимно поставить галочку нету.

          И это неустранимый недостаток веба.
          Ответить
          • Звучит как очередная порнуха на порнхабе.
            Ответить
        • Вообще есть zero knowledge proof и всё такое. Но не то чтобы я в этом понимал чего.
          Ответить
          • Конкретный алгоритм здесь не имеет никакого значения. Ибо ты будешь гонять свой zero knowledge proof в браузере под присмотром владельца сайта. А это просто иллюзия безопасности.
            Ответить
          • Т.е. единственное что я пока могу придумать с вебом - это самодостаточная html'ка, которую ты можешь скачать, поревьювить и запустить у себя с локалхоста. Которая через API уже обращается куда надо.
            Ответить
            • [-------]а, вы хотите анонимное

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

                И тебе нужны либо автономная хтмлка либо опенсурсная прога чтобы избавиться от влияния сервака и иметь возможность поревьючить код.
                Ответить
              • > вы хотите анонимное

                Дык не анонимное то вообще тупо. Подписываешь свой голос смарткартой да кидаешь в урну.
                Ответить
          • Я как всегда нихуя не спал два дня, но мне кажется, что если есть V голосующих, у каждого из которых K атрибутов из N возможных, то при правильном распределении они могут одновременно нечетко идентифицировать себя и предотвратить повторное голосование.

            Например, блондинистый распиздяй может прийти и сказать, что он первый распиздяй, который сегодня голосует и получить бюллетень.
            Рыжий распиздяй попробует так сказать, но бюллетень уже не получит, как и блондинистый не-распиздяй. Тогда он перейдет к следующему атрибуту, но если кроме "рыжий" и "распиздяй" у него есть третий атрибут, его всё еще невозможно идентифицировать.
            Ответить
            • Дык нужна реальная проверка личности на фазе "выдачи бюллетеня". Иначе будет явка 1460% ибо любой участник может себе нагенерить сколько угодно виртуальных личностей и проголосовать ими.
              Ответить
              • Дык атрибуты выдает машина каждому голосующему. Если она выдала первому abc, а второму bcd, то она не сможет идентифицировать предъявившего bc, в то же время знание bc гарантирует, что этот пользователь зарегистрировался как голосующий.
                Да, это позволит abc проголосовать сразу за двоих, но не все сразу же, я просто демонстрирую возможность нечеткой идентификации
                Ответить
                • Да есть на самом деле очень простой вариант со слепой подписью.

                  Ты генеришь уникальный ключ. Сервак проверяет твою личность и вслепую, не видя этого ключа, подписывает его (по сути там 2 слоя RSA).

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

                      З.Ы. Но это, наверное, уже никак не решить.
                      Ответить
                      • Если мы проверяем личность через какой-нибудь ключ на токене, то можно оставить серваку пруф того, что ты действительно получал у него "бюллетень".

                        А потом сервак публикует лог всех, кто получал "бюллетени". И если ты не голосовал, но внезапно нашёл в этом списке себя, то сервак в жопе - у него нет пруфа с твоей подписью.

                        Сервак с урной тоже публикует лог. Поэтому ты можешь проверить, что голосов в сумме не больше, чем получавших бюллетени. И можешь найти в этом логе свой голос и проверить его.

                        Чем больше народу сделает такие проверки - тем больше вероятность, что никто никого не наебал. Как-то так.
                        Ответить
                        • >Чем больше народу сделает такие проверки
                          То-есть если 86% людей срало-ебало голосование, то проверить что либо невозможно?
                          Ответить
                          • Эм, ну да. Можно с чистой совестью 146% написать раз всем всё равно похуй.

                            Поскольку голосование анонимное, ты кроме своего голоса или отказа ничего проверить не можешь.
                            Ответить
                            • то-есть смысл схемы в том, что я могу проверить, что за меня не проголосовали.

                              А если я не проверил, то можно наврать, да?
                              Ответить
                              • Если ты не голосовал, то ты можешь проверить, что за тебя не проголосовали.
                                Если ты голосовал, то ты можешь проверить, что твой голос учтён правильно.

                                Если тебе похуй - то за тебя могут приписать что угодно. И без твоей помощи никто это не проверит т.к. голосование анонимное.
                                Ответить
                  • >. Сервак проверяет твою личность и вслепую, не видя этого ключа
                    А как он проверяет мою личность?

                    Если он проверяет ее посредством публичного ключа, то что мешает ему запомнить кому он какой билютень выдал?
                    Ответить
                    • > как он проверяет мою личность

                      Смарт-картой наверное. Других способов я не вижу. Смски и пароли - хуйня без неотрекаемости.

                      > запомнить

                      Дык алгоритм слепой подписи. Он не знает, какой именно ключ он подписал формируя твой бюллетень.
                      Ответить
                      • Видимо, мне надо почитать про слепую подпись, потому что я пока не очень понимаю как можно что-то подписать так, чтобы

                        1. знать, что это не мусор, а настоящий ключ
                        2. не знать, что это за ключ
                        Ответить
                        • А зачем серверу знать, что он подписывает не мусор, а настоящий ключ? Подпись на мусоре — проблема исключительно пользователя, злонамеренно использовать её он нигде не сможет.
                          Ответить
                          • Ну в данном случае да.

                            А в общем случае слепой подписи ты серваку кидаешь тыщу документов. И он просит дать ключи от 999 из них чтобы убедиться, что в них не хуйня. А потом вслепую подписывает оставшийся. Очень тяжёлый алгоритм, на самом деле.
                            Ответить
                            • А что мешает ему прочитать этот документ и сохранить его у себя?

                              Или он не сможет потом по биллютеню узнать этот документ?
                              Ответить
                              • Ну он видел другие 999. А тот, который ты будешь публиковать - не видел.

                                Ну само собой "документ" - это не вордовский файл. Осмысленный документ вслепую не подписать.

                                Это скорее про какие-нибудь ключи, сертификаты и прочую криптографическую хуйню.
                                Ответить
                              • Ну вот как пример документа, наверное, анонимный чек сойдёт: (рандом, 100 рублей).

                                Я серваку даю 100 рублей и мешок таких чеков. Он 999 из них вскрывает и убеждается, что там действительно написано "100 рублей". А последний вслепую подписывает.

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

                                      Но он может запомнить этот набор байт.
                                      Или он потом не сможет по нему расшифровать мой бюллитень?
                                      Ответить
                                    • а , все
                                      мокака поняла

                                      нужно зашифровать сообщение, и послать его на подпись, а затем убрать шифр.

                                      Не самый простой для понимания прот
                                      Ответить
                                      • Сестрёнка, я тебе банан принесла. Мы же в зоопарке сидим, да? Я же знаю, что в зоопарке звери не едят целый день. Вот банан тебе принесла.
                                        Ответить
                                        • В деревнях всё ели.
                                          Ответить
                                          • И даже сосны –— ели. На каком-то сайте был даже совет сажать лиственницы: их точно не спиздят под Новый год.
                                            Ответить
    • Участник электронного голосования в Москве испортил бюллетень https://bit.ly/38meSS4
      Ответить
      • Неужели насрал в электронную урну и подтёрся электронным бюллетенем?!
        Ответить
      • Один сломал другой потерял?
        Ответить
        • Сисдамины разговаривают

          --Мне знакомый сервер сломал
          --Хакер?
          --Да нет, мудак..
          Ответить
    • База паспортов россиян, зарегистрировавшихся для участия в электронном голосовании по поправкам к Конституции РФ, опубликована в открытом доступе. Файл обнаружил телеграм-канал «Утечки информации», внимание на пост которого обратила «Медуза».

      «На один из форумов уже выложили базу паспортов (серия/номер) граждан, зарегистрировавшихся для участия в электронном голосовании по поправкам в Конституцию! Конверт в Cronos в свободном доступе», — написали авторы канала. Судя по опубликованному ими скриншоту, в файле также указан регион выдачи паспорта и сведения о том, был ли действителен документ в день голосования.
      Ответить
      • Короче, вот тут самое интересное, про хэширование нумеров паспортов и прочую питушню (под катами):
        https://meduza.io/feature/2020/07/09/vlasti-fakticheski-vylozhili-v-otkrytyy-dostup-personalnye-dannye-vseh-internet-izbirateley
        Ответить
        • Собственно исходный архив:
          https://web.archive.org/web/20200701074010/checkvoter.gosuslugi.ru/degvoter.zip

          Обратите внимание на домен.
          Ответить
          • Уже поняли как "зашифрованы" номера паспортов в базе? Пример 49ea4a862462fe36b2a3dc69af30997cece13f5b c5934766f03f846163944b79
            Ответить
            • >> Оказалось, что серия и номер каждого паспорта хешированы по алгоритму SHA-256. Данные для хеширования были представлены в виде одного десятичного числа — между серией и номером паспорта не было пробела.
              Ответить
          • > check

            Эм, а это точно база зареганных, а не вообще всех жителей?)
            Ответить
    • Питушки, можно на пинде ВООБЩЕ не линковаться с CRT? Если да, то будет ли в теории меньше и быстрее?
      Я готов работать ТОЛЬКО С Win32API. Что будет с точкой входа?
      Ответить
      • Что назначишь, то и будет.

        Разбери устройство CRT, тогда поймёшь.

        Какой компилятор интересует? «MSVC»? Тогда у штатного линкера (link.exe) есть ключик /ENTRY:pituh, который назначает точкой входа метку pituh; ключик /NODEFAULTLIB игнорирует список библиотек по умолчанию. У cl.exe ключик /link передаёт аргументы линкеру.

        По дефолту у «MSVC» точка входа нацелена на символ _mainCRTStartup, лежащий в crt0.obj или в crtexe.obj, который упакован в стандартную библиотеку. Можешь посмотреть, что эта функция обычно делает.
        Ответить
        • Кстати, я собираю студией и msbuild, но все эти опции можно задать через GUI)
          Ответить
      • Если интересует именно «MSVC», вот для старта поиска:
        https://docs.microsoft.com/ru-ru/cpp/build/reference/entry-entry-point-symbol?view=vs-2019
        https://stackoverflow.com/questions/22934206/what-is-the-difference-between-main-and-maincrtstartup

        С божественной сишечкой в принципе можно работать, но без argc, argv — их придётся доставать через API (GetCommandLine), без SEH.

        С крестами будет жопа. Тебе придётся писать свою CRT.
        Ответить
        • питушок, спасибо.

          * Указал /ENTRY:myfun
          * Отключил либы /NODEFAULTLIB
          * Ругнулось на security_cookie, пришлось отключить Buffer Security Check: /GS-

          Отвалились конечно всякие strlen и пр. Без всего этого завелось:)) Думал, будет быстрее (все таки не надо инициализировать CRT), но чото как-то не стало. Видимо совсем это незаметное время занимает на моем компе. Измерял ptime: в винде же нету нормального time, как в unix.
          Ответить
          • Все таки ГК волшебное место. Где еще можно в 5 утра задать вопрос про сишку под винду, и получить сразу ответ?
            Ответить
            • CRT же опенсорсная. Смотри VC\crt\src.

              Реальный пример точки входа из CRT (после препроцессирования, чтобы влезло в 2 к символов):
              int mainCRTStartup(void)
              {
                      __security_init_cookie();
                      return __tmainCRTStartup();
              }
              
              int __tmainCRTStartup(void){
                      int initret;
                      int mainret=0;
                      int managedapp;
                      __set_app_type(1);
                      managedapp = check_managed_app();
                      if ( !_heap_init() )
                          fast_error_exit(28);
                      if( !_mtinit() )
                          fast_error_exit(16);
                      __try {
                          if (_ioinit() < 0)
                              fast_error_exit(27);
                          _acmdln = (_TSCHAR *)GetCommandLineA();
                          _aenvptr = (_TSCHAR *)__crtGetEnvironmentStringsA();
                          if ( _setargv() < 0 )
                              _amsg_exit(8);
                          if ( _setenvp() < 0 )
                              _amsg_exit(9);
                          initret = _cinit(
                          if (initret != 0)
                              _amsg_exit(initret);
                          __initenv = _environ;
                          mainret = main(__argc, __argv, _environ);
                          if ( !managedapp )
                              exit(mainret);
                          _cexit();
                      } __except ( _XcptFilter(_exception_code(), (struct _EXCEPTION_POINTERS *)_exception_info()) ) {
                          mainret = _exception_code ();
                          if ( !managedapp )
                              _exit(mainret);
                          _c_exit();
                      }
                      return mainret;
              }


              Да, именно отсюда зовётся main:
              mainret = main(__argc, __argv, _environ);
              А что происходит перед его вызовом, ты видишь.
              Ответить
              • CRT состоит из двух частей. Та часть, что идет студией -- она опенсурсная, да.
                Вторая часть идет с виндой.

                Вот из за __security_init_cookie я и вынужден был /GS-
                А __tmainCRTStartup это то, что я (наивно) пытался избежать, чтобы выиграть время.
                Оказалось, что это спички.
                Ответить
                • А что за вторая часть? msvcr*.dll при динамической линковке? Да вроде у неё общий код со статической библиотекой (там ифдефами всё разруливается).

                  Кстати, код __security_init_cookie я нашёл. Там снимаются все подряд параметры системы и ксорятся друг с другом, чтобы получилась труднопредсказуемая питушня:
                  GetSystemTimeAsFileTime(&systime.ft_struct);
                  #if defined (_WIN64)
                      cookie = systime.ft_scalar;
                  #else  /* defined (_WIN64) */
                      cookie = systime.ft_struct.dwLowDateTime;
                      cookie ^= systime.ft_struct.dwHighDateTime;
                  #endif  /* defined (_WIN64) */
                  
                      cookie ^= GetCurrentThreadId();
                      cookie ^= GetCurrentProcessId();
                  
                  #if _CRT_NTDDI_MIN >= NTDDI_VISTA 
                  #if defined (_WIN64)
                      cookie ^= (((UINT_PTR)GetTickCount64()) << 56);
                  #endif  /* defined (_WIN64) */
                      cookie ^= (UINT_PTR)GetTickCount64();
                  #endif  /* _CRT_NTDDI_MIN >= NTDDI_VISTA  */
                  
                      QueryPerformanceCounter(&perfctr);
                  #if defined (_WIN64)
                      cookie ^= (((UINT_PTR)perfctr.LowPart << 32) ^ perfctr.QuadPart);
                  #else  /* defined (_WIN64) */
                      cookie ^= perfctr.LowPart;
                      cookie ^= perfctr.HighPart;
                  #endif  /* defined (_WIN64) */
                  
                      /*
                       * Increase entropy using ASLR relocation
                       */
                      cookie ^= (UINT_PTR)&cookie;
                  
                  #if defined (_WIN64)
                      /*
                       * On Win64, generate a cookie with the most significant word set to zero,
                       * as a defense against buffer overruns involving null-terminated strings.
                       * Don't do so on Win32, as it's more important to keep 32 bits of cookie.
                       */
                      cookie &= 0x0000FFFFffffFFFFi64;
                  #endif  /* defined (_WIN64) */
                  
                      /*
                       * Make sure the cookie is initialized to a value that will prevent us from
                       * reinitializing it if this routine is ever called twice.
                       */
                  
                      if (cookie == DEFAULT_SECURITY_COOKIE)
                      {
                          cookie = DEFAULT_SECURITY_COOKIE + 1;
                      }
                  #if defined (_M_IX86)
                      else if ((cookie & 0xFFFF0000) == 0)
                      {
                          cookie |= ( (cookie|0x4711) << 16);
                      }
                  #endif  /* defined (_M_IX86) */
                  Ответить
                  • https://docs.microsoft.com/en-us/cpp/c-runtime-library/crt-library-features?view=vs-2019

                    The UCRT is now a Windows component, and ships as part of Windows 10. The static library, DLL import library, and header files for the UCRT are now found in the Windows 10 SDK.

                    Я ходил по сырцам той, что идет с SDK. Видел страшный плюсовый код с лямбдами, и даже наступал в баг: одна функция для запуска внешней программы там расчитывала на наличие переменной с указанием дефолтной папки для диска в блоке переменных окружения. Для программ, запущенных не через cmd в какой-то версии win10 этой переменной не было, и все ебалось. Моя прога падала, если запустить ее через ярлычок на рабочем столе (потому что она запускала питон, а питон дергал ту самую функцию для запуска другой внешней проги) и тогда мне пришлось дебажить CRT:)

                    _wspawnv, =C:
                    Ответить
                    • Какой багор )))

                      Я показал фрагменты из какой-то древней студии, последнюю не копал.
                      Ответить
                    • Да, UCRT — красивая библиотека:
                      typedef Character const extension_type[5];
                              static extension_type const extensions[4] =
                              {
                                  { '.', 'c', 'o', 'm', '\0' },
                                  { '.', 'e', 'x', 'e', '\0' },
                                  { '.', 'b', 'a', 't', '\0' },
                                  { '.', 'c', 'm', 'd', '\0' }
                              };
                      
                              errno_t const saved_errno = errno;
                      
                              extension_type const* const first_extension = extensions;
                              extension_type const* const last_extension  = first_extension + _countof(extensions);
                              for (auto it = first_extension; it != last_extension; ++it)
                              {
                                  _ERRCHECK(traits::tcscpy_s(extension_buffer, 5, *it));
                      
                                  if (traits::taccess_s(buffer.get(), 0) == 0)
                                  {
                                      errno = saved_errno;
                                      return execute_command(mode, buffer.get(), arguments, environment);
                                  }
                              }


                      Где ещё такое чудо, где ещё такой прогресс?
                      Ответить
                      • да, уже ржал с этово
                        При том, что есть ``PATHEXT``, то-есь знание о расшырении зашито в разных местах.

                        >traits::tcscpy_s

                        А вот если я такой сишник-няшник, дебажу свой код, и вдруг прихожу дебагом к крестовне, и у меня случается багор
                        Ответить
                        • Да дебаггеру вообще похуй на язык, на самом деле. Ему маппинга адресов на строки в исходнике хватает.

                          Ты можешь на основе текстового файла сгенерить сишку, расставить в ней #line со ссылками на исходный текстовик, и прекрасно дебажить его и бряки ставить.
                          Ответить
                          • Не понял про сишку.

                            Я сижу на брекпоинте в визуальном дебагере, углуюляюсь в код, прихожу в стандратную библиотеку, и вижу там C++
                            Ответить
                            • А, ты про то что сишник кресты в стандартной либе не осилит? Ну да, там где-то даже лямбды и шаблоны встречались.
                              Ответить
                              • Ну может и осилит, но ему будет некомфортно.

                                Если я пишу на чистом си, то я как-то ожидаю в стандартной библиотеке тоже видеть только си, не?
                                Ответить
                                • Да мож она вообще на асме или на расте? Вай нот?

                                  ABI соблюдается, сишные хедера тебе выдали. Остальное - деталь реализации, на которую всем пофиг.
                                  Ответить
                                  • Под некоторые процессоры интринсинки написаны как раз на чистом асме.
                                    Ответить
                  • Оптимизировал:
                    void __cdecl __security_init_cookie(void)
                    {
                        UINT_PTR cookie;
                        printf("Бросьте игральную кость и введите результат:");
                        scanf("%d", cookie);
                        __security_cookie = cookie;
                        __security_cookie_complement = ~cookie;
                    }

                    Теперь будет работать быстрее.
                    Ответить
                    • Можно нажать энтер и получить неплохой рандом со стека.
                      Ответить
                      • нет
                        scanf подождёт непустого ввода
                        лучше буквы ввести

                        UPD: на ванишед ответил
                        Ответить
              • Итого: мы видим, что перед запуском мейна обычно бывает:
                __set_app_type(_CONSOLE_APP); или __set_app_type(_GUI_APP);
                managedapp = check_managed_app();
                _heap_init();
                _mtinit();
                _ioinit();
                _acmdln = (_TSCHAR *)GetCommandLineA();
                _aenvptr = (_TSCHAR *)GetEnvironmentStringsA();
                initret = _cinit(TRUE);


                Там ещё есть тонкости, связанные с многопоточной и однопоточной версией, с отладочной и релизной, с гуёвой и соснольной, с уникодной и восьмибитной. Но примерно цепочка вызовов такая.

                Думай, много или мало времени это может отнять.
                Ответить
                • У меня однопоточная релизная динамическая консольная юникодная.
                  Кстати, я не пользую wprintf, бо я не хочу превращения wide chars в однобитную хуйню.
                  Я пишу WriteFile прямо в STD_OUTPUT. Получается двубайтовый LE (бо интел) уникод.
                  В сосноли это конечно выглдит "в о т т а к", но я читаю выхлоп жабой, а там есть чарсет для 16-LE
                  Ответить
            • Именно поэтому я за «инкануса».
              Ответить
          • > ptime
            pitux time?
            Ответить
      • Можно, но это скорее для извращений в духе своей операционки или соревнований про демку в 64к.

        Для практических задач это не имеет смысла, имхо. Будешь потом жить без деления и т.п.У MS нет четкого разделения между CRT и либой поддержки конпелятора как в том же гцц. Хотя на 64-битке с этим наверное полегче будет чем на 32-битке.
        Ответить
        • З.ы. И с интринсиками типа memset вдоволь наебешься потом. Будут в рекурсию падать и т.п.

          Причём конпелятор их сам юзает иногда чтобы структуры чистить. Или если цикл подходящий по смыслу увидит. Поэтому он может их позвать даже если их в коде явно нигде нет.
          Ответить
          • Помните, как Линус Торвальдс пердолился, добавляя по одной функции к своей ОС до тех пор, пока у него конпелятор не завёлся? Вот тут будет почти то же самое.
            Ответить
          • Кстати, интринсинки перечислены в VC\bin\c2.dll. Нужно всего лишь дизассемблировать эту dll, чтобы понять, какие именно понадобятся компилятору.
            Ответить
            • В случае с memset проблема в том, что конпелятор увидит в твоей реализации memset цикл похожий на memset и оптимизнёт его в вызов memset.

              А список особо и не нужен. Популярные довольно быстро понадобятся, а остальные скорее всего никогда.
              Ответить
              • В исходниках memset есть строчка:
                #pragma function(memset)

                Это мы предупреждаем компилятор, что будем реализовывать memset, чтобы он в рекурсию не свалился?
                Ответить
                • P.S. Нашёл описание этой прагмы:
                  https://docs.microsoft.com/en-us/cpp/preprocessor/function-c-cpp?view=vs-2019

                  А заодно вот это:
                  https://docs.microsoft.com/en-us/cpp/preprocessor/intrinsic?view=vs-2019
                  Ответить
              • Кстати, а в «MinGW» будет проще отказаться от рантайма? Там же компилятор дёргает только «libgcc», а «libc» не трогает? Или я слишком хорошо о нём думаю?

                И в «Шланге» по идее можно провернуть такой же трюк. А вот у прочих компиляторов («Борманд Си», «Ватком Си», «Цифровой Марс») библиотека монолитная, так что для её кастомизации придётся попердолиться.
                Ответить
                • А фиг знает, я мингв почти не юзал.

                  В гцц кстати у меня получалось даже поддержку исключений прикрутить. Она там неплохо отвязана от рантайма и прочей сишности.
                  Ответить
        • А действительно, там есть длинное деление, длинное умножение, длинный сдвиг на те случаи, когда одной инструкцией сделать не получается (например, для 64-битных аргументов на 32-битке).
          Ответить
        • Ну вот я попробовал, и понял, что бенефитов как-то не много:)
          Ответить

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