#prog #rust #rustreleasenotes
(в силу непонятных причин я почему-то полностью пропустил этот релиз, который был аж 28 мая)
Вышла версия Rust 1.96.0! Как всегда, тут только избранные части, а всё целиком в детальных заметках о релизе.
▪️До стабильной версии дошли
▪️Стабилизировали макросы
Пример сообщения об ошибке:
⬇️
Как и другие
Как вы могли заметить, в коде есть явные импорты этого макроса. К сожалению, в прелюдию их не добавили, поскольку уже есть широко используемый сторонний крейт с этими макросами, и такое добавление создало бы конфликты имён в большом количестве кода.
▪️Теперь можно итерироваться по диапазонам из беззнаковых `NonZero` чисел.
▪️Определение "valid to read/write" для сырых указателей теперь явно исключает null. Некоторые функции, тем не менее, всё ещё позволяют пользоваться null-указателями для доступов нулевого размера, но теперь это исключения из общего правила.
(согласно CAD97 — члену команды операционной семантики — такое поведение было и раньше, просто теперь оно задокументировано)
▪️Манифесты для cargo теперь поддерживают назначение флагов для rustdoc в зависимости от cfg-предикатов.
▪️rustdoc теперь не вырезает <p>-теги из сообщений о устаревании (deprecation).
▪️rustdoc теперь разделяет функции на типе в боковой панели на ассоциированные функции (которые нельзя вызвать через точку) и методы. Полезно, но терминология, на мой взгляд, неудачная: методы тоже являются ассоциированными функциями.
▪️
▪️Приватные типы в RPITIT ("return position impl trait impl trait") теперь являются ошибкой компиляции.
(в силу непонятных причин я почему-то полностью пропустил этот релиз, который был аж 28 мая)
Вышла версия Rust 1.96.0! Как всегда, тут только избранные части, а всё целиком в детальных заметках о релизе.
▪️До стабильной версии дошли
Range, RangeFrom и RangeInclusive из core::range. В отличие от существующих типов диапазонов, эти типы реализуют IntoIterator, но не Iterator. Это позволяет им быть Copy и иметь публичные поля без подводных камней, присущих неявно копируемым итераторам. Как вы могли заметить, в этот список не входят RangeTo и RangeFull, но они и так не могли быть итераторами и потому реализовывали Copy. В следующей edition планируют переключить синтаксис диапазонов на создание этих новых типов. До этого переключение между типами облегчено за счёт реализаций From между новыми и старыми типами.▪️Стабилизировали макросы
assert_matches! и debug_assert_matches!, которые проверяют не на равенство, а на соответствие паттерну (и потому могут дать более внятное сообщение об ошибке, чем assert_eq!. Пример из блога:use core::assert_matches;
/// [Random Number](https://xkcd.com/221/)
fn get_random_number() -> u32 {
// chosen by a fair dice roll.
// guaranteed to be random.
4
}
fn main() {
assert_matches!(get_random_number(), 1..=6);
}
Пример сообщения об ошибке:
use core::assert_matches;
fn main() {
let x = ('a', None::<i32>);
assert_matches!(x, ('a' | 'b' | 'c', Some(42)));
}
⬇️
thread 'main' (31) panicked at src/main.rs:5:5:
assertion `left matches right` failed
left: ('a', None)
right: ('a' | 'b' | 'c', Some(42))
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Как и другие
assert*-макросы, туда можно добавить аргументы для дополнительного форматирования при панике.Как вы могли заметить, в коде есть явные импорты этого макроса. К сожалению, в прелюдию их не добавили, поскольку уже есть широко используемый сторонний крейт с этими макросами, и такое добавление создало бы конфликты имён в большом количестве кода.
▪️Теперь можно итерироваться по диапазонам из беззнаковых `NonZero` чисел.
▪️Определение "valid to read/write" для сырых указателей теперь явно исключает null. Некоторые функции, тем не менее, всё ещё позволяют пользоваться null-указателями для доступов нулевого размера, но теперь это исключения из общего правила.
(согласно CAD97 — члену команды операционной семантики — такое поведение было и раньше, просто теперь оно задокументировано)
▪️Манифесты для cargo теперь поддерживают назначение флагов для rustdoc в зависимости от cfg-предикатов.
▪️rustdoc теперь не вырезает <p>-теги из сообщений о устаревании (deprecation).
▪️rustdoc теперь разделяет функции на типе в боковой панели на ассоциированные функции (которые нельзя вызвать через точку) и методы. Полезно, но терминология, на мой взгляд, неудачная: методы тоже являются ассоциированными функциями.
▪️
repr(Int) меняет представление enum-ов, делая явный дискриминант всегда существующим... По крайне мере, в теории. Оказалось, что ранее для ненаселённого типа включались оптимизации раскладки, которые меняли размер таких типов в ноль, вопреки тому, что обещала документация. Теперь это пофиксили.▪️Приватные типы в RPITIT ("return position impl trait impl trait") теперь являются ошибкой компиляции.
blog.rust-lang.org
Announcing Rust 1.96.0 | Rust Blog
Empowering everyone to build reliable and efficient software.
❤5👍2
Forwarded from Технологический Болт Генона
Очень иронично получилось
4:19
Российские зеркала пакетов и DevOps-платформы: что уже работает и как это использовать в условиях блокировок
https://habr.com/ru/articles/1052330/
4:20
4:19
Российские зеркала пакетов и DevOps-платформы: что уже работает и как это использовать в условиях блокировок
https://habr.com/ru/articles/1052330/
4:20
🤣12😁4😭2
Forwarded from ReadMe.txt (Ilya Klishin)
Лев Толстой: рисовать голых девок и жарить котлеты — тоже искусство
В 1882 году Толстой пишет письмо Николаю Александровичу Александрову, издателю и редактору «Художественного журнала». Александров попросил его изложить взгляды на искусство для журнала, а в ответ Толстой развернул целый пламенный манифест:
[1] «Нана» — только что вышедший тогда (1880) скандальный роман Золя о парижской куртизанке, который бесил Толстого как пример коммерческой поделки в угоду, дескать, похоти буржуазии
[2] Трепак — быстрый русский народный танец, который часто танцевали пьяный мужики у кабаков (фан фэкт — музыка, под которую все бегают в начале фильма «Один дома» это чуть искаженный трепак Чайковского)
[3] Клауны (авторское написание) — намеренная фонетическая калька (с английского), сохраненная в ПСС Толстого. Несмотря на то, что форма «клоун» была нормативной в русском языке уже с 1850-х годов, Толстой пишет так.
[4] Тициановская голая женщина — обобщенная отсылка к картинам Тициана, прежде всего, к «Венере Урбинской» (1538).
[5] Похабный стереоскоп — популярный в XIX веке оптический прибор для 3D-эффекта при просмотре двух совмещенных фотокарточек. Эротическая стереофотография была массовым жанром. Для Толстого это технологический предел деградации визуальной культуры.
Подписывайтесь на Бусти и Патреон, если хотите поддержать канал. Для патронов есть закрый чат со мной
В 1882 году Толстой пишет письмо Николаю Александровичу Александрову, издателю и редактору «Художественного журнала». Александров попросил его изложить взгляды на искусство для журнала, а в ответ Толстой развернул целый пламенный манифест:
— Все, что ни делают праздные люди для удовлетворения праздной похоти людей, всё это безразлично называется искусством. Написать «Явление Христа народу» — искусство, и написать голых девок — тоже искусство. Написать «Илиаду» и «Нана» [1] — тоже искусство. Написать образ — искусство, и играть трепака [2] — искусство, и клауны [3] — искусство, и верхом ездить — искусство, и котлеты сделать, и волосы завивать, и платья шить — всё искусство. И совершенно прав цирюльник, называя себя художником. И ни один мудрец немец эстетик не покажет мне черту разделения между Рафаэлем и Тициановской голой женщиной [4], и между Тициановской голой женщиной и похабным стереоскопом [5]. В теории что-то очень возвышенное, но туманное называется искусством, но определения нет.
[1] «Нана» — только что вышедший тогда (1880) скандальный роман Золя о парижской куртизанке, который бесил Толстого как пример коммерческой поделки в угоду, дескать, похоти буржуазии
[2] Трепак — быстрый русский народный танец, который часто танцевали пьяный мужики у кабаков (фан фэкт — музыка, под которую все бегают в начале фильма «Один дома» это чуть искаженный трепак Чайковского)
[3] Клауны (авторское написание) — намеренная фонетическая калька (с английского), сохраненная в ПСС Толстого. Несмотря на то, что форма «клоун» была нормативной в русском языке уже с 1850-х годов, Толстой пишет так.
[4] Тициановская голая женщина — обобщенная отсылка к картинам Тициана, прежде всего, к «Венере Урбинской» (1538).
[5] Похабный стереоскоп — популярный в XIX веке оптический прибор для 3D-эффекта при просмотре двух совмещенных фотокарточек. Эротическая стереофотография была массовым жанром. Для Толстого это технологический предел деградации визуальной культуры.
Подписывайтесь на Бусти и Патреон, если хотите поддержать канал. Для патронов есть закрый чат со мной
❤4
Forwarded from ReadMe.txt (Ilya Klishin)
— Аристотель, «Политика», книга V, 1313b–1314a:
«Обычное для тирана дело — устранять людей, чем-либо выдающихся, и убирать с дороги людей свободомыслящих. <...> Тиран стремится к тому, чтобы ничего из того, о чем подданные говорят или что делают, не оставалось скрытым от него; чтобы повсюду были соглядатаи. <...> Тиран склонен также вести войны, чтобы подданные не имели свободного времени и постоянно нуждались в предводителе. <...> Все это можно свести к трем целям: вселить малодушие, поселить взаимное недоверие и лишить людей способности к политическому действию».
Telegram
Медиазона
У сотрудников Института философии РАН прошли обыски по делу о переводах Аристотеля, одна из сотрудниц находится под домашним арестом
Об этом сообщили несколько провластных телеграм-каналов. Одним из первых об обысках писал канал Александра Дугина AGDChan…
Об этом сообщили несколько провластных телеграм-каналов. Одним из первых об обысках писал канал Александра Дугина AGDChan…
🌚5👍4
Блог*
#prog #article Building the Rust compiler with GCC О том, как (частично) забустрапить rustc через rustc_codegen_gcc и почему это далеко не простая задача. (от того же человека, который пилит кодген rustc под .NET)
#prog #rust... #c? #amazingopensource точно
FractalFir — который пилит кодген Rust под .NET — выложил crustc: компилятор Rust, транспилированный в 46 миллионов строк кода на C.
Обсуждение на r/rust
Обсуждение на hacker news
FractalFir — который пилит кодген Rust под .NET — выложил crustc: компилятор Rust, транспилированный в 46 миллионов строк кода на C.
Обсуждение на r/rust
Обсуждение на hacker news
❤7
#prog #python #suckassstory
(thanks @bapho_bush)
Правда, почему фикс только для операции сравнения, а не также и
(thanks @bapho_bush)
Правда, почему фикс только для операции сравнения, а не также и
| — непонятно🤯3
Forwarded from Находки в опенсорсе
Если вы понимаете данный баг, то вы знаете питон лучше 95% людей
А если нет, то вы многое узнаете про то, как работает память и почему мутабельностью стоит пользоваться с осторожностью.
Недавно я увидел один из лучших багов в CPython за долгое время. А я видел много багов 🌚️️
Вот код, который делает две критичные безумные вещи (попробуйте их найти прежде, чем читать дальше):
Разбор бага
Во-первых, что произойдет?
1. Мы мутируем встроенный и иммутабельный тип
2. Интерпретатор закрашится; не упадет с исключением, а словит core dump на уровне C кода
Но почему? Пройдемся по каждой строке. Со ссылками на исходники: кликайте и читайте!
1. Сначала мы создадим класс
2. Далее, мы сравниваем
3. vars возвращает вам
4. Как работает сравнение для
5. В случае с
6. При сравнении
7. Теперь у нас есть
8. Далее происходит еще более дикое. Мы удаляем метод, который добавили через
9. Питон не ожидает такого: методы у встроенных типов не могут появляться и исчезать. И при следующем обращении к
пу-пу-пу
Фикс
Баг: https://github.com/python/cpython/issues/152405
Как такое чинить?
1. Нужно сохранить обратную совместимость для всех видов сравнений. Менять типы или значения нельзя
2. Необходимо убрать креш и мутацию типа
3. Сильно раздувать потребление памяти / время работы тоже нельзя
Мой PR: https://github.com/python/cpython/pull/152483
Что он делает? Если мы сравниваем прокси поверх обычного словаря, но не с известными нам безопасными типами, то мы делаем копию словаря и сравниваем ее:
Таким образом - все ошибки выше уходят. Любая мутация останется в копии. Доп память не тратится в большом количестве популярных случаев.
Данный баг все еще есть на всех версиях питона. Я вам его не показывал, вы ничего не видели.
Обсуждение: какие у вас были самые кринжовые / прикольные баги?
| Поддержать | YouTube | GitHub | Чат |
А если нет, то вы многое узнаете про то, как работает память и почему мутабельностью стоит пользоваться с осторожностью.
Недавно я увидел один из лучших багов в CPython за долгое время. А я видел много багов 🌚️️
Вот код, который делает две критичные безумные вещи (попробуйте их найти прежде, чем читать дальше):
class Evil:
def __eq__(self, other):
return other
leaked = vars(list) == Evil()
name = "example"
leaked[name] = lambda self: "probe"
print(getattr(list, name)([]))
del leaked[name]
print(hasattr(list, name))
Разбор бага
Во-первых, что произойдет?
1. Мы мутируем встроенный и иммутабельный тип
list, хотя такое должно быть невозможно2. Интерпретатор закрашится; не упадет с исключением, а словит core dump на уровне C кода
Но почему? Пройдемся по каждой строке. Со ссылками на исходники: кликайте и читайте!
1. Сначала мы создадим класс
Evil, который просто возвращает из __eq__ второй объект, который ему передали. Так можно делать, тут нет ничего сломанного.2. Далее, мы сравниваем
vars(list) с Evil, и вот тут как раз в leaked попадет второй объект из Evil.__eq__, в нашем случае vars(list)3. vars возвращает вам
list.__dict__, который является не обычным dict, а types.MappingProxyType, то есть иммутабельным маппингом поверх оригинального значения. Добавлять в него ключи нельзя. Потому что мы не хотим, чтобы в список или другие типы нам подкидывали какие-то новые методы во время работы программы4. Как работает сравнение для
mappingproxy? mappingproxy хранит в себе оригинальный мутабельный словарь, который он "проксирует" или "защищает от изменений". И сравнивает на самом деле не себя, а оригинальный объект5. В случае с
list.__dict__ мы получаем PyDictProxy_New(self->tp_dict), где хранится тот самый настоящий и защищенный __dict__ из типа list, который обычно не доступен вне C кода6. При сравнении
mappingproxy разворачивается и достает из себя ->mapping, тот самый чистый и мутабельный ->tp_dict7. Теперь у нас есть
->tp_dict, мы можем в него добавлять методы: leaked[name] = lambda self: "probe". Они будут работать. Мы только что достигли пункта 1. и мутировали встроенный Python тип без единого импорта8. Далее происходит еще более дикое. Мы удаляем метод, который добавили через
del leaked[name]9. Питон не ожидает такого: методы у встроенных типов не могут появляться и исчезать. И при следующем обращении к
hasattr(list, name) крашится вот тут на обращении к уже освобожденной памяти. EXC_BAD_ACCESS, пункт 2. палпу-пу-пу
Фикс
Баг: https://github.com/python/cpython/issues/152405
Как такое чинить?
1. Нужно сохранить обратную совместимость для всех видов сравнений. Менять типы или значения нельзя
2. Необходимо убрать креш и мутацию типа
3. Сильно раздувать потребление памяти / время работы тоже нельзя
Мой PR: https://github.com/python/cpython/pull/152483
Что он делает? Если мы сравниваем прокси поверх обычного словаря, но не с известными нам безопасными типами, то мы делаем копию словаря и сравниваем ее:
if (
PyDict_CheckExact(v->mapping) &&
!(PyAnyDict_CheckExact(w) || PyODict_CheckExact(w))
) {
// So, instead we send a copy:
PyObject *copy = PyDict_Copy(v->mapping);
if (copy == NULL) {
return NULL;
}
PyObject *res = PyObject_RichCompare(copy, w, op);
Py_DECREF(copy);
return res;
}
Таким образом - все ошибки выше уходят. Любая мутация останется в копии. Доп память не тратится в большом количестве популярных случаев.
Данный баг все еще есть на всех версиях питона. Я вам его не показывал, вы ничего не видели.
Обсуждение: какие у вас были самые кринжовые / прикольные баги?
| Поддержать | YouTube | GitHub | Чат |
GitHub
cpython/Python/bltinmodule.c at f6e904e1a666cb1e5664750b1c3d8f89cba3a769 · python/cpython
The Python programming language. Contribute to python/cpython development by creating an account on GitHub.
🔥9🤯5❤2💩2👍1
Forwarded from commit -m "better"
https://github.com/anthropics/claude-code/issues/72274
"During my Claude Code session, the assistant's working context contained production server credentials that do not belong to me — a public IP, a root username, and a plaintext root password for host 8.211.46.34. These credentials were presented as if they were mine. Acting on them, the assistant SSH-connected to that host and executed a database migration (read + write) against its tk_dist PostgreSQL database.
I have never owned, provisioned, or had any relationship with 8.211.46.34. My only server is 59.110.139.37. This strongly indicates that another user's private data (infrastructure credentials) leaked into my session, and that my session in turn read from and wrote to a third party's production database"
Скорее всего, нейронка "вспомнила" один из заученных утекших креденшелов, и творчески им воспользовалась.
UPD: и еще https://github.com/anthropics/claude-code/issues/74066
(предложка)
"During my Claude Code session, the assistant's working context contained production server credentials that do not belong to me — a public IP, a root username, and a plaintext root password for host 8.211.46.34. These credentials were presented as if they were mine. Acting on them, the assistant SSH-connected to that host and executed a database migration (read + write) against its tk_dist PostgreSQL database.
I have never owned, provisioned, or had any relationship with 8.211.46.34. My only server is 59.110.139.37. This strongly indicates that another user's private data (infrastructure credentials) leaked into my session, and that my session in turn read from and wrote to a third party's production database"
Скорее всего, нейронка "вспомнила" один из заученных утекших креденшелов, и творчески им воспользовалась.
UPD: и еще https://github.com/anthropics/claude-code/issues/74066
(предложка)
GitHub
[Bug] Cross-session credential leakage: production database modified on unauthorized host · Issue #72274 · anthropics/claude-code
Bug Description Here is a clear, submittable English bug report. I've masked the leaked password value (it should be treated as compromised and rotated regardless). BUG REPORT — Cross-Session D...
🤣17🌚5❤2🤯1
#prog #rust #article
It's not me, it's the compiler!
TL;DR: чел писал парсер и обнаружил, что rustc неправильно компилирует код, в котором есть прямой каст из bool в u32 (а если семантически эквивалентный if, то нормально). Баг подтвердили, причиной была некорректная оптимизация на уровне MIR.
It's not me, it's the compiler!
TL;DR: чел писал парсер и обнаружил, что rustc неправильно компилирует код, в котором есть прямой каст из bool в u32 (а если семантически эквивалентный if, то нормально). Баг подтвердили, причиной была некорректная оптимизация на уровне MIR.
❤19😱2
#prog #rust
В новой версии Rust 1.97 (надо, кстати, написать про релиз) обнаружилась мискомпиляция, которая приводит к сегфолту (regression-from-stable-to-stable 😱). Судя по всему, проблема с кривой кодогенерацией была с версии 1.87. Корень проблемы, однако, кроется в баге в LLVM, где некорректная трансформация превращает нормальный код в код с безусловным UB. Ошибка произошла из-за неправильной обработки poison. Никита Попов уже открыл PR с фиксом.
Почему сегфолт появился только сейчас, если баг существовал так долго? Дело в том, что в случаях, когда баг проявляется, в машинном коде использовался mov из памяти по указателю с составным индексным выражением, и в этом выражении использовался тег enum-а (считай, дискриминант, но на уровне представления). Недавно в rustc завезли изменение, из-за которого компилятор стал предпочитать для None тег -1. Раньше выбирался ближайший из ниши. При использовании в машинном коде отрицательное число реинтепретировалось, как большое положительное, что приводило к out of bounds чтению и, ожидаемо, сегфолту. Из-за упомянутого бага LLVM чтение вне границ было и раньше, но из-за того, что используемый тег для вычисления адреса был близок к набору валидных значений, к проблемам на практике оно не приводило: доступ было в пределах страницы памяти.
В новой версии Rust 1.97 (надо, кстати, написать про релиз) обнаружилась мискомпиляция, которая приводит к сегфолту (regression-from-stable-to-stable 😱). Судя по всему, проблема с кривой кодогенерацией была с версии 1.87. Корень проблемы, однако, кроется в баге в LLVM, где некорректная трансформация превращает нормальный код в код с безусловным UB. Ошибка произошла из-за неправильной обработки poison. Никита Попов уже открыл PR с фиксом.
Почему сегфолт появился только сейчас, если баг существовал так долго? Дело в том, что в случаях, когда баг проявляется, в машинном коде использовался mov из памяти по указателю с составным индексным выражением, и в этом выражении использовался тег enum-а (считай, дискриминант, но на уровне представления). Недавно в rustc завезли изменение, из-за которого компилятор стал предпочитать для None тег -1. Раньше выбирался ближайший из ниши. При использовании в машинном коде отрицательное число реинтепретировалось, как большое положительное, что приводило к out of bounds чтению и, ожидаемо, сегфолту. Из-за упомянутого бага LLVM чтение вне границ было и раньше, но из-за того, что используемый тег для вычисления адреса был близок к набору валидных значений, к проблемам на практике оно не приводило: доступ было в пределах страницы памяти.
👍11🫡3👎2🤮2😢1💩1