2011-02-02 4 views
1

사실, 내 진짜 질문은 : 거기에 다음 코드에 표시된 라인 ("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 번 줄이 내가 지정한 선이됩니다.

+0

어떤 라인이 고장 났는지 어떻게 판단 할 수 있습니까? 또한, 나는 여러 해 동안 Purify를 사용하지 않았다. 그래서 어떻게 Purify 내부에서 컴파일하고 실행 하는가? 이미 본 적이없는 다른 코드의 모든 가능한 모든 문제를 제거하기 위해 위의 최소 버전 (예 :'main' 함수가'test_non_happy_myFunc')을 만들어 테스트했습니다. –

+0

의견을 주셔서 감사합니다 - 위의 설명을 추가했습니다. 예, 실제로 위의 프로그램을 show (iostream, stdexcept 및 string.h의 include 포함)와 똑같이 실행할 수 있으며 외부 라이브러리 나 다른 코드를 연결하지 않고 설명 된 결과를 얻을 수 있습니다. 당신이 보는 것은 당신이 얻는 것입니다. –

+0

언급하는 것을 잊었습니다. Purify는 cmd 행이나 Makefile의 link 명령에 "purify"를 선행하여 실행됩니다. 링크하는 동안 코드에 후크를 삽입합니다. 그런 다음 앱을 실행할 때 기본적으로 GUI 창을 불러와 코드가 실행될 때 잠재적 인 메모리 문제 목록을 누적합니다 (GUI를 시작하는 대신 stdout 또는 파일로 덤프하는 옵션이있을 수 있습니다)). –

답변

1

위의 코드에서 myFunc의 return 문이 누락 된 것을 제외하고는 아무 것도 잘못 표시되지 않습니다. 그러나 다른 사람 (특히 널리 사용되는 코드)이 코드에 책임을 부여하기 전에 나는 이보다 나쁜 일이 없다는 것을 두 번 확인했습니다. (UB 데몬을 호출 한 무언가가 백만 가지의 명령을 수행하기 전에 여전히 가능할 수도 있습니다. 보이는 효과).

메인 코드가 단지 test_non_happy_myFunc이고, 커스텀 글로벌 할당 자 같은 멋진 요소가없는 경우에만 문제가 계속 표시됩니다 (예 : 순도, 컴파일러 등). 100 % 긍정적 인 전에 멈추지 말고 문제가 있습니다.

+0

그것은 실제로 내가 한 일입니다.우리는 test_non_happy_myFunc()를 호출하는 간단한 테스트 케이스가 생길 때까지 충돌을 일으키는 것을 좁혀 냈습니다. 위에서 본 것처럼. 원래 게시물에 더 많은 설명을 추가하겠습니다. –

관련 문제