'c#'에 해당되는 글 1건

  1. 2005/10/27 버그는 이 안에 있다!!!
프로그래머라면 항상 느끼겠지만 무슨 프로그램을 짜든간에 bug는 항상 있다.

정신세계가 아주 정상적인 프로그래머라면 스스로 버그를 만들어내 익스트림한 상황을 만들어 즐기는 일은 절대 안할 것이다-_-);

하지만 프로그래머가 의도하지 않게 버그는 어디서든지 발생하며 이곳저곳에 기생해서 점점 자신의 위력을 확산해 나가기도 한다_-_)

그런 상황을 보면 버그는 bug가 아니라 virus라는 생각이 든다.

간단한 예로 아래 코드를 봐보자.


#include

int main(void)
{
string strTmp;

strcpy(strTmp.c_str(), "aaaa");

cout << strTmp.c_str();
}


위의 코드가 동작할 것이라고 생각하는가?

답은 운이 좋으면 동작하고 그렇지 않으면 memory violation에러를 보게 될것이다.

하지만 운이 좋아서 동작을 한다는것이 절대 행운은 아니다.
이게 바로 재앙이 될 가능성이 100%이기 때문이다.

navite 언어로 작성을 한 프로그램 같은 경우에는 스택을 깨거나 널 포인터를 액세스하거나 잘못된 포인터를 이용해서 무엇을 하는 경우에 그 당시의 그런 문제를 검출 할 방법이 없다.

위에서 보이는 코드의 경우에도 오히려 그 즉시 메모리 에러가 나면 무엇이 문제인지 바로 알수 있다..
하지만.. 세상일은 언제나 내 뜻대로 안되는 것과 마찬가지로 저 코드가 실행 후 정상적(?)으로 흐름이 넘어갔다고 해도..

언제 어디서든지간에 이미 꼬여버린 메모리 때문에 엉뚱한곳에서 프로그램이 죽을 수 있다.

이런 경우에는 정말 쉣이 되는 경우이다-_-

이럴때는 어디서부터 문제인가 콜 스택을 뒤적이며 문제가 되어 보이는 모든곳에 로그를 찍도록 남기든가 해야하는 짓을 해야한다..

그렇게 추가적인 작업을 해서 문제를 바로 발견하면 좋으련만...
대부분의 경우에는 내가 창조한 버그는 그렇게 호락호락하게 얼굴을 내밀지 않는다-_-

하지만 managed가 되는 언어들(java, cs, vb등)의 경우에는 저런식의 오류가 발생하면 바로 예외가 던져지기 때문에 간단히 콜 스택만 뒤적여도 바로 문제점을 찾을 수 있다. 이 얼마나 행복한 일인가!!!

native 코드만 다루었던 나의 경우에는 최근에 managed가 되는 cs를 사용하면서 매우많이정말 편함을 느끼고 있다.

다만 포인터가 없다고 말하던 cs에도 엄연히 포인터가 있다-_-

아래의 코드를 봐보자


using System;
using System.Collections;

namespace aaa
{
public void Blah()
{
string strTmp = null;

int.Parse(strTmp);
};


위의 코드를 실행했을 경우 null 참조 에러가 난다...

-_-

뭐시 포인터가 없단 말이냐!!!

엄연히 cs에도 null이라는게 존재 하는한 이는 포인터로 봐도 될것 같다. 물론 실제 포인터 처럼 메모리의 주소를 기억 하거나 하는게 아니라서 포인터를 이용한 꽁수를 부릴수는 없지만 그래도 포인터와 비슷하게 참조되는 데이터를 가지고 값을 변경하면 이를 가지고 있는 다른 변수들도 같이 값이 변한다.

뭐 쓰다보면 익숙해지겠지..

사실은 이말을 하고 싶은게 아니였는데..-_-);

이 글을 쓰는 이유는 다름이 아니라 오늘 기존에 작성되어있는 자바스크립트를 새롭게 수정해서 적용시킬려고 분석을 하는 도중...

참으로 어이없는 것 때문에 2시간을 날린 것 때문이다..

height*i+1

위 코드가 그 문제의 코드이다.

결론부터 말하자면 저기 붙은 +1을 때니까 내가 원하는 결과가 나왔다.

주석이라도 있었으면...........

뭐 덕분에 이런저런 공부도 했지만..
그리고 이바닥이 삽질 인생이라는 것도 알고 있지만..

그래도...-_-);

ps1. 그나저나 cs를 내가 아직 잘 몰라서도 그렇지만 c++에 있는 stl보다 데이터 컨테이너들이 사용하기가 영 시원치 않다. 성능은 모르겠지만(그다지 좋다고는 생각하지 않지만) 사용하기가 매우 까다롭다. stl에서 지원하는 일관적인 데이터 어댑터, 순방향 순회, 역방향순회 같은게 없는것 같다.. 그렇지만 이것은 좋더라... 디버깅 할때 그런 컨테이너 안에 들어있는 데이터를 디버거에서 바로 볼수 있다는 것이 말이다..-_-

ps2. 오히려 저런 언어보다는 managed c++가 더 편하고 할수 있는게 많은것 같다. 메모리 누수는 일어나지 않겠지만 소멸자가 없기 때문에 조금 불편하다..
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2005/10/27 21:21 2005/10/27 21:21