수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1693864
  • Today | 215
  • Yesterday | 588

Programming/Win32 API2006/12/27 13:59

메모리 오류

고수닷넷 - 데미소다오렌지님

1. Introduction

활성화된 프로그램관련 질답 게시판을 보면 반복적으로 늘 올라오는 질문중의 하나가 메모리 오류에 관한 것 이다. 실무에 사용되는 대부분의 상용 프로그램들도 포인터/메모리 관련 코드들이 프로그램의 전체 오류의 90% 이상을 차지한다고해도 과언이 아니다. 실무 프로그램이 이정도니 처음 작성하는 사람들이 포인터 오류를 피한다는 것은 그야말로 힘들다고 할 수 있다. 또한 오류 상황을 보고 대처하는 방법을 모르기 때문에 더욱 난처한 경우가 많다. 아마도 그래서 질답 게시판에는 그렇게나 자주 뜬금없는 질문들이 많이 올라오는 것으로 보인다.

이 문서는 오류가 나는 코드를 살펴보고, 해당 코드가 실행될때 발생하는 오류를 알아 봄으로써 추후에 동일한 에러가 난 경우에 좀 더 빨리 디버깅 할 수 있는 능력 배양에 그 목적이 있다 하겠다... ㅎㅎㅎ~ 그럼 지금부터 처음 프로그램을 작성하는 분들이 자주 접하는 메모리 오류 상황에 대해서 살펴보도록 하자~

2. Heap overrun

첫번째는 메모리 영역을 넘어서 오버라이트 한 경우이다. 다음과 같은 코드를 생각할 수 있다.

void stupid_func(int *ar)
{
	memset(ar, 0, sizeof(int) * 200);
}

int main()
{
	int *ar = new int[100];
	stupid_func(ar);
	delete [] ar;
	return 0;
}

보면 100개를 할당하고 나서는 stupid_func에서 200개를 초기화 해버리고있다. 할당된 것 보다 더 많이 써서 오버라이트 되 버린 것이다. 디버그 중이라면 아래와 같은 ASSERT 진단 오류를 만날 수 있다.

3. Heap header overwrite

두번째로 할당된 메모리 이전 영역을 겹쳐쓰는 경우이다. 다음과 같은 코드를 생각할 수 있다.

void stupid_func(int *ar)
{
	memset(ar-100, 0, sizeof(int) * 200);
}

int main()
{
	int *ar = new int[100];
	stupid_func(ar);
	delete [] ar;
	return 0;
}

보면 할당이 시작된 주소 이전(ar-100)에서 부터 값을 채우기 때문에 라이브러리에서 내부적으로 사용하는 관리 헤더 부분을 초기화 시킬 수 있다. 디버그 중이라면 아래와 같은 ASSERT 진단 오류를 만날 수 있다.

4. More...

아래는 위의 것과 유사한 오류가 날 수 있는 더 많은 상황들을 정리해 보았다. 늘 항상 포인터를 다룰때에는 아래와 같은 점검 목록을 머릿속으로 생각하는 것을 게을리 하지 말아야 할 것이다.

  • malloc/free와 new/delete를 혼용해서 사용하는 경우. malloc으로 할당해서 delete로 지우는 경우 등이 해당한다.

  • delete/delete [] 혼용. delete는 단일 원소 삭제에, delete []은 배열 원소 삭제에 사용해야 한다. 이 둘을 잘못 사용해서는 안된다.

  • 할당된 포인터 값 변경. 100번지에 할당받아 놓고, delete나 free시에 200번지를 입력하는 경우다. 이런 경우는 대부분 할당 받은 포인터를 for루프등에 사용함으로써 발생한다. 할당받은 포인터는 절대로 값을 변경해서는 안된다. 값을 변경하고 싶으면 복사해서 임시 변수로 참고하도록 한다.

5. Conclusion

C++을 사용한다면 되도록 날(Raw) 포인터를 사용하지 않는 것이 좋다고 한다. 그리고 날(Raw) 포인터를 사용해야 한다면 그 놈이 사용되는 코드 주위는 항상 감시하도록 하자!

"Win32 API" 카테고리의 다른 글
  • 실행시 메모리 점유율 줄이기. (0)2006/12/29
  • 시스템 트레이 사용하기 (0)2006/12/29
  • 메모리 오류 (0)2006/12/27
  • 파일 버전 구해서 비교하기... (0)2006/12/08
  • 재밌는 시스템 강제로 다운시키기 (0)2006/12/08
2006/12/27 13:59 2006/12/27 13:59
Posted by webdizen
Tags 메모리 오류
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/2525

Leave your greetings.

[로그인][오픈아이디란?]

«Prev  1 ... 717 718 719 720 721 722 723 724 725 ... 3009  Next»

RSS HanRSS
Blog Image
webdizen
이곳은 컴퓨터에 대해 연구하고, 공유하고, 소통하기 위한 연구실입니다. 개인적으로는 OLAP, Data Mining, Semantic Web, Data Modeling에 대해서 연구하고 있습니다.

Categories

전체 (3009)
Webdizen (141)
Life (6)
Diary (16)
Blog (9)
IDEA (2)
Travel (10)
Book (16)
Photo (7)
Movie (8)
Music (14)
Leisure Sports (10)
Funny (6)
Hardware (121)
Software (120)
Windows (5)
Unix & Linux (120)
Installation (5)
Kernel (10)
System (34)
Develop (22)
X-Window (0)
Applicaton (31)
Security (4)
Framework (2)
Hadoop (2)
Programming (804)
Algorithm & Data Structure (1)
Assembly (38)
UNIX/Linux C (95)
C++ (128)
STL (4)
Java (38)
Win32 API (92)
ATL/COM (44)
MFC (151)
.NET (26)
WCF/WPF (4)
C# (28)
Network Programming (17)
Database Programming (12)
OpenGL / DirectX (13)
Multimedia Programming (0)
Game Programming (21)
Parallel Distributed Progra... (0)
Reverse Engineering (0)
Debugging (9)
Python (1)
Ruby (1)
Ruby on Rails (1)
QT (4)
GTK (0)
JSP (0)
PHP (6)
ASP.NET (6)
ASP (2)
Development (28)
Useful Library (2)
Data Modeling (0)
Database (105)
Oracle (4)
MSSQL (41)
MySQL (2)
Data Warehouse (2)
Data Mining (4)
Network (66)
Web (79)
DHTML (4)
XHTML (1)
Javascript (1)
CSS (1)
AJAX (9)
XML (11)
Flex (1)
Silverlight (3)
Security (91)
DoS (1)
Kernel (10)
Scanning (3)
Sniffing (0)
Spoofing (4)
Overflow (28)
Web (11)
Shell (10)
Format String (14)
Window (2)
Embedded (70)
Multimedia (27)
Mobile (14)
Graphic (24)
Management (633)
Knowledge (581)
Hadoop (0)

Notice

  • 메타 블로그 사이트에 등록
  • 새해 맞이 블로그의 변화
  • 블로그 명칭 변경
  • 도메인(www.webdizen.net) 구...
  • TEXTCUBE 1.6.1로 업그레이드...

Tags

  • Objects
  • DOM
  • Windows Server 2008
  • 세계맥주
  • breakpoint
  • Algorithm
  • 투명한 비트맵
  • ASP
  • 강원대학교 후문
  • 잠금
  • EnumDisplaySettings
  • VisualUnitTest++
  • Data Access
  • 다트
  • 프린트 다이얼로그
  • 해네시 VSOP
  • 함수 포인터
  • Ontology
  • 누리캅
  • 야후

Recent Articles

  • 트위터(Twitter)의 시작!.
  • 청년 리더의 조건.
  • 애플의 타블렛 PC - 아이패드....
  • 미래의 인터페이스 - 육감 기....
  • 기초발성법 동영상 강좌.

Recent Comments

  • 학교 과제물중 쓰레드에 대하....
    장진혁 03/17
  • 관리자만 볼 수 있는 댓글입....
    비밀방문자 03/12
  • 상대방의 이야기를 열심히 경....
    DoNuts 03/03
  • Lots of students know techn....
    Bobbi35Shannon 02/25
  • 좋은글 잘 보고 갑니다..
    Und_hacker 01/08

Recent Trackbacks

  • printf,scanf를 이용한 형식....
    yundream의 프로그래밍 이야기 03/10
  • 파일 열기/저장하기 CFileDialog.
    은마군의 나태블록 2009
  • World IT Show 2008.
    상우 :: Oranzie's BLOG 2008
  • cvs서버 설치하기.
    3인3색 2008
  • 속속 공개되는 Google Chart....
    PHP와 Web 2.0 2007

Archive

  • 2010/02 (1)
  • 2010/01 (6)
  • 2009/12 (5)
  • 2009/09 (3)
  • 2009/08 (1)

Calendar

«   2010/03   »
일 월 화 수 목 금 토
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

Bookmarks

    • Administration
      • IIS.NET
      • NTFAQ
      • OS의 모든 것
      • 리눅스포털
    • Database
      • SQL Server Central
      • SQL Team
    • Development
      • .NET Heaven
      • ASP Alliance
      • ASP.NET 2.0
      • Bullog.net
      • C# Corner
      • C++ (C PlusPlus.com)
      • C++ Reference
      • CodeGuru
      • CodePlex
      • DebugLab
      • Dev Articles
      • Devpia
      • DotNet Junkies
      • DotNet Zone
      • Driver Online
      • GOSU.NET
      • HOONS 닷넷
      • Joinc 팀블로그
      • KOSR
      • MSDN Home Page
      • OSR Online
      • Sky.ph - 개발자 커뮤니...
      • TAEYO.NET
      • The Code Project
      • WindowsClient.net
      • 김상욱의 개발자 Side
      • 조인시 위키
    • Human Networks
      • belief21c's e-space
      • I think I can
      • Invisible Rover's Blog :D
      • Rodman®
      • ■ Feel So Good~! ■
      • 까만 나비
      • 나를 가꾸는 시간.
      • 나만의 즐거움~~!
      • 단녕
      • 상우 :: Oranzie's BLOG
    • Information Technology
      • Microsoft TechNet
      • 지디넷코리아 - 글로벌...
    • Security
      • FoundStone
      • milw0rm
      • NewOrder
      • OpenRCE
      • Phrack.org
      • Reverse Engineering b1...
      • Reverse Engineering Team
      • RootKit
      • SecurityFocus
      • SecurityXploded by Nag...
      • Wow Hacker
      • Zone-H
Textcube
Louice Studio Inc.
Powered by Textcube. Original designed by Tistory.