comp.lang.c ++. moderated에서 C ++에서 기본적으로 디버그 빌드에만 존재하는 어설 션이 프로덕션 코드에 유지되어야하는지 여부에 대한 논의가 진행되고 있습니다.
물론, 여기 내 질문은 각각의 프로젝트는 고유 하지 너무 많은 여부를 주장 보관해야 하지만, 어떤 경우에 이 추천 / 안 좋은 생각이다.
주장으로, 나는 의미한다 :
- 거짓 인 경우 소프트웨어의 버그를 나타내는 조건을 테스트하는 런타임 검사.
- 프로그램이 정지되는 메커니즘 (정말 최소한의 정리 작업 후).
나는 반드시 C 또는 C ++에 대해 이야기하지는 않습니다.
내 자신의 의견은 프로그래머이지만 데이터를 소유하지 않는 경우 (대부분의 상용 데스크톱 응용 프로그램의 경우) 실패한 어설 션에 버그가 표시되어 계속하지 말아야한다는 점입니다. 버그로 인해 사용자 데이터가 손상 될 위험이 있습니다. 이렇게하면 발송하기 전에 테스트를 강하게 수행하고 버그를보다 눈에 잘 띄게하여 쉽게 찾아 수정할 수 있습니다.
당신의 의견 / 경험은 무엇입니까?
건배,
칼
관련 질문을 여기에서보십시오
응답 및 업데이트
그레이엄,
어설 션은 오류이며 순수하고 단순하므로 하나처럼 처리해야합니다. 릴리스 모드에서 오류를 처리해야하므로 어설 션이 실제로 필요하지 않습니다.
그래서 어설 션에 대해 이야기 할 때 "버그"라는 단어를 선호합니다. 훨씬 명확 해집니다. 나에게 "오류"라는 단어는 너무 모호하다. 누락 된 파일은 버그가 아니라 오류이며 프로그램에서 처리해야합니다. 널 포인터를 역 참조하려고하는 것은 버그이며 프로그램은 나쁜 치즈 냄새가 나는 것을 인정해야합니다.
따라서 어설 션을 사용하여 포인터를 테스트해야하지만 정상적인 오류 처리 코드가있는 파일이 있어야합니다.
주제를 약간 벗어 났지만 토론에서 중요한 점입니다.
실패로 어설 션이 실패 할 때 어설 션이 디버거에 침입하는 이유는 무엇입니까? 그러나 코드가 완전히 제어 할 수없는 파일이 존재하지 않는 많은 이유가 있습니다 : 읽기 / 쓰기 권한, 디스크 가득 참, USB 장치 연결 해제 등. 제어 할 수 없기 때문에 어설 션이 있다고 생각합니다. 그것을 처리하는 올바른 방법이 아닙니다.
칼
도마,
예, Code Complete가 있으며 해당 특정 조언에 강력히 동의하지 않는다고 말해야합니다.
사용자 지정 메모리 할당자가 나사를 조이고 다른 개체에서 여전히 사용중인 메모리 덩어리를 0으로 만듭니다. 나는이 객체가 정기적으로 역 참조하는 포인터를 제로화하고 변하지 않는 것 중 하나는이 포인터가 결코 null이 아니라는 것입니다. 그런 식으로 유지되도록 몇 가지 주장이 있습니다. 포인터가 갑자기 null 인 경우 어떻게해야합니까? 당신은 주위에 if ()가 작동하기를 바라고 있습니까?
여기서 제품 코드에 대해 이야기하고 있으므로 디버거를 중단하고 로컬 상태를 검사하지 않습니다. 이것은 사용자 컴퓨터의 실제 버그입니다.
칼