사실, 내 진짜 질문은 : 거기에 다음 코드에 표시된 라인 ("SIGABRT 원인") 뭐 잘못 :SIGABRT를 일으키는 Purify로 g ++에서 예외를 throw하는 것과 관련된 알려진 문제점이 있습니까?
char* myFunc(char *param) {
char* leaked = new char[80]; // Intentionally leaked
if (param == NULL) throw logic_error("Parameter was null!"); // Causes SIGABRT
strcpy(leaked, param);
// Missing return, but never gets this far, so should be okay.
}
void test_non_happy_myFunc()
{
try {
myFunc(NULL);
} catch (logic_error&) {
cout << "Test succeeded!" << endl;
return;
}
cout << "Test FAILED!" << endl;
}
int main()
{
test_non_happy_myFunc();
}
나에게 보낼 수있는 최소한의 테스트 케이스 마련하기 위해 노력하고있어이 IBM/Rational이 소프트웨어를 정제하는 데 문제가 있음을 증명하기 위해 SO에서 실행하고 있습니다. 커뮤니티 우선. 네, 의도적으로 2 번째 라인에서 메모리를 누출하고 있습니다. 그렇습니다. 예외가 던져 질 때 "누출 된"포인터가 단위 화 된 것입니다.
위의 코드는 일반적으로 g ++로 컴파일 할 때 purify 외부에서 실행되지만 purify 내부에서 실행하면 코어 덤프가 발생합니다. 위의 코드에서 신참 실수를 저 지르지 않았습니까 (SIGABRT를 제 잘못으로 작성 했습니까?) 또는 IBM/Rational Purify에서 손가락을 가리킬 수 있습니까?
편집 : (해명) 퓨리없이 명령 줄에서
실행 위의 완전한 프로그램 인쇄 : 퓨리의 내부
Test succeeded!
실행을 정화 보고서 :
COR: Fatal core dump
This is occurring while in thread 1299:
_p450static [rtlib.o]
abort [libc.so.6]
uw_init_context_1 [unwind-dw2.c:1256]
_Unwind_RaiseException [unwind.inc:88]
__cxa_throw [eh_throw.cc:78]
myFunc(char*) [exception_test.cc:9]
test_non_happy_myFunc() [exception_test.cc:17]
main [exception_test.cc:28]
선행 조건을 포함하면 9 번 줄이 내가 지정한 선이됩니다.
어떤 라인이 고장 났는지 어떻게 판단 할 수 있습니까? 또한, 나는 여러 해 동안 Purify를 사용하지 않았다. 그래서 어떻게 Purify 내부에서 컴파일하고 실행 하는가? 이미 본 적이없는 다른 코드의 모든 가능한 모든 문제를 제거하기 위해 위의 최소 버전 (예 :'main' 함수가'test_non_happy_myFunc')을 만들어 테스트했습니다. –
의견을 주셔서 감사합니다 - 위의 설명을 추가했습니다. 예, 실제로 위의 프로그램을 show (iostream, stdexcept 및 string.h의 include 포함)와 똑같이 실행할 수 있으며 외부 라이브러리 나 다른 코드를 연결하지 않고 설명 된 결과를 얻을 수 있습니다. 당신이 보는 것은 당신이 얻는 것입니다. –
언급하는 것을 잊었습니다. Purify는 cmd 행이나 Makefile의 link 명령에 "purify"를 선행하여 실행됩니다. 링크하는 동안 코드에 후크를 삽입합니다. 그런 다음 앱을 실행할 때 기본적으로 GUI 창을 불러와 코드가 실행될 때 잠재적 인 메모리 문제 목록을 누적합니다 (GUI를 시작하는 대신 stdout 또는 파일로 덤프하는 옵션이있을 수 있습니다)). –