-
Notifications
You must be signed in to change notification settings - Fork 13
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
Static checking via feature(const_generics)
and feature(const_evaluatable_checked)
#471
Comments
추가: 위와 같은 const assert를 이용하면 Lock order을 강제할 수 있을 것 같습니다. pub struct Lock<const ORDER: usize, T> { /* Omitted */ } |
//! Types that let you compile-time assert in `where` clauses,
//! especially about the input generic parameters.
//!
//! # Example
//! ```rust,no_run
//! # use core::mem;
//! #![feature(const_generics)]
//! #![feature(const_evaluatable_checked)]
//!
//! unsafe fn transmute<T, U>(t: T) -> U
//! where
//! Assert2<
//! { mem::size_of::<T>() == mem::size_of::<U>() },
//! { mem::align_of::<T>() == mem::align_of::<U>() },
//! >: True
//! {
//! /* Omitted */
//! }
//! ```
pub struct Assert<const EXPR: bool>;
pub struct Assert2<const EXPR: bool, const EXPR2: bool>;
pub struct Assert3<const EXPR: bool, const EXPR2: bool, const EXPR3: bool>;
pub trait True {}
impl True for Assert<true> {}
impl True for Assert2<true, true> {}
impl True for Assert3<true, true, true> {} |
|
@travis1829 태우님 안녕하세요, 오랜만입니다 ㅎㅎ 혹시 여유시간이 잠깐 있으시다면, 이 이슈 한번 봐주실 수 있으실까요? 바쁘고 힘든 시기임을 잘 알고 있으니 어렵다면 편하게 알려주세요. |
@jeehoonkang 결론만 말씀드리자면, 기존에 PR#489를 close without merge했던 이유를 완전히 해결하기는 아직 힘들어보입니다. ex) (where 부분 추가) pub fn as_uninit_mut<T>(&mut self) -> &mut MaybeUninit<T>
where
[u8; PGSIZE - mem::size_of::<T>()]:, // We need mem::size_of::<T>() <= PGSIZE
[u8; PGSIZE % mem::align_of::<T>() + usize::MAX]: // We need PGSIZE % mem::align_of::<T> == 0
{
//...
} Rust blog 등을 확인해보면, 아직은 위 예처럼 array length부분 등을 이용해 검사를 해보기를 권고하는 것 같습니다. 또는 다음과 같이 자동으로 impl되는 trait을 추가해서 해결할수도 있습니다. pub fn as_uninit_mut<T: FromPage>(&mut self) -> &mut MaybeUninit<T> {
//...
}
/// This trait is auto-implemented for types that suffice the following.
/// * mem::size_of::<T>() <= PGSIZE
/// * PGSIZE % mem::align_of::<T>() == 0
pub trait FromPage {}
impl<T> FromPage for T
where
[u8; PGSIZE - mem::size_of::<T>()]:, // We need mem::size_of::<T>() <= PGSIZE
[u8; PGSIZE % mem::align_of::<T>() + usize::MAX]: // We need PGSIZE % mem::align_of::<T> == 0
{} 이런식으로 하면 이전 PR때처럼 module을 새로 만들거나 |
타입 매개변수를
const_assert!
안에서 사용할 수 없습니다. 이로 인해const_assert!(mem::size_of::<T>() <= PGSIZE)
와 같은 코드를 작성할 수 없고, 어쩔 수 없이assert!(mem::size_of::<T>() <= PGSIZE)
를 사용합니다.우회책으로는 #468 (comment) 에서 언급한 것처럼
feature(const_generics)
와feature(const_evaluatable_checked)
를 사용하는 방법이 있습니다. 그러나 이 방법을 사용하면 지금은 rv6 컴파일 시에 컴파일러가 패닉합니다.이후에 컴파일러가 업데이트되어 패닉하는 문제가 해결되면
assert!
를 없애고 컴파일 시간에 검사가 이루어지도록 수정해야 합니다.The text was updated successfully, but these errors were encountered: