2011-04-26 8 views
8

Parasoft C++test을 사용하여 코드를 정적으로 분석합니다.Parasoft C++ 테스트에서 혼란스러운 제어 흐름 분석

그것은 *x; 줄에 경고
void foo(int* x) { 
    try { 
     bar(); 
    } catch(...) { 
     delete x; 
     throw; 
    } 

    *x; 
} 

가 :

이 는

해제 된 메모리는 이후

어떻게 든 어떤 상황에서도 액세스 할 수 없습니다해야 는 결론을 내렸다의 IT는 다음과 같은 코드에 문제가있어 해당 제어 흐름이 catch(...) 블록으로 전달되고 x을 삭제하고 throw;을 지나서 *x;으로 변경하십시오. 나는 throw std::exception("");와 몇 개의 다른 것을 시험해 보았고, 같은 물건을 얻었다. Parasoft는 예외 검사를 포함하는 많은 다른 검사가 있기 때문에 예외에 대해 확실히 알고 제어 흐름에 반영합니다. 이 경우 혼란 스럽습니까? 아니면 실제로이 프로그램을 실행하기위한 어떤 방법이 delete x;*x;에 모두 충돌합니까?

+0

혼란스러워 보이는군요. –

+0

나는 혼란 스럽다고 말하고 싶지만 Parasoft에게 문의해야합니다. 나는 또한 당신이 이와 같은 실제 코드를 가지고 있다면 잘못을 저지르고 있다고 말하고 싶습니다. –

+0

'delete x;'를 인라인 메서드로 추출 할 수 있습니까? 아니면 Parasoft도 거기를 들여다 볼 것을 알고 있습니까? – quamrana

답변

0

아마 이것은 대단한 제안이지만 Parasoft가 종료를 위해 캐치를 나가면 뭐라고 말할까요? 나는.

void foo(int* x) 
    { 
    try 
    { 
    bar(); 
    *x; 
    } 
    catch(...) 
    { 
    delete x; 
    throw; 
    }  
    } 

난 당신이 foo는의 다른 단계에서 다른 처리로 잡을 수있는 다양한 예외 유형이있는 경우 즉, 예를 들어, 진술, 그리고 예외의 모든 조합에 대해 작동하지 않을 수 있습니다 실현,하지만 적어도 그것은 당신에게의 시작을 줄 수 있습니다 경고를 없애고 싶다면 일시적인 해결책이 될 수 있습니다.

+0

요점 : – sehe

+1

문제를 해결한다면 요점은 아닙니다. 필자는 Parasoft의 분석 도구로 명백하게 잘못된 결론을 무시하는 경향이 있습니다. –

+0

나는 의견을 초. 코드를 변경하여 잘못된 경보를 해결하기 시작하면 버그가 발생합니다. 그것은 50에서 한 번 또는 200 번에서 한 번만 될 수 있습니다. 문제가되지 않습니다. 버그를 소개하는 데 시간을 보내고 있습니다. –

2

그래서 도구가 잘못되었습니다 (이전에 말했듯이, 알고 있습니다). 나는 경고 메시지에 대해 알고 싶지 않습니다.

필자는 @ Pascal의 의견에 동의하지만 일부 도구의 제한을 해결하기 위해 코드를 다시 작성하는 것은 다소 위험합니다. 당신이 할 수있는 일은 현재이 문제가있는 파일들에 대해서만이 경고를하지 못하게하는 것입니다.

그런 다음 기존의 유효한 코드를 다시 작성하라는 도구없이 경고없이 빌드 할 수 있습니다.

새 코드의 경우 도구에서 이해할 수있는 스타일을 사용해야합니다. 이는 현재 작업중인 코드이므로 문제가되지 않으므로 경고를 없애기 위해 약간 재 작성해야하는 경우 문제가 적습니다.

정확하지만 기존 스타일은 이상적이지 않습니다.

x과 같은 포인터를 auto_ptr에 저장하는 것이 좋습니다. Auto_ptr을 명시 적으로 꺼내지 않는 한 auto_ptr이 범위를 벗어나면 auto_ptr의 내용이 자동으로 삭제됩니다. 이것은 눈에 훨씬 쉽고, 또한이 함수가 포인터의 소유권을 갖는다는 것을 잘 문서화합니다.

void foo(auto_ptr<int> x) 
{ 
    bar(); 
    *x; 
} 

필자는 ParaSoft가이 코드에 아무런 문제가 없기를 기대합니다.

0

빠른 업데이트 :

1) 위의 규칙은 흐름 분석 규칙이 아닙니다. 즉, 규칙 (ID MRM-31)은 C++ 테스트 9.2.0 이상에서 향상되었습니다. 또한 당신이 원하는 것을해야하는 C++ 테스트 (ID : BD-RES-FREE)에 해당하는 흐름 분석 규칙이 있습니다.