From 2f1698103dd13b1e17c3d34c71ae48cb6a1d41d9 Mon Sep 17 00:00:00 2001 From: Nekrolm Date: Mon, 11 Nov 2024 00:54:24 +0000 Subject: [PATCH] minor fixes --- concurrency/filesystem.md | 3 ++- pointer_provenance/strict_aliasing.md | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/concurrency/filesystem.md b/concurrency/filesystem.md index a3242d6..2aacf0c 100644 --- a/concurrency/filesystem.md +++ b/concurrency/filesystem.md @@ -39,6 +39,7 @@ int main() { ```Rust // это упрощенный код +// directory: Path if directory.is_symlink() { remove_link(directory) } else { @@ -48,7 +49,7 @@ if directory.is_symlink() { Между проверкой и удалением злоумышленник мог подменить настоящий каталог на символьную ссылку и добиться удаления данных, к которым у него нет доступа. -Ошибку исправили. +Ошибку исправили: вместо работы с путями, функция стала работать с элементами в каталоге через единожда открытываемвц файловый дескриптор. А теперь мы можем вернуться к C++: diff --git a/pointer_provenance/strict_aliasing.md b/pointer_provenance/strict_aliasing.md index 9a73f92..fbcf59a 100644 --- a/pointer_provenance/strict_aliasing.md +++ b/pointer_provenance/strict_aliasing.md @@ -99,7 +99,7 @@ process(Data*, int): Если у вас есть указатели двух **разных** типов `A* a` и `B* b`, то запись значений через указатель `a` **не влияет** на чтение значений через указатель `b`, во всех случаях, кроме нескольких исключений (*алиасинг*): - `A` и `B` — это *совместимые*, signed/unsigned версии одного и того же типа - `A` — это тип, *совместимый* с каким-либо из подобъектов внутри `B`: элемент структуры или объединения, элемент массива -- `A` или `B` — знаковый или беззнаковый `char` или `std::byte`. Этот вариант существует как раз для того чтоб можно было работать с сырыми байтиками. +- `A` или `B` — `char`, `unsigned char` или `std::byte`. Этот вариант существует как раз для того чтоб можно было работать с сырыми байтиками. Заметьте, что `signed char` не считается. В C (не в C++, но компиляторы поддерживают!) допустимо еще: - `A` и `B` — это *соместимые* структуры/объединения: у них совпадает размер, порядок и имена полей и типы полей *совместимы*. Например `struct Vector { int32_t x; int32_t y; }` и struct `Point { uint32_t x; uint32_t y; }`