그래서 방금 대형 서버 응용 프로그램의 여러 시간 디버그 세션을 완료했습니다. 오류는 결국 생성자에서 거의 눈에 띄지 않는 오타가되었습니다. 기본적으로 다음과 같이 나타납니다.내 이니셜 라이저 목록에 작은 오자가있어 말할 수없는 고통을 초래합니다.
template <class T>
class request_handler
{
public:
request_handler(T& request, Log& error_log)
: m_request(m_request), m_error_log(error_log)
{
/*... some code ... */
}
...
};
버그를 확인 하시겠습니까? 글쎄, 나는하지 않았다. 문제는 이니셜 라이저 목록의 작은 오타입니다 : m_request(m_request)
은 자체에 초기화되지 않은 참조를 할당하고 있습니다. 분명히 m_request(request)
을 읽어야합니다.
이제 구성원 변수 m_request
은 T&
입니다. 그래서 - 여기 컴파일러가 초기화되지 않은 변수를 사용하고 있다고 경고하지 않은 이유가 있습니까? -Wall
플래그 GCC 4.6을 사용
, 내가 말한다면 :
int x;
x = x;
이 ... 그것은 경고를 발행합니다 : 컴파일러하지 않은 이유, 그래서 warning: ‘x’ is used uninitialized in this function [-Wuninitialized]
을 나는 할당 할 때 저를 경고 본질적으로 자체에 초기화되지 않은 참조를 할당하는 것 : m_request
? 그것은 나에게 성가심을 구해줬을 것이다.
전체 최적화 (-O3)를 사용하여 컴파일 했습니까? 컴파일러는 실제로 데이터 흐름 분석을 수행 할 때 이러한 실수 중 일부만 인식합니다. m_ 접두사를 삭제하는 것도 고려하십시오. 'foo (T bar) : bar (bar)'는 완벽하게 잘 정의되어 있습니다. – xDD
처음에는 최적화로 컴파일하고있었습니다. 하지만 디버깅하는 동안, 나는'-g3' 플래그로 컴파일하고 있었기 때문에 디버거를 사용할 수있었습니다. 'g3' 플래그로도 경고를 내지 못했습니다. – Channel72
나는'-g3'이 어쨌든이 경고를 일으키는 것을 기대하지 않을 것입니다. – xDD