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
0 Trackbacks , 2 Comments
RSS :
http://smgal.ismine.net/tc_191/blog1/rss/response/38

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

« Previous : 1 : ... 6 : 7 : 8 : 9 : 10 : 11 : 12 : 13 : 14 : ... 46 : Next »

블로그 이미지

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

- 안영기

Notices

Archives

Authors

  1. 안영기

Recent Trackbacks

Calendar

«   2017/12   »
          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:
159800
Today:
5
Yesterday:
7