Сообщение Re[41]: Безопасность Rust от 03.06.2019 20:31
Изменено 03.06.2019 20:38 vdimas
V>>в некоей архитектуре породит код, который не будет атомарно писать и читать эту переменную.
V>>Смогёшь?
·>Я ж уже тебе показывал, но чукча не читатель: https://godbolt.org/z/LLNDkD
Показать и доказать — разные вещи. ))
Упрощу:
https://godbolt.org/z/vNstSQ
static volatile sig_atomic_t v;
void s(sig_atomic_t num) {
v=num;
}
======
1 s(int):
2 lui a5,%hi(v)
3 sw a0,%lo(v)(a5)
4 ret
Насколько я понимаю, в строке 2 в a5 записывается старшая половина статического адреса v, а в строке 3 значение a0 (параметр num) записывается по адресу low(v) + hi(v) из a5.
Тебе необходимо показать, что в строке 3 может произойти неатомарная запись.
На всяк случай — ты привёл абстрактный RISC, который именно разрабатывается как абстрактный.
В его доке есть примечания:
The atomic memory operation (AMO) instructions perform read-modify-write operations for multiprocessor synchronization
...
The AMOs were designed to implement the C11 and C++11 memory models efficiently.
...
implementations might also implement AMOs at memory controllers, and can optimize away fetching the original value when the destination is x0.
У тебя по ссылке swap, но чтение содержимого переменной не требовалось, там безусловная запись, поэтому, скорее всего, будет работать "can optimize away fetching the original value".
Итого, когда биты aq=0 и rl=0 у этих операций и чтение значения не требуется (см в твоём примере amoswap.w zero, ...), семантика происходящего не будет отличаться от простого sw.
Вопрос: а почему же всё-таки AMO, а не sw?
Ответ там же в доке:
Но на этот счёт я уже делал комментарии ранее:If the address is not naturally aligned, a misaligned address exception will be generated.
http://www.rsdn.org/forum/flame.comp/7458035.1
V>>в некоей архитектуре породит код, который не будет атомарно писать и читать эту переменную.
V>>Смогёшь?
·>Я ж уже тебе показывал, но чукча не читатель: https://godbolt.org/z/LLNDkD
Показать и доказать — разные вещи. ))
Упрощу:
https://godbolt.org/z/vNstSQ
static volatile sig_atomic_t v;
void s(sig_atomic_t num) {
v=num;
}
======
1 s(int):
2 lui a5,%hi(v)
3 sw a0,%lo(v)(a5)
4 ret
Насколько я понимаю, в строке 2 в a5 записывается старшая половина статического адреса v, а в строке 3 значение a0 (параметр num) записывается по адресу low(v) + hi(v) из a5.
Тебе необходимо показать, что в строке 3 может произойти неатомарная запись.
На всяк случай — ты привёл абстрактный RISC, который именно разрабатывается как абстрактный.
В его доке есть примечания:
The atomic memory operation (AMO) instructions perform read-modify-write operations for multiprocessor synchronization
...
The AMOs were designed to implement the C11 and C++11 memory models efficiently.
...
implementations might also implement AMOs at memory controllers, and can optimize away fetching the original value when the destination is x0.
У тебя по ссылке swap, но чтение содержимого переменной не требовалось, там безусловная запись, поэтому, скорее всего, будет работать "can optimize away fetching the original value".
Итого, когда биты aq=0 и rl=0 у этих операций и чтение значения не требуется (см в твоём примере amoswap.w zero, ...), семантика происходящего не будет отличаться от простого sw.
Вопрос: а почему же всё-таки AMO, а не sw?
Ответ там же в доке по AMO:
Но на этот счёт я уже делал комментарии ранее:If the address is not naturally aligned, a misaligned address exception will be generated.
http://www.rsdn.org/forum/flame.comp/7458035.1