minor fixes

This commit is contained in:
Nekrolm
2024-11-11 00:54:24 +00:00
parent 3451fcef68
commit 2f1698103d
2 changed files with 3 additions and 2 deletions
+2 -1
View File
@@ -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++:
+1 -1
View File
@@ -99,7 +99,7 @@ process(Data<unsigned long>*, 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; }`