2010-03-17 3 views
3

2010 CWE/SANS Top 25 Most Dangerous Programming Errors을 통해 읽었으며 항목 중 하나는 Buffer Copy without Checking Size of Input입니다. 그것은이 문제를 방지하거나 완화하는 기능을 가진 언어를 사용하여 제안, 다음과 같이 말한다 : 자바와 Perl과 같은 자신의 메모리 관리를 수행 Java와 C#의 메모리 관리는 어떻게 다릅니 까?

예를 들어

, 많은 언어는, 버퍼 오버 플로우에 적용되지 않습니다 . Ada 및 C#과 같은 다른 언어 인 은 일반적으로 오버플로 보호를 제공하지만 보호는 프로그래머가 비활성화 할 수 있습니다.

메모리 관리와 관련하여 Java와 C#이 의미있는 차이가 있다는 것을 알지 못했습니다. C#은 오버 플로우를 방지하는 반면 Java는 버퍼 오버 플로우의 대상이되지 않습니다. C#에서이 보호 기능을 해제하는 방법은 무엇입니까?

답변

4

java는 원시 포인터를 지원하지 않습니다 (엄밀히 말하면 포인터 연산을 지원하지 않습니다).

C#에서는 unsafe code and pointers 및 관리되지 않는 메모리를 사용할 수있어 버퍼 오버런을 일으킬 수 있습니다. unsafe 키워드를 참조하십시오.

유형의 안전과 보안을 유지하기 위해, C#을 기본적으로 포인터를 연산을 지원하지 않습니다. 그러나 unsafe 키워드를 사용하면 포인터를 사용할 수있는 안전하지 않은 컨텍스트를 정의 할 수 있습니다. 포인터에 대한 자세한 내용은 Pointer types 항목을 참조하십시오.

+0

+1 프로그래머의 관점은'unsafe' 키워드를 사용하여 보호 기능을 해제한다는 것입니다. 또한 IT 관리자의 관점에서 볼 때 ** 보안 정책을 통해 ** 응용 프로그램이 응용 프로그램을 보호하지 못하도록 방지 할 수 있다는 사실을 알고 있어야합니다. – MarkJ

+0

@ MarkJ : 좋은 지적. –

3

좋은 답변. 나는 자바가 스택이나 힙 메모리 위치의 사용에 의존한다고 덧붙였다. C#도 마찬가지입니다. 원시 포인터를 사용한다는 아이디어는 C 코드 배경에서 오는 C#에 대한 추가 사항입니다. C#과 C/C++는 동일한 코드 언어는 아니지만 몇 가지 공통점 의미를 공유합니다. "안전하지 않은"코드를 사용하면 가비지 수집으로 인해 성능이 크게 저하되지 않고 런타임 인스턴스 당 메모리가 약 2GB (CLR 당 C#, JVM 인스턴스 당 Java의 경우)로 제한되는 힙에 대형 객체를 보관할 필요가 없습니다. 어떤 경우에는 C#의 기능을 사용하여 안전하지 않거나 수동으로 관리되는 메모리 포인터를 활용하여 힙 외부에서 캐싱과 같은 문제에 대한 타사 도구가 거의 없다는 사실을 피할 수 있습니다.

안전하지 않은 코드를 사용하는 경우 "일회용 유형"및 "종료 자"에 익숙해 지도록주의하십시오. 이는 다소 진보 된 방법 일 수 있으며 객체를 올바르게 폐기하지 않는 것의 파급 효과는 C 코드와 마찬가지로 두려운 MEMORY LEAK입니다. 반향으로 인해 앱에 대한 추억이 없어지고 넘어집니다 (좋지 않음). 그래서 C#에서는 기본적으로 허용하지 않으므로 "안전하지 않은"키워드로 수동으로 제어되는 포인터의 사용을 무시해야합니다. 이렇게하면 수동으로 처리 된 메모리가 의도적으로 처리됩니다. "안전하지 않은"키워드를 다룰 때 C 코드 모자를 사용하십시오.

Andrew Troelsen의 "Pro C# 2010 and .Net Platform"의 "Understanding Object Lifetime"장을 참조하십시오. 온라인 참조를 선호하는 경우 MSDN 웹 사이트를 참조하십시오. Implementing Finalize and Dispose to Clean Up Unmanaged Resources

마지막 메모 - 관리되지 않는 메모리는 개체의 종료 자 부분 (~ ObjectName() {...})에서 해제됩니다.이러한 패턴은 성능에 오버 헤드를 추가하므로 대기 시간이 더 짧은 시나리오를 처리하는 경우 개체를 비추는 것이 가장 좋습니다. 인간의 반응을 다루는 경우에는 절대적으로 필요한 부분을 고려해야합니다.

관련 문제