copy constructor 문제?!

정적 분석 툴에서 다음과 같은 코드의 copy constructor에서 잠재적인 문제점이 있다는 보고를 받았다. (코드는 핵심적인 부분만 남긴 것이다)

 

하지만, 이쪽 코드는 우리가 최근 수정한 적이 없기 때문에 다른 모듈에서 최근 새로운 용법이 생기면서 발생한 문제라고 판단하면서 문제 분석을 하였다.

 

 

class A

{

public:

    A(void);

    A(const A& ref);

 

    int m_val;

};

 

A::A(void)

    : m_val(0)

{

}

 

A::A(const A& ref)

{

    m_val = ref.m_val;

}

 

 

확인 결과, 보통은 문제가 없었지만 다음과 같은 형태의 코드가 추가되면서 잠재적인 문제점이 발생한 것이다. (역시 핵심만 추린 것이라 코드 자체의 로직에는 큰 의미가 없다)

 

enum AType

{

    TYPE_DEFAULT

};

 

A GetA(AType type)

{

    switch (type)

    {

    case TYPE_DEFAULT:

        return A();

    }

    // A를 사용하는 쪽에서 return 구문이 없다.

    // enum의 모든 case에 대해서 switch 문에서 처리하므로

    // 정적 분석툴에서는 문제 없는 것으로 인식 한다.

}

 

int main(void)

{

    A a = GetA(TYPE_DEFAULT);

    A b = a;

 

물론 위의 코드만으로는 아무런 문제가 없다. 하지만 누군가가 악의적으로 다음과 같이 사용했을 때가 문제가 된다.

 

    A a = GetA(AType(TYPE_DEFAULT+1));

 

이와 같이 강제로 enum에 정의되지 않은 것을 강제로 넣게 되면 GetA() A를 리턴하긴 하지만 생성자가 불리지 않은 A의 임시 객체를 리턴한다. 그렇게 되면 멤버 변수는 초기화 되지 않은 상태이고 A b = a; 에 의해 copy constructor를 통한 b를 생성한다. 이 때 m_val = ref.m_val; 부분을 지나가게 되는데 a는 초기화된 적이 없으므로 알 수 없는 값인 ref.m_valm_val를 초기화 하기 때문에 최종적으로는 A class copy constructor 문제라고 보고가 된다.


Posted by 안영기

2012/05/28 20:16 2012/05/28 20:16
Response
0 Trackbacks , 0 Comments
RSS :
http://smgal.ismine.net/tc_191/blog1/rss/response/41

Trackback URL : 이 글에는 트랙백을 보낼 수 없습니다

« Previous : 1 : ... 8 : 9 : 10 : 11 : 12 : 13 : 14 : 15 : 16 : ... 50 : Next »

블로그 이미지

게임 개발을 기반으로 한, 잡다한 개발 기록 저장소

- 안영기

Notices

Archives

Authors

  1. 안영기

Recent Comments

Recent Trackbacks

Calendar

«   2024/04   »
  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        

Site Stats

Total hits:
237086
Today:
47
Yesterday:
111