Hacker News인프라 · 데브옵스

Rust 개발자가 놀라는 C언어의 특이한 점들

원제 C for Rust programmers

114 포인트댓글 106
Key Point

Rust 개발자가 C 코드를 작성하거나 C 기반 시스템 프로그래밍에 진입할 때 마주치는 구체적인 함정과 설계 선택 차이를 파악할 수 있다.

핵심 요약

  • Rust를 먼저 배운 프로그래머가 C를 배우면서 마주친 언어의 차이를 설명하는 글이다.
  • C99 이전에는 불린 타입이 없었으며, C99에서 추가되었지만 true와 false는 매크로 정의일 뿐 C23에서야 진정한 원시 타입이 되었다.
  • Rust의 &str는 주소 8바이트와 길이 8바이트로 총 16바이트인 반면, C는 모든 문자열을 널 종료 바이트(\0)로 끝낸다.
  • C의 널 종료 방식은 별도 크기 변수를 유지할 필요가 없지만, 빈 문자열도 1바이트를 차지하고 메모리 할당 시 널 종료자 공간을 따로 확보해야 하며, 범위 외 읽기 위험이 있다.
  • C의 정수 타입(int, long 등)은 플랫폼마다 크기가다르다: long은 64비트 유닉스에서는 64비트, 윈도우에서는 32비트이므로 크로스플랫폼 호환성을 위해 의 uint32_t 같은 고정폭 정수를 권장한다.
  • C의 에러 처리는 -1이나 널 포인터 같은 '매직 넘버'를 반환하거나 errno 변수를 읽는 방식으로, Rust의 Result 강제성이 없어 malloc() 실패 같은 에러를 수동으로 확인해야 한다.
  • C는 private/public 같은 접근 제한자가 없어 프로그래머의 규칙 준수에만 의존하며, 타입 시스템으로 정확성을 보장할 수 없다.
  • C는 값 접근에 점(.), 포인터 접근에 화살표(->)를 사용하므로 Rust의 자동 역참조와 다르다.
  • 배열이 함수에 전달될 때 첫 번째 요소의 포인터로 암묵적 변환되어 sizeof()가 배열 크기가 아닌 포인터 크기(8바이트)를 반환하는 혼동을 야기한다.
  • C에는 Rust의 빌린 참조와 빌림 검사가 없어 포인터 연산이 자유로우며, 포인터 오류는 버퍼 오버플로우와 범위 외 쓰기 같은 심각한 보안 취약점으로 이어진다.
AI 요약 안내

AI가 한국어로 정리한 내용입니다. 정확한 정보는 원문을 확인해 주세요.

요약 원칙 ↗