2011-09-20 5 views
0

다음 예제 코드가 있으며이를 피하기 위해 사용할 수있는 주석의 종류를 알고 싶습니다.NULL에 대한 주석 GCC의 사전 실행 및 컴파일에서의 참조 해제

int Function(classA* pInput) { 
    if (pInput == NULL) { 
     classA::Create(pInput); 
    } 

    return pInput->value; 
} 

문제는 PREfast는 기능을 평가하기 때문에이 Create 포인터를 초기화 것을 알고하지 않습니다.

classA::Create에 대한 헤더 파일에서 __out 주석을 사용하여 해결할 수 있다고 생각했지만 작동하지 않았습니다.

프리프 패스가 함수 정의에서 선택하도록 코드의 어디서나 단지 __analysis_assume에 대한 좋은 대안이 있는지 궁금합니다.

둘째로, 나는이 코드를 리눅스 나 GCC와 함께이 전처리 지시어로 구축 할 수 있도록 빌드 구성을 어떻게 설정해야하는지 궁금합니다. LINUX 빌드에 있는지 확인한 다음 해당 주석을 빈 매크로로 추가해야합니까?

+0

나는이 들여 쓰기 스타일을 지난 주 동안 _lot_ 보았습니다. 어떤 교과서에서 온 것인가? –

+0

'Create '가 실제로 객체를 할당하고 초기화하는 정적 메소드라고 가정하면 그 코드에 아무런 문제가 없습니다. 오류가 있습니까? – AJG85

+0

나는이 들여 쓰기 스타일을 불로 타기위한 움직임을 전달하고 싶습니다. –

답변

2

MSalter’s answerclassA*& 매개 변수에 [Post(Null=No)] 누락처럼 매우 정확한 기술 대답 같은 소리 보인다. 행복하게 SAL을 알지 못해 확실히 말할 수는 없지만 기술 수준의 솔루션처럼 보입니다.

그러나 현재 코드 & hellip을 (를) 다시 작성하는 것이 좋습니다.

int Function(classA* pInput) { 
    if (pInput == NULL) { 
     classA::Create(pInput); 
    } 

    return pInput->value; 
} 

을 & hellip으로;

int Function(classA* pInput) { 
    if (pInput == NULL) { 
     pInput = classA::Create(); 
    } 

    return pInput->value; 
} 

여기에 주요 문제

는 동적으로 생성 된 객체, 또는하지를 유출 있어 여부입니다. 이는 Create 메소드가하는 일에 크게 의존합니다. 하지만 네가 새는 것 같아.

int Function(classA* pInput) { 
    if (pInput == NULL) { 
     return classA().value; 
    } 

    return pInput->value; 
} 

마지막으로, 대한 :

그리고 Create 아무것도하지 않습니다하지만 동적으로 기본 초기화 classA 객체를 할당하는 경우에

는 여기에보다 효율적으로 그보다 안전하게 을 할 수있는 방법입니다 전체 정리는 불필요한 원시 포인터를 제거하는 방법을 고려해야합니다. 원시 포인터는 문제를 일으키기 때문에 (코드는 그 아주 작은 예일뿐입니다). 그러면 다음과 같은 일을 할 수 있습니다 :

int function(ClassA const& anObject = ClassA()) 
{ 
    return anObject.value; 
} 

기본적으로 이것은 원래 코드의 C 레벨과 반대되는 C++ 레벨 솔루션입니다. 그래서 C++ 레벨에서 유형에 대한 훨씬 더 중점적 인 초점을 반영하기 위해 명명 규칙을 변경했습니다. 여기서 유형에는 대문자의 첫 글자가 있고 단순한 함수에는 소문자의 첫 글자가 있습니다.

더 간단하고 안전하며 다시 효율적입니다.

및 – C++ 수준에서는 일반적으로 바보 같은 SAL 표기법으로 고민 할 필요가 없습니다. :-)

환호 &th.,

+0

누수 감지 +1, 포인터가 아닌 참조를 사용하라는 제안, 널 포인터의 경우 예외를 던지라고 제안하지 않으려면 -1. Net : +1. –

+0

@David : 코드를 의도적으로 취급하기로 선택했는데이 경우 nullpointer는 오류가 아니라 기본값을 얻는 설계된 방법입니다. 이제 여분의 upvote 내놔! –

+0

나는 시도했지만 나는이 메시지를 받았다. "* 당신은 1 시간 전에이 응답에 마지막으로 투표했습니다.이 대답이 편집되지 않는 한 당신의 투표는 잠겨 있습니다. *" –

1

는 SA가 classA::Create(classA*)

+0

단순히 Create에 __out을 추가 할 수 없습니까? – Setheron

+0

나는 그렇게 생각하지 않는다. '__out'은 단순히'pInput'이 _a_ 값을 가지고 있다는 것을 보장하고 null이 아닌 값을 가지지 않도록 보장합니다. '[]'은 [새로운 구문]입니다. (http://blogs.msdn.com/b/michael_howard/archive/2006/05/19/602077.aspx) – MSalters