2014-04-14 4 views
0

내가 패치를 만들려고하지만 난 이러한 유형의 경고를 만난 적이에 잘못된 종류 :스파 스 경고 : 할당

e = ipt_next_entry(e); 

그동안 :이 오류는이 시점에서 나타납니다

warning: incorrect type in assignment (different modifiers) 
expected struct ipt_entry *[assigned] e 
got struct ipt_entry [pure] * 

전자 및 ipt_next_entry 모두의 선언은 다음과 같습니다

struct ipt_entry *e; 

static inline __pure 
struct ipt_entry *ipt_next_entry(const struct ipt_entry *entry) 
{ 
     return (void *)entry + entry->next_offset; 
} 

내 질문이 정확히 : 무엇을 할 __pure 네? 내가 무엇을 할 수 있을지? 이 부분에 대해서는 어디에서 읽을 수 있습니까? 인터넷에서 아무 것도 찾을 수 없습니다.

+0

신속하게이 발견 : http://lxr.free-electrons.com/source/include/linux/compiler-gcc.h#L94 그것은이다 '__attribute __ ((pure))'로 확장되는 매크로로 소스 코드에서 직접 볼 수 있습니다. 그래서 ... https://ohse.de/uwe/articles/gcc-attributes.html#func-pure –

답변

2

http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html에서 순수

반환 값은 매개 변수 및/또는 전역 변수에 따라 달라집니다. 이러한 함수는 산술 연산자처럼 일반적인 서브 표현식 제거 및 루프 최적화의 영향을받을 수 있습니다. 이 함수는 pure 속성으로 선언해야합니다. 예 : int square (int) 속성 ((순수)); 가상의 함수 제곱은 프로그램이 말하는 것보다 적은 시간을 호출하는 것이 안전하다고 말합니다.

순수 함수의 일반적인 예로는 strlen 또는 memcmp가 있습니다. 흥미로운 비 순수 함수는 무한 루프 또는 휘발성 메모리 또는 다른 시스템 리소스에 따라 달라지는 함수이며 은 두 개의 연속 호출간에 변경 될 수 있습니다 (다중 스레드 환경에서는 feof).

이전의 2.96.Many 기능이 더 리턴 값을 제외하고 효과가없는 GCC 버전에서 구현되지 않은 순수한 속성 자신의

기본적으로는 전역 메모리를 읽고하지 기능에 추가됩니다 아무것도 수정하십시오. 예를 들어 strlen() 함수는 포인터를 읽고 문자열의 길이를 반환하지만 실제 문자열은 수정하지 않습니다.
반면에 strcpy()은 포인터 중 하나가 가리키는 메모리를 수정합니다.

이러한 특성 (순수, CONST 등) 정상 기능에보다 높은 최적화를 적용 할 수 있도록 컴파일러가하는 함수 호출의 몇 가지 의미 론적 의미를 알고하는 데 도움이됩니다.

더이 LWN 기사에서 읽기 : http://lwn.net/Articles/285332/

+0

답장을 보내 주셔서 감사합니다! – Matei

+0

다행이 도울 수있었습니다! 'lwn' 기사를 읽으면,이 속성들을 잘 설명 할 수 있습니다. – brokenfoot

+0

지금 당장하고 있습니다.나는 내가해야 할 일과 내가 수정해야만하는 것을 이해했습니다. 그리고 왜 내가 이것을해야만하는지. 감사! – Matei