[project-vvm-async-api] ZSTにポインタキャストして提供するのをやめる #512
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
内容
現在project-vvm-async-apiでは
VoicevoxSynthesizer
などの型はZST(Zero Sized Type)として.hに載せ、Rust側ではポインタのキャストを行っているという状態になっています。これをやめ、repr(Rust)にしてポインタのキャストをやめます。さらにこれによりC側に提供される型は正しくopaqueになり、
次のコードのコンパイルは拒否されるようになります。
以下はこのPRを作るのを決断した理由です:
ZSTにポインタキャストするのはC→Rustのときでは?
そもそもqwertyさんが何故ZSTにわざわざポインタのキャストをしていたのですが、RustではCの型をRustに持って来るときに1861-extern-typesの代用としてZSTを使うという慣習があり、私が思うにおそらくそれに則ったのではないでしょうか。
しかしRustの型をCに提供する際にはそのようなことはしなくていいはずです。Rust側はRustで定義された型のレイアウトは当然知っていいはずだし、C側に対しても上記のようにレイアウトは完全に隠蔽できます。
*const (impl Sized)
/*mut (impl Sized)
はFFI-safeであるはず*const T
/*mut T
をC側に提供するときに、T
を#[repr(C)]
にする必要はないと思います。cbindgenを作っている人達もそう考えているはずだし、 shepmaster氏(Stack OverflowのRustの質問への回答で頻繁に見るカービィアイコンの人)が書いたThe Rust FFI Omnibusでも普通にrepr(Rust)な型のポインタをC側に提供しています。
C++ではZSTは許容されない
次のコードはCでは
0
となり、C++では1
となります。(ちなみにGCCやLLVMではCでも
sizeof(void) == 1
です)関連 Issue
その他