POD를 상속한 후손의 assignment operator

최근 정적 분석 툴에 의해 다음의 코드에 문제가 있다는 통보를 받았다.
(실제 코드에서 문제점만 최대한 압축하였다)

struct A
{
int a;
};

class B: public A
{
public:
B& operator=(const B& ref);
};

B& B::operator=(const B& ref)
{
if (this == &ref)
return *this;

this->a = ref.a;

return *this;
}

대부분의 경우는 정적 분석 툴의 설명만으로 문제를 수정할 수 있었지만 이 경우는 도저히 어떤 문제가 있는 것인지 알 수가 없었다. 이 자체로는 문제 있는 것이 아니었기에 컴파일러의 warning level을 높여도 문제가 검출 되지 않았다.

그래서, 결국은 SE팀에게 분석을 요청했고 이 문제에 대한 명료한 대답이 돌아 왔다.




아래처럼 변수를 직접 대입하면 (현재는 문제가 없지만) 잠재적인 문제가 있기 때문에

this->a = ref.a;

다음과 같이 자동으로 만들어질 A의 default assignment operator를 불러야 한다고 한다.

A::operator=(ref);

반론을 찾기 위해 이래 저래 의심 나는 부분에 대해서 어셈블리어로 만들어서 분석해 보았는데, 위 같이 하면, 나중에 A가 어떻게 변하더라도 A만 제대로 구현하였다면 B의 assignment operator는 문제가 없는 것으로 확인되었다. 컴파일러가 알아서 저 부분의 코드를 그때 그때에 맞게 잘 변경 해 주었던 것이다.

Posted by 슴갈

2012/03/01 08:35 2012/03/01 08:35
Response
No Trackback , 2 Comments
RSS :
http://avej.com/textcube/rss/response/38

Trackback URL : http://avej.com/textcube/trackback/38

Comments List

  1. 용맨소녀 2012/04/24 12:57 # M/D Reply Permalink

    예전부터 생각해온건데 슴갈님 코드를 보면 뭔가 다른 랭귀지로 보이는...

    1. 슴갈 2012/05/01 22:25 # M/D Permalink

      왠지, 제 코드를 물려 받은 후배들이 힘들어 하던 게 다 이유가 있었군요. ^^

      이런 코드 이외에도 graphics 코드를 만드는 업무 특성상, generic algorithm을 써야할 경우가 많아서 template과 macro를 엄청 많이 쓰거든요. 그래서 몇몇 분들은 공개적으로 비판을 하곤합니다. (물론 다 제 귀에 들어 오거나 눈치를 채지만 저는 관대해서....)

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

블로그 이미지

GP2X WIZ와 CAANNO와 bada용 게임 개발을 하자

- 슴갈

Notices

Archives

Authors

  1. 슴갈

Recent Trackbacks

Calendar

«   2012/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

Site Stats

Total hits:
41806
Today:
32
Yesterday:
55