2010/03/31 20:23

   윈도우 모바일 프로그램을 만들면서 유심카드의 핸드폰 번호를 가져오는 함수가 필요했다. 어찌 코드를 긁어오기는 했는데 아래와 같이 에러가 난다.

포인터와 고정 크기 버퍼는 안전하지 않은 컨텍스트에서만 사용할 수 있습니다.

   안전하지 않은 컨텍스트가 뭔지 고민하다가 에러 내용을 검색해보니 리턴형 앞에 unsafe 를 넣어주면 해결 되는 일이었다. 문제는 해결했지만 왠지 찝찝한 기분- 그렇다. 나는 unsafe 가 어떤 키워드인지 잘 모른다. C#을 책을 차근차근 보며 제대로 공부한 것이 아니라, 입사 후 바로 이 처음 만지는 언어로 어떻게든 결과물을 내놓으라 하니 인터넷과 회사 동료분들께 의지해서 꾸역꾸역 사용해왔기 때문이다.

   몰라서 틀리는 건 어쩔 수 없다. 하지만 같은 걸 또 틀리는 건 있을 수 없다. unsafe가 대체 무엇이기에 문제가 해결 되었던 것인지! 알아보아야 겠다.

unsafe ?

  C#에서는 형식 안전성과 보안을 유지하기 위해 기본적으로 포인터 산술 연산을 지원하지 않습니다. 그러나 unsafe 키워드를 사용하면 포인터를 사용할 수 있는 안전하지 않은 컨텍스트를 정의할 수 있습니다.

   CLR(공용 언어 런타임)에서는 안전하지 않은 코드를 비안정형 코드라고 합니다. C#에서 안전하지 않은 코드는 항상 위험한 것만은 아닙니다. 이는 단지 CLR에서 그 안전성을 확인할 수 없는 코드를 의미합니다. 따라서 CLR에서는 안전하지 않은 코드가 완전히 신뢰할 수 있는 어셈블리에 포함된 경우에만 이 코드를 실행합니다. 안전하지 않은 코드를 사용하는 경우 이 코드로 인해 보안상의 위험이나 포인터 오류가 발생하지 않도록 하는 것은 사용자의 책임입니다. (링크 : MSDN )

  간단히 말하면 "원래 C#에서는 포인터를 지원하지 않지만 unsafe를 쓰면 포인터를 허용해주고 그 대신 포인터에 의해 생기는 문제는 책임지지 않는다" 라고 할 수 있겠다. 고로- C#에서 포인터를 쓰려면 unsafe 를 꼭 써주어야 하는 모양이다.
Posted by 보댕