1.83K subscribers
3.3K photos
131 videos
15 files
3.57K links
Блог со звёздочкой.

Много репостов, немножко программирования.

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here
Download Telegram
#rust #article #abnormalprogramming

Читателям моего блога, вероятно, знакомо такое понятие, как квайн: программа, организованная таким образом, что при запуске печатает собственный текст (буквальное обращение к файлу с исходником считается читерством).

Парочка наблюдений.
Для написания квайна на самом деле не требуется много выразительной силы языка.
Многие форматы для архивов являются фактически программами для восстановления исходных, несжатых, файлов, из серии инструкций, выполняемых интерпретатором — разархиватором.

Что из этого следует? Можно создать архивный аналог квайна: архив, который распаковывается в сам себя. В статье Zip Files All The Way Down рассказывается о том, как этого можно достичь.
🔥6
#prog #article #suckassstory

Why Chrome Crashes the Rust Book’s Web Server

TL;DR: Chrome в целях оптимизации загрузки может открыть больше одного TCP-соединения к серверу для доступа к одной веб-странице и при этом закрыть их, так ничего и не послав.
🤔3🤯3
#культурнаяпрограмма

Coding Machines

Небольшой научно-фантастический рассказ, вдохновлённый "Reflections on trusting trust" Кена Томпсона (да, источник вдохновения является спойлером)
🥰14👍4🌚3
This media is not supported in your browser
VIEW IN TELEGRAM
👍10
👍18💩11💯7❤‍🔥2👎2
👍16🌚4🍌2💩1
Forwarded from The After Times
😘 Хакеры Гей-Фурри взломали ядерную лабораторию США и требуют начать исследования по созданию кошкодевочек

В недавнем инциденте кибербезопасности, группа хакеров SiegedSec, самоопределяющаяся как "Гей Фурри Хакеры", осуществила взлом Американской ядерной лаборатории INL. Эта группа, известная своими атаками на серверы НАТО, на этот раз получила доступ к персональным данным сотрудников INL, включая социальные номера и домашние адреса.

В ответ на взлом, хакеры предложили необычную сделку лаборатории:

Мы готовы заключить сделку с INL. Если они начнут исследования по созданию в реальной жизни кошкодевочек, то мы все удалим.


Помимо прочего, SiegedSec известна своими политическими мотивами, включая атаки на правительственные организации в знак протеста против нарушений прав человека и дискредитацию трансгендеров.

INL, филиал Министерства энергетики США, работает над различными проектами, в том числе в области ядерных реакторов и устойчивой энергетики, насчитывая более 5000 сотрудников.
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰13😁2👎1
#prog #rust хайлайты:

▪️На реализациях метода Debug::fmt, сгенерированных derive-макросом, теперь добавляется #[inline]. Суммарно это привело к меньшему времени компиляции (!) на громадном количестве компиляторных бенчмарков. Подробнее в разборе (ищите Emit #[inline] on derive(Debug)).

▪️Парсер теперь восстанавливается от ключевых слов перед fn с дубликатами или в неправильном порядке. (для справки, порядок pub, default, const, async, unsafe, extern)


▪️Компилятор теперь предупреждает при использование нестабильной фичи через флаг -Ctarget-feature. Да, раньше не предупреждал.

▪️Стабилизировали Option::inspect и Result::{inspect, inspect_err}:

impl Option<T> {
pub fn inspect<F: FnOnce(&T)>(self, f: F) -> Self;
}
impl Result<T, E> {
pub fn inspect<F: FnOnce(&T)>(self, f: F) -> Self;
pub fn inspect_err<F: FnOnce(&E)>(self, f: F) -> Self;
}


▪️Как я рассказывал, в модуле fmt стандартной библиотеки есть хелперы DebugList и прочие для облегчения кастомной реализации Debug. Их недостатком можно назвать тот факт, что методы для форматирования очередной порции структуры (например, DebugList::entry) принимают на вход значение, реализующее Debug, и вызывают на нём метод Debug::fmt. Как рассказывается в мотивации, это на практике приводило к использованию одноразовых типов, необходимых лишь ради их реализации Debug. Теперь к этим типам добавили методы, которые форматируют очередную порцию при помощи переданной аргументом функции, принимающей на вход ссылку на fmt::Formatter.

▪️В настоящий момент Rust поддерживает атрибуты на item-ах, но не на отдельных выражениях. В частности, в Rust нельзя непосредственно навесить пару атрибутов #[cfg(..)] на два выражения в конце функции (которые предназначены для возврата значения из функции). Попытка записать такой код приводила к не самой полезной ошибке Unexpected token: expected ;, found #. Esteban Kuber внёс изменение в парсер, которое распознаёт эту ситуацию и предлагает обходной путь: добавление точки с запятой или оборачивание выражений в фигурные скобки.

▪️Компилятор теперь предупреждает о неиспользуемых Pin<P>, где на P есть атрибут #[must_use]. В частности, теперь компилятор предупреждает о коде вроде такого (пример из PR):

fn foo() -> Pin<Box<dyn Future<Output = i32>>> {
Box::pin(async { 42 })
}

// call `foo`, but forget to await the result
foo();


▪️Если выражение с оператором сравнения не компилируется из-за того, что типы разные за вычетом ссылки с одной стороны, то компилятор теперь предлагает разыменовать ссылку вместо взятия ссылки для другого аргумента. Пример:

fn main() {
let i: &i64 = &1;
if i < 0 {}
}


До:


error[E0308]: mismatched types
--> src/main.rs:3:12
|
3 | if i < 0 {}
| ^ expected `&i64`, found integer
|
help: consider borrowing here
|
3 | if i < &0 {}
| +

После:


error[E0308]: mismatched types
--> src/main.rs:3:12
|
3 | if i < 0 {}
| ^ expected `&i64`, found integer
|
help: consider dereferencing the borrow
|
3 | if *i < 0 {}
| +

▪️Как я уже писал, компилятор предлагает вызвать конструктор при попытке сконструировать структуру с приватными полями. Реализовано это было довольно костыльно: компилятор просто искал метод на типе с именем new и предлагал его, вообще не смотря на типы. Теперь компилятор предлагает все методы, которые возвращают Self. Кусочек из тестов:
👍21
error: cannot construct `HashMap<_, _, _>` with struct literal syntax due to private fields
--> $DIR/suggest-box-new.rs:16:13
|
LL | let _ = std::collections::HashMap {};
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: ... and other private field `base` that was not provided
help: you might have meant to use an associated function to build this type
|
LL | let _ = std::collections::HashMap::new();
| ~~~~~~~
LL | let _ = std::collections::HashMap::with_capacity(_);
| ~~~~~~~~~~~~~~~~~~
LL | let _ = std::collections::HashMap::with_hasher(_);
| ~~~~~~~~~~~~~~~~
LL | let _ = std::collections::HashMap::with_capacity_and_hasher(_, _);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
help: consider using the `Default` trait
|
LL | let _ = <std::collections::HashMap as std::default::Default>::default();
| +

Изменение важно также и тем, что помогает новичкам узнавать о доступных конструкторах без ручного чтения документации.

▪️В fmt исправлен баг с некорректным округлением при использовании экспоненциальной нотации.

▪️В Clippy внесли несколько новых линтов. Отмечу только парочку:
🔸Вы знали, что один и тот же тип не может реализовывать одновременно Borrow<str>, Borrow<[u8]> и Hash? Теперь знаете. А новый линт impl_hash_borrow_with_str_and_bytes объяснит почему: str и [u8] хешируются по разному.
🔸Path::join замещает путь целиком, если добавляемый путь является абсолютным. Это документированное, но неочевидное поведение. Линт join_absolute_paths предупреждает о случаях, когда это происходит безусловно — почти наверняка это не то, чего хочет программист.
5👍2
#prog

Отдельное изменение в стандартной библиотеке #rust заслуживает отдельного упоминания — не потому, что оно затрагивает многих пользователей, но потому, что изменение может привести к трудно диагностируемым ошибкам. Именно, после этого PR методы strong_count и weak_count на Arc и sync::Weak загружают соответствующие счётчики с порядком Relaxed вместо Acquire. Если вы использовали эти методы в каком-то сложном lockless коде, то вам может понадобиться вставить Acquire memory fence.

На всякий случай: если вы просто хотите получить уникальную ссылку на содержимое Arc, то вам лучше использовать методы Arc::get_mut и Arc::make_mut. Код вида

if Arc::strong_count(&arc_ptr) == 1 {
let ptr = unsafe { &mut *(Arc::as_ptr(&arc_ptr) as *mut _) };
// ...
}

практически никогда не является верным из-за возможных гонок.
👍3
Немного сексисткий #meme
1
Forwarded from Meme Trap (10satka)
❤‍🔥13🤡6🥰1
Блог* pinned «#prog #rust Апкаст трейтов стабилизировали буквально вчера! Из наиболее насущного вопроса: да, апкаст сырого указателя на dyn Trait с невалидной vtable является UB.»