[project-vvm-async-api] output_
系引数がunalignedであることを許す
#534
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.
内容
C APIにおける
output_
系のポインタがunalignedであることを許可します。Rustの参照 (reference)は有効 (valid)であると同時にアラインメントに沿って (aligned)いなければなりません。そうでなければRustにおける未定義動作 (undefined behavior)となります。そのためC側から渡される生ポインタ (raw pointer)を参照として解釈するときは、アラインメントにも注意する必要があります。
Cの
const VoicevoxSynthesizer*
を&VoicevoxSynthesizer
として、VoicevoxSynthesizer*
をBox<VoicevoxSynthesizer>
として解釈するのにはアラインメント的な問題はありません。何故ならVoicevoxSynthesizer
を作れるのはVOICEVOX COREだけであり、ユーザーはVoicevoxSynthesizer
の実体に触れないようになっているため、「有効なVoicevoxSynthesizer
のポインタ」がRustの世界で生まれたalignedなものであると言えるからです。またconst char*
を&CStr
として読むときもアラインメントを気にする必要はありません。c_char
は1バイトだからです。しかしオブジェクトを"new"したり"create"したりする先の
T**
/*mut *mut T
は別です。ドキュメントを通じてユーザーにお願いしない限り、(T*)*
としてのアラインメントに沿わない (unaligned)ポインタが渡ってくる可能性があります。このPRではC APIの
output_
系の引数をalignedだと仮定せず、&mut
を経由しないように注意して<*mut T>::write_unaligned
で"new"/"create"対象を書き込むようにします。最初「unalignedなポインタをよこすな」というドキュメントを書けばいいと思っていたのですが、実際に #532 で書こうとしたら我々とユーザーの両方に面倒を生じさせることに気づいてしまいました。アラインメントを気にする必要があるのは
output_
系の引数だけなので、write_unaligned
する方が良いと思いました。関連 Issue
その他