Тут репорт из 2021 про размер изменения для портирования на CHERI:
https://www.cl.cam.ac.uk/research/security/ctsrd/pdfs/20210917-capltd-cheri-desktop-report-version1-FINAL.pdf
Они примерно подсчитали:
https://www.cl.cam.ac.uk/research/security/ctsrd/pdfs/20210917-capltd-cheri-desktop-report-version1-FINAL.pdf
Они примерно подсчитали:
Our results are extremely exciting: It appears that key elements of the stack
were adapted for memory-safe execution with little difficulty (0.026% LoC changed), and that
CHERI memory safety and CHERI software compartmentalization had a strong potential
mitigation impact (ranging from 40% of past vulnerabilities for KDE up to 100% in key
supporting libraries). We described a number of limitations to our study, and key directions
for ongoing research and development
Язык Zig (канал)
Тут репорт из 2021 про размер изменения для портирования на CHERI: https://www.cl.cam.ac.uk/research/security/ctsrd/pdfs/20210917-capltd-cheri-desktop-report-version1-FINAL.pdf Они примерно подсчитали: Our results are extremely exciting: It appears that…
In total we compiled more than 6 million source lines of code for CHERI C/C++ successfully with only a very few changes: 2071 LoC or 0.034%
Тут главный прикол в том, что для программ и библиотек на C/C++ в большинстве случаев им было достаточно использовать типы из C99 и позднее, к примеру корректно использовать intrptr_t, size_t и т.д., и в таком случае можно даже не прятать за ifdef, потому что эти фиксы подходят для всех платформ.
Плюс иногда фиксить вот эти подделывания указателей из ниоткуда, например используя стандартный nullptr_t или NULL вместо кастомных. Т.е. опять же фиксы, полезные для всех архитектур
Плюс иногда фиксить вот эти подделывания указателей из ниоткуда, например используя стандартный nullptr_t или NULL вместо кастомных. Т.е. опять же фиксы, полезные для всех архитектур
👍2🤔1
Язык Zig (канал)
[RFC] Upstream target support for CHERI-enabled architectures - LLVM Project Если Zig хочет поддерживать эту архитектуру и быть настолько же кросс-платформенным, как Си, придётся парочку вещей подправить: CHERI заменяет указатели на capability-объекты, которые…
CHERI-basics.pdf
3.1 MB
нашел наконец, они тут повысили планку с миллионов строк кода на Си/C++ в мире до триллионов, но суть та же: железо намного легче заменить, чем язык. Достаточно в новые процессоры Intel и AMD добавить начиная с 2030 к примеру, и через 20 лет большинство компьютеров сами пользователи себе обновят (чтобы поиграть в игры 2050 года и т.д.), по самым типичным причинам, без огромных вложений
Реализация на уровне архитектуры:
https://www.youtube.com/watch?v=5F1_3eeEsU4
Порт Linux:
https://www.youtube.com/watch?v=aLc92JHfokY
Порт V8:
https://www.youtube.com/watch?v=3XBSny5Yc58
https://www.youtube.com/watch?v=5F1_3eeEsU4
Порт Linux:
https://www.youtube.com/watch?v=aLc92JHfokY
Порт V8:
https://www.youtube.com/watch?v=3XBSny5Yc58
Прямо сейчас, по меркам безопасности в релизных сборках можно расставить языки Rust -> Zig -> C/C++. В случае Rust к примеру, FFI небезопасен, и какая-нибудь программа может вызвать функцию из библиотеки на C или Zig, которая ломает всю безопасность системы спокойно. Ну или в unsafe делают transmute рандомный какой нибудь.
На CHERI программа может спокойно вызывать программу и передать ей указатель чисто на чтение к примеру, не боясь, что через него изменят структуру в Rust.
Будет обидно, если Rust и C/C++ будут работать спокойно дополнять друг друга изолированно и безопасно, а Zig станется самым небезопасным/непортируемым.
На CHERI программа может спокойно вызывать программу и передать ей указатель чисто на чтение к примеру, не боясь, что через него изменят структуру в Rust.
Будет обидно, если Rust и C/C++ будут работать спокойно дополнять друг друга изолированно и безопасно, а Zig станется самым небезопасным/непортируемым.
❤1💔1
Пока есть время исправить ошибку с единственным типом usize и внедрить улучшения в сам язык перед 1.0, думаю стоит воспользоваться.
К примеру на Си у них есть хедер с такими функциями:
cheri_address_get, cheri_base_get, cheri_address_set и т.д.
На Zig это можно было бы представить так же, как поля для срезов ptr и len, только для указателей:
К примеру на Си у них есть хедер с такими функциями:
cheri_address_get, cheri_base_get, cheri_address_set и т.д.
На Zig это можно было бы представить так же, как поля для срезов ptr и len, только для указателей:
var ptr: [*]u32 = ...;
ptr.address += 1;
ptr.permissions = .read_only;
❤3
Другой вариант: в Си есть паттерн с containerof, где из указателя к полю структуры получают указатель ко всей структуре.
В обычных CHERI C компиляторах указатель на поле структуры автоматом получит более точный и меньший диапазон, чем указатель к структуре. Так как указатели невозможно "расширить" обратно, такой прикол не сработает. Для этих случаев есть аттрибуты, которые контролируют это ограничение (no subobject bounds)
В обычных CHERI C компиляторах указатель на поле структуры автоматом получит более точный и меньший диапазон, чем указатель к структуре. Так как указатели невозможно "расширить" обратно, такой прикол не сработает. Для этих случаев есть аттрибуты, которые контролируют это ограничение (no subobject bounds)
❤1
Язык Zig (канал)
Другой вариант: в Си есть паттерн с containerof, где из указателя к полю структуры получают указатель ко всей структуре. В обычных CHERI C компиляторах указатель на поле структуры автоматом получит более точный и меньший диапазон, чем указатель к структуре.…
В Zig для этого есть одна встроенная функция
@fieldParentPtr. Компилятор Zig может просто проверять, используется ли она в каком-то месте для какой-то структуры. Если нет, включаем сжатие границ для них, если есть, отключаем.
Язык Zig (канал)
Если простыми словами, @intFromPtr и @ptrFromInt на этих архитектурах не будет работать, и usize с isize надо переделывать на них
а да, и ещё addrspace(.generic) придётся переделать или удалить, но вроде как AVR и SPIR-V мейнтейнеры и так хотят убрать его
потому что в гибрид моде у обычных указателей будет addrspace 0 (как обычно на x86-64), а у capabilities 200, чтобы старый код мог работать дальше на CHERI системах (например, закрытые программы или библиотеки, которые нельзя пересобрать), и рантайм мог отличать его от нового
в обоих случаях проверки будут работать, потому что старый код с указателями в рантайме просто прячет за собой capability, и те же проверки на границы и т.д., просто их не модифицируют вручную (не сжимают границы функциями по типу cheri_bounds_set т.д., потому что их нет в старом коде)
LLVM Discussion Forums
[RFC] Libc++ taking a dependency on Boost.Math for the C++17 Math Special Functions
Summary This RFC proposes permitting the use of Boost.Math within libc++ for the implementation of C++17 math special functions, a standard feature currently unimplemented in libc++. These functions are specified in <cmath> under the C++17 special functions…
[RFC] Libc++ taking a dependency on Boost.Math for the C++17 Math Special Functions
У libc++ (стандартной библиотеки C++ от LLVM) может появиться новая зависимость Boost.Math, которая позволит докончить поддержку C++17 в коде.
Почти все соглашаются и поддержиают это решению, но Эндрю говорит это помешает сильно для zig и zig c++:
Правда, весомых технических причин он не указал, так что люди не поняли...
У libc++ (стандартной библиотеки C++ от LLVM) может появиться новая зависимость Boost.Math, которая позволит докончить поддержку C++17 в коде.
Почти все соглашаются и поддержиают это решению, но Эндрю говорит это помешает сильно для zig и zig c++:
This is apocalyptic for us. We, and our users would strongly prefer missing C++17 features than a Boost.Math dependency.
If LLVM moves forward with this, we will very likely patch it out.
Правда, весомых технических причин он не указал, так что люди не поняли...
https://codeberg.org/breadtom/expozig
Альтернативный компилятор для Zig на Си. Автор хочет другой способ бутстрапинга сделать, без WASM файлов, от Си сразу к Zig
Альтернативный компилятор для Zig на Си. Автор хочет другой способ бутстрапинга сделать, без WASM файлов, от Си сразу к Zig
Codeberg.org
expozig
👍4
https://github.com/ziglang/zig/pull/24699
Эндр подчищает ring buffers в стандартной библиотеке (их в сумме 4, один он убирает в другом ПР и один тут).
BoundedArray он так и не полюбил :( опять хочет его удалить.
#upstream
Эндр подчищает ring buffers в стандартной библиотеке (их в сумме 4, один он убирает в другом ПР и один тут).
BoundedArray он так и не полюбил :( опять хочет его удалить.
#upstream
GitHub
remove RingBuffer; remove BoundedArray; use `@memmove` by andrewrk · Pull Request #24699 · ziglang/zig
Progress towards #19231
Upgrade Guide
ArrayListUnmanaged now has "Bounded" variants of all the "AssumeCapacity" methods:
- var stack = try std.BoundedArray(i3...
Upgrade Guide
ArrayListUnmanaged now has "Bounded" variants of all the "AssumeCapacity" methods:
- var stack = try std.BoundedArray(i3...
😢4
Старый Hello World 2015 года:
Влияние Rust здесь хорошо видно.
export executable "hello";
#link("c")
extern {
fn printf(__format: *const u8, ...) -> i32;
fn exit(__status: i32) -> unreachable;
}
export fn _start() -> unreachable {
printf("Hello, world!\n");
exit(0);
}
Влияние Rust здесь хорошо видно.
😁2
Язык Zig (канал)
Старый Hello World 2015 года: export executable "hello"; #link("c") extern { fn printf(__format: *const u8, ...) -> i32; fn exit(__status: i32) -> unreachable; } export fn _start() -> unreachable { printf("Hello, world!\n"); exit(0); } Влияние…
0.1.0 (октябрь 2017):
const io = @import("std").io;
pub fn main() -> %void {
%return io.stdout.printf("Hello, world!\n");
}
Язык Zig (канал)
0.1.0 (октябрь 2017): const io = @import("std").io; pub fn main() -> %void { %return io.stdout.printf("Hello, world!\n"); }
0.2.0 (март 2018):
По сути этот синтаксис до сих пор остался. (и наверно работал бы на 0.14, если бы не ошибки-варнинги по типу variable is not mutable)
const std = @import("std");
pub fn main() !void {
// If this program is run without stdout attached, exit with an error.
var stdout_file = try std.io.getStdOut();
// If this program encounters pipe failure when printing to stdout, exit
// with an error.
try stdout_file.write("Hello, world!\n");
}По сути этот синтаксис до сих пор остался. (и наверно работал бы на 0.14, если бы не ошибки-варнинги по типу variable is not mutable)