飴屋

Rust/初めてのunsafe

メモリの扱いが安全に保たれるように設計されたRustはよくできているんですが、ちょっとズルしたいことがあったりします。私の最初のズルは一時的にグローバル変数的なものが欲しくなった時でした。サウンドデータを出力するときに秒間48000回サンプリングするのですが、サンプリング中の計算値をモニタリングしたかったのです。一番気軽にモニタリングするとなったら、println!マクロでいいかなと思ったんですが、秒間48000回も出力が改行されるとページがめくれてしまい、前のモニター値にさかのぼれません。秒間240回くらい、頻度にして1/200回程度モニタしてくれればいいのに・・・ということで、何回目のモニタリング化をグローバル変数に記録することにしました。

もちろん、グローバル変数っていうのは誰からもどこからでも変更できちゃうので、Rust的には危険な存在です。

static mut a:usize = 0;

とりあえずローカルに静的な変素を用意すると「それダメー!」とコンパイラに怒られます。こちらとしては、変数の用途は限定的で危険になりえるわけがないので、伝家の宝刀 unsafe キーワードを抜いちゃうのでした。何か悪いことをしているような、不思議な気持ちにさせてくれますね。

unsafe {
	static mut a:usize = 0;
	if a % 200 == 0 {
		println!("{val}"); // valをモニタリング
	}
	a += 1;
}

これでコンパクトに全体を見通すことができました。

ポインタ関連で借用チェッカーが面倒な時もunsafeが魅力的に映りますが、安全と保守性のために今のところunsafeの出番は押さえています。