짤곧내
[%] unsafe 이렇게 쓰면 괜찮냐
노이ㄴ(liliilli)
2020-07-28 23:11
추천 0
댓글 15
다른 게시글
-
님들 혹시 llvm 책좀 추천해줄 수 있음?[%] 익명(110.70) | 20.07.28추천 0
-
알고리즘 입문하기 좋은 영상[%] 익명(210.179) | 20.07.28추천 0
-
형들 파이썬에서 배열은 링크드 리스트가 아닌가오? [5][%] 익명(59.20) | 20.07.28추천 1
-
여기f#이나 함수형 잘하거나 현업에서 쓰는사람도있나 [3][%] 익명(175.223) | 20.07.28추천 1
-
c++기초플러스 관리 좆같이해서 반으로 갈라졌는데 어떡하냐 [6][%] 익명(119.205) | 20.07.28추천 0
-
개인적으로 c/c++ 시작할때 [2][%] 익명(223.62) | 20.07.28추천 1
-
spacemacs에서 json 사용하는 법 아는 사람 [4][질문] 익명(211.36) | 20.07.28추천 0
-
c++ go 타스 러스트중에 뭐부터 배울까 [6][%] 익명(175.223) | 20.07.28추천 0
-
깃헙갤 요새는 많이 활성화됫네 [2][%] 익명(110.70) | 20.07.28추천 0
-
c#을 왜 이제 알았지? [5][%] 익명(61.102) | 20.07.28추천 1
당장 UB 보이는데
https://doc.rust-lang.org/std/vec/struct.Vec.html#safety-1
unsafe를 떠나서 걍 C를 짜시는듯
winapi 직접 쓰는거 감안해도 uninitialized memory 넘 좋아하시는데
vector 의 set_len 말하는거?
ㅇㅇ 초기화 되지 않은 길이까지 설정하면 UB임
하나만 더 물어보고 싶은데 lcid 에 대한 MaybeUninit 은 그냥 없어도 됨? LCID 가 사실 u32 라서 lcid = 0 as LCID 하면 MaybeUninit 은 안써도 되는데, 문제는 이걸 WCHAR (u16) 포인터로 바꿔야함. 뭐 transmute 쓰라니 뭐니 있던데 인터넷 찾아보니까...
먼저 p_lcid 를 *mut LCID 로 해서 포인터 정의하고, 섀도잉 써서 p_lcid 를 cast 제네릭 함수 써서 WCHAR 로 형변환 하니까 되긴 하는데 이렇게 하는게 맞는거임?
글고 set_len 한건 FormatMessageW 에서 에러메시지에 대한 길이 빼다올 수 있는데, 그거 귀찮아서 일단 갈겨본거... UB인건 알겠으니 자고 일어나서 고치겠음
없어도되는데 &mut u32를 &mut u16로 바꿔야 한단거임?
ㄴㄴ *mut LCID(u32) 을 *mut WCHAR(u16) 으로. 일단 섀도잉 한거 말고 아예 이래고쳤음. let p_lcid: *mut WCHAR = {&mut lcid as *mut LCID}.cast::\<WCHAR>()
cast 메소드 as랑 똑같음
저게 꼭 필요하면 &mut lcid as *mut LCID as *mut WCHAR 하면됨
진짜네. 카면 왜 따로 cast 함수 만든거래 뭔가 사유가 있나
메소드가 있으면 뭐 map같은데 넣기 좋자너