10000 Rust APIの`unsafe_code`を`allow`にする by qryxip · Pull Request #773 · VOICEVOX/voicevox_core · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Rust APIのunsafe_codeallowにする #773

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged

Conversation

qryxip
Copy link
Member
@qryxip qryxip commented Apr 2, 2024

内容

crates/voicevox_coreに対する#175を取り消します。理由は次の通りです。

関連 Issue

その他

@qryxip qryxip changed the title voicevox_coreのunsafe_codeallowにする Rust APIのunsafe_codeallowにする Apr 2, 2024
Copy link
Member
@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

よくわかりませんが、unsafeなプルリクが飛んできやすくなるかもと感じました!
となると、unsafe impl Sendをなくせるなら、denyにしといたほうがプルリク来たときに変更お願いしやすいかも or そもそもunsafeじゃないコードをもらえやすくなるかもと思いました。

全然わかってない状態で言ってるので、別に恩恵なさそうだったらご指摘ください 🙇

@qryxip
Copy link
Member Author
qryxip commented Apr 15, 2024

恩恵で言えば、個人的には率直に言って今となってはゼロに近いと思っています。unsafeなコードは厳重に扱われるべきであるし数も減らすべきですが、それに対して#[deny(unsafe_code)]は有効ではないと思っています。

例として、あるクレート内に次のコードがあるとします。

unsafe {
    external_c_function();
}

このクレート全体に#[deny(unsafe_code)]を掛けてもunsafeを封じることにはなりません。denyレベルであれば下層でallowし直せるので、このようにすればunsafeが使えます。今のcrates/voicevox_coreはこうなっています。

+#[allow(unsafe_code)]
 unsafe {
     external_c_function();
 }

この#[allow(unsafe_code)]ですが、文字数を増やすことにしかなっていないと思います。何故ならばunsafeなアイテムはそもそもunsafe {}で囲う必要があるからです。

unsafeコードを記述する敷居を高くしたいのであれば、このようなコメントを書く文化がRustにはあります。こういうコメントを書く方に倒した方がよいと思います。

 unsafe {
+    // SAFETY: This is safe because:
+    // 1. …
+    // 2. …
     external_c_function();
 }

#175 の当時は今で言うcrates/voicevox_core_c_apiの部分がcrates/voicevox_core内に含まれており、extern "C"関数宣言部分とそれ以外の部分が違う世界であるということを表明する意義があったかもしれません。ただ今となってはクレートとして分離されているため、理由としては無くなっていると思います。

ちなみにですがdenyではなくforbidであれば、部分的にallowし直すことはできないためunsafeコードを封じることができます。#[forbid(unsafe_code)]であればある一つのクレート、つまり一塊のパブリックAPIがSafe Rustで構成されていると表明できるという意義があります。
参考: Rust Safety Dance
list_windows_video_cards()だけ別クレート(もしくは別リポジトリ)に確保して、unsafeなコードが無くなったcrates/voicevox_coreをforbidにするというのはありだとは思います。

プルリク来たときに変更お願いしやすいかも or そもそもunsafeじゃないコードをもらえやすくなるかも

個人的には明確かつ正しい内容のsafetyコメントが本当に書けて、かつUnsafe Rustに手を出す妥当な理由が存在するのであれば、unsafeなコードを含むプルリクを受け付けてもよいと思っています。その判断はむしろレビューの段階の方がよいのではないかと。最終的にunsafeなコードを拒否することになるにせよ、建設的な議論の末にそうなると信じています。


以上は短時間でざっと書いたものなので、必要であれば追加の補足をしたいと思います。

@Hiroshiba
Copy link
Member

なるほどです、詳しくありがとうございます!!

説明かコメントを求める方向が良いのかなと思いました!
少なくとも自分はunsafeに対する感覚を持てたので、レビュー時にunsafeに目を光らせられると思います。

クレート分離もなるほどです。
数が増えてきたら分離しても良いかもですね!たぶんOS依存のutilityっぽいコードになるでしょうし、まとまってた方がなんか便利そうなので。

unsafeな理由と、それでも大丈夫な理由はコメントに書く文化、取り入れていきたいなと感じました。
詳しくありです!!!

Copy link
Member
@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!!

unsafeなコードはなるべく避けてください、みたいなドキュメントってあった方がコーディングしやすくなる(というか説得しやすくなる)とかありますかね?
あれば貢献者ガイドラインに書き足してもよさそうかも。まあ書いてなくても普通にunsafeは避けれるなら避けるべきと案内できそうな気はしてます。

@Hiroshiba Hiroshiba merged commit 7afc276 into VOICEVOX:main Apr 15, 2024
@qryxip
Copy link
Member Author
qryxip commented Apr 18, 2024

クレート分離もなるほどです。
数が増えてきたら分離しても良いかもですね!たぶんOS依存のutilityっぽいコードになるでしょうし、まとまってた方がなんか便利そうなので。

OS毎というよりは、Linux版の実装と一緒にVOICEVOX/gpu-list-rsみたいな感じで分離という形がちょうどいいかなと思っています。

unsafeなコードはなるべく避けてください、みたいなドキュメントってあった方がコーディングしやすくなる(というか説得しやすくなる)とかありますかね?
あれば貢献者ガイドラインに書き足してもよさそうかも。まあ書いてなくても普通にunsafeは避けれるなら避けるべきと案内できそうな気はしてます。

問題になることがあるなら、極端なケースだと「次のC++コードをRustに翻訳してください」みたいな指示をもとにChatGPTかCopilotが生成したコードをそのままPRとしてお出しされたときですかね?そういう場合にも確かにガイドラインは効きそうではありますね。
(そこまで行くとどの道別ベクトルでしんどそうですが)

書くとしたら、「unsafeをそこまで忌避している訳では無い。ただし一般的なRustのプロジェクトと同様、本当に必要な時に限る。とりあえずRustonomiconTwo Kinds of Invariantsは読め。話はそれからだ」みたいな感じがいいかなと思っています。

@Hiroshiba
Copy link
Member

単純に初学者の方で、unsafeは避けるべきと知らなかったとかはありそうかもです。
まあ課題になってからドキュメントに書くか検討でも良さそう!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants
0