Информация об изменениях

Сообщение Re[41]: Безопасность Rust от 03.06.2019 20:31

Изменено 03.06.2019 20:34 vdimas

Re[41]: Безопасность Rust
Здравствуйте, ·, Вы писали:

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) записывается по адресу lov(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.
Re[41]: Безопасность Rust
Здравствуйте, ·, Вы писали:

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) записывается по адресу lov(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