HRESULT SomeFunc(...)
{
// ...
SIZE_T written;
std::vector<xch> buffer;
buffer.resize(MAX_BODY_CONTENT);
HRESULT hr = dn->ToBuffer((PVOID) &buffer[0], buffer.size(), &written);
if(!SUCCEEDED(hr))
return hr;
buffer[written] = '\0';
// ...
}
위와 같은 코드를 줬더니 그대로 사용해서 “buffer[written] = ‘\0′;” 구문에서 written이 MAX_BODY_CONTENT보다 크면 어쩌냐는 이야기를 했다. 그랬더니 dn->ToBuffer 함수가 실패한 경우에도 written에 값이 저장되냐는 둥, 소스가 더 커도 실제 크기가 written에 넘어오냐는 등의 질문을 한다.
dn->ToBuffer 함수가 어찌 동작하든 간에 if문 하나만 추가하면 안전해지는 문제 아니냐는 말을 했더니 기어코 소스 코드를 찾아내서는 그렇게 반환하는 경우는 없는것 같다고 궁시렁거리는 신입 프로그래머의 패기. dn->ToBuffer 함수가 내일 동작이 바뀌어서 그런 값을 반환하면 어쩔거냐고 했더니 그제서야 if문을 추가한다.
다른 함수에 불필요한 가정을 추가하지 말자. 불필요한 가정이 필요하다면 그 가정이 사실인지 반드시 확인하자 (ASSERT가 됐든 if가 됐든). 그리고 다른 함수가 정상 동작할 거라는 일말의 기대도 하지 말자.
돈을 받고 갈켜줘도 시원찮을 판에 월급 주며 갈켜주는데도 엉뚱 소리를 하니 속에 천불이 ㅠㅜ~
참 갑갑한 현실…
안개가 짙은 길을 주행할 땐 일단 서행하렴. 눈 앞에 갑자기 차가 나타날 수 있단다.
운전이나 코딩이나 방어가 중요하다는 거…