2010-03-16 2 views
4

C++에서 컴파일 타임 "순도"검사를 지정할 수 있습니까?C++ 컴파일시 순도 체크?

즉 :

this function does not read from anything other than it's arguments 
this function does not write to anything; it only returns the return value 
+0

을 왜 당신이 그런 짓을 할 수 있습니까? AFAIK 당신은 할 수 없습니다. – AraK

+2

C++ 컴파일러가 믿을 수 없을만큼의 정적 분석을 수행하지 않고 모든 라이브러리 코드를 분석하는 것은 아닙니다. 그래서 아니야. –

+0

커버 리티와 같은 도구가 필요합니다 – pm100

답변

4

const-correctness 높은 컴파일러 경고 수준은 당신이 요구하는 무엇을 많이해야한다. 또한 컴파일러에 대한 C++의 매우 엄격한 현대 방언을 지정합니다 (타사 라이브러리를 사용하고 코드를 준수하지 않을 때 성가 시게 할 수 있음)

그렇지 않으면 과다한 정적 분석 도구, 오픈 소스, Coverity, Parasoft C++ Test 등과 같은 비싼 도구가 있습니다. .

+0

C++의 매우 엄격한 현대 방언을 어떻게 지정합니까? g ++/clang이 이것을 지원합니까? – anon

2

이 작업을 수행 할 휴대용 방법이 없지만, GCC 구현 function attributes 당신이 체크 아웃해야 두 특정 속성에 관심이 무엇인지에 근접 할 수 없습니다 :

순수 - 많은 기능이 더이 반환 값과 반환 값을 제외한 결과는 매개 변수 및/또는 전역 변수에만 의존합니다. 이러한 함수는 산술 연산자처럼 일반적인 하위 식 제거 및 루프 최적화의 적용을받을 수 있습니다. 이 함수는 pure 속성으로 선언해야합니다.

과 :

CONST는 - 많은 함수는 인수를 제외한 모든 값을 검사하고, 반환 값을 제외하고 영향을하지 않습니다. 기본적으로 함수는 전역 메모리를 읽을 수 없으므로 아래의 pure 속성보다 약간 엄격한 클래스입니다.

당신은 프로토 타입의 일부로서 속성을 지정

int square (int x) __attribute__ ((const)); 

int square (int x) 
{ 
    return x * x; 
} 
+0

+1, 이것을 지적 해 주셔서 감사합니다! 나는이 속성을 지정하면 – greyfade

+0

, 그것은 나를 g을 약속 ++ 기능이 이러한 조건을 만족하는 점이다 (그래서 g ++ 미친 최적화 작업을 수행 할 수 있습니다) 또는 g ++ 확인하고 나를 위해 이러한 조건을 보장 하는가? – anon

+0

@anon - 컴파일러에게는 약속 인 것으로 보입니다. gcc 4.3.2에서는 컴파일러의 경고없이 순수/const 함수가 부작용을 일으킬 수있었습니다. –

관련 문제