Windows ARM 환경에서 Rust/C 코드 충돌, 원인은?

by DD
1개월 전
조회수 10

Windows ARM 환경에서 Rust, C, 빌드 시스템 설정 관련 문제 발생

mimalloc의 compare-and-exchange 연산 오용으로 인한 충돌 발생

RO 메모리(Read-Only Memory)에 대한 쓰기 시도가 문제의 핵심 원인으로 지목됨

크로스 플랫폼 빌드 설정(Cross-Platform Build Configuration)의 어려움과 ARM 환경의 특수성 강조

mimalloc의 compare-and-exchange 오용

lelanthran의 댓글에 따르면, mimalloc에서 compare-and-exchange 연산(Compare-and-Exchange Operation)을 잘못 사용하여 문제가 발생했다. 특히, RO 메모리(Read-Only Memory)에 동일한 값을 다시 쓰는 행위가 ARM64 아키텍처에서 문제를 일으켰다. 이는 compare-and-exchange가 단순한 읽기가 아닌 원자적 읽기-수정-쓰기 연산(Atomic Read-Modify-Write Operation)이기 때문이다. 이러한 동작은 예상치 못한 충돌을 유발할 수 있다.

타입 시스템(Type System) 우회 시 발생 가능한 문제

lelanthran은 const 키워드를 무시하고 메모리에 직접 접근하는 행위가 문제의 근본 원인이라고 지적한다. 이는 C 언어에서 타입 시스템(Type System)을 우회하는 것과 유사한 문제를 야기한다. 즉, const char *text = "Hello World"; 와 같은 코드에서 *(char *)(text)[0] = 'h'; 와 같이 const를 무시하고 값을 변경하는 것은 예측 불가능한 동작(Unpredictable Behavior)을 초래할 수 있다. 이러한 행위는 코드의 안정성을 심각하게 저해한다.

크로스 플랫폼 빌드 설정의 어려움

Necessary-Summer-348의 댓글에서는 크로스 플랫폼 빌드 설정의 어려움을 강조한다. 특히, ARM 아키텍처(ARM Architecture)와 관련된 문제는 x86 환경을 기준으로 설계된 툴체인(Toolchain)의 가정(Assumption) 때문에 발생하기 쉽다. 이러한 문제는 로깅(Logging)을 추가하면 사라지는 경우가 많아 디버깅(Debugging)을 더욱 어렵게 만든다. 따라서, 다양한 플랫폼(Various Platforms)을 지원하는 빌드 시스템을 구축할 때, 각 플랫폼의 특성을 고려한 설계를 해야 한다.

Hunting a Windows ARM crash through Rust, C, and a Build-System configurations