Pull to refresh

Comments 7

Можете сделать анализ Erlang/OTP? Было бы интересно.

Подумаю над этой идеей, но с Erlang/OTP я почти не знаком, чтобы подкапотную языка объяснить так же хорошо, как в Python. :)

Добрый день, спасибо за анализ. Забрал в работу.

В примере с fut->fut_state я бы не был так уверен в том что проверка излишняя. Мы получаем fut в параметрах, а в промежутке между проверками вызываем несколько функций с другим полученным в параметрах значением exc. Если exc содержит ссылку на fut или если fut ссылается на глобальную переменную (а из приведённого кода мы не можем этого исключить), то эти функции могут изменить состояние fut->fut_state.

Еще раз спасибо. Сел разбирать отчет. Вот результаты:

  • Все проблемы в _hacl уже исправлены в main (3.14.0a7+)

  • Убрать if (fut->fut_state != STATE_PENDING) нельзя, потому что перед второй проверкой идет потенциальный вызов Python кода PyObject_CallNoArgs(exc); – он может изменить весь C стейт

  • Аналогично с `start_state != deque->state` – там идет вызов `PyObject_RichCompareBool`

  • В целом можно заменить if (error_handler == PyERROR_UNKNOWN) на `assert(errors != PyERROR_UNKNOWN);`, но не могу назвать данное поведение ошибкой. get_error_handler_wide может начать возвращать PyERROR_UNKNOWN в любой момент

  • Нельзя назвать ошибкой и get_datetime_capi();, потому что сейчас там скорее хак, который не совсем корректно работает. Будет в скором временем более сложная конструкция, которая сможет вернуть NULL, но позже. Заранее иметь проверку – норм

  • PyXIFreeNamespace(_PyXI_namespace *ns) – можно отрефакторить, да. Но там нет ошибки, обычно PRы с просто рефакторингом - не очень охотно принимают

  • FStar_UInt128_u32_combine_ – не является часть CPython, а частью HACL. можно открыть багу туда. Но опять же, ошибки нет :(

  • `val = -1;` можно удалить, но опять же – не ошибка. Просто лишняя строка :)

  • А вот i < input_length – реальная ошибка, спасибо. Поправил https://github.com/python/cpython/issues/132769

  • Файл pyshellext.cpp говорит, что поддерживает Vista. https://github.com/python/cpython/blob/132b6bc98f47a4d897dead8635b5a50a0baee485/PC/pyshellext.cpp#L1 Но тут я не знаю, не шарю за винду, первый раз вижу данный файл :) Можно открыть обсуждение.

В итоге – действительно проблемных кусков кода, вроде бы, к счастью не было :)

Большое спасибо вам и @oldnomad за развёрнутый ответ!

По поводу указания _WIN32_WINNT со значением `_WIN32_WINNT_VISTA`, это в большинстве случаев открывает доступ к функциям и структурам Windows API, появившимся в конкретных версиях Windows. Совместимость ограничивают обычно либо через манифест, либо задействованием функции, не существующей в системе (и тогда целевое приложение отвалится с ошибкой «точка входа в процедуру <функция> не найдена в <имя DLL>»; но такой подход я лично осуждаю). Ещё один способ поставить ограничение — указать версию целевой подсистемы линкеру, но это тоже не всегда надёжно работает и применимо только на исполняемых файлах.
В обратную сторону этот механизм тоже работает, можно на наборе инструментов MSVC v143, где поддержки Windows XP/Server 2003 нет, собрать работоспособное приложение, но со множеством оговорок: код обязан быть на чистом C и MSVCRT/UCRT линкуется статически с приложением.

Привет, это команда GitVerse! У тебя крутая статья, будем рады видеть тебя в сезоне open source. Для этого просто поставь тег "сезон open source" – и ты участвуешь :)

Sign up to leave a comment.