Comments 7
Можете сделать анализ Erlang/OTP? Было бы интересно.
Добрый день, спасибо за анализ. Забрал в работу.
В примере с 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 ==
Py
ERROR_UNKNOWN)
на `assert(errors != PyERROR_UNKNOWN);`, но не могу назвать данное поведение ошибкой.get_error_handler_wide
может начать возвращатьPy
ERROR_UNKNOWN
в любой моментНельзя назвать ошибкой и
get_datetime_capi();
, потому что сейчас там скорее хак, который не совсем корректно работает. Будет в скором временем более сложная конструкция, которая сможет вернутьNULL
, но позже. Заранее иметь проверку – нормPyXI
FreeNamespace(_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" – и ты участвуешь :)
Сворачиваем CPython вокруг PVS-Studio