2014-10-17 4 views
9

저는 리눅스 커널을 처음 접했습니다. 그리고 스파 스 도구를 사용하여 코드에있는 노이즈를 제거합니다. 다음 매크로를 발견했습니다 :linux/compiler.h 파일에 정의 된 사전 처리기 매크로의 용도는 무엇입니까?

# define __user  __attribute__((noderef, address_space(1))) 
    # define __kernel __attribute__((address_space(0))) 
    # define __safe  __attribute__((safe)) 
    # define __force __attribute__((force)) 
    # define __nocast __attribute__((nocast)) 
    # define __iomem __attribute__((noderef, address_space(2))) 
    # define __must_hold(x) __attribute__((context(x,1,1))) 
    # define __acquires(x) __attribute__((context(x,0,1))) 
    # define __releases(x) __attribute__((context(x,1,0))) 
    # define __acquire(x) __context__(x,1) 
    # define __release(x) __context__(x,-1) 
    # define __cond_lock(x,c) ((c) ? ({ __acquire(x); 1; }) : 0) 
    # define __percpu __attribute__((noderef, address_space(3))) 

이제 나는 알고 싶습니다 : 어떻게 스파 스가 오류/경고를보고하는데 사용됩니까?

내 질문 :

  1. 나는 그들이 컴파일러와 경고를보고 스파 스를 어떻게 도움이되는지 세부 사항을합니다.
  2. 무엇입니까? address_space (x)컨텍스트 (X, x, x) 및 용도는 무엇입니까?
  3. 무엇 __nocast 의 목적, __force, __user, __safe?

답변

4

나는 모든 매크로는 sparse의 맥락에서 의미 있다고 생각 (맨 here - 당신은 모든 속성과 스파 스 경고가의 설명을 볼 수 있습니다). 복사 한 소스 파일에서 위의 내용을 살펴보면 매크로를 활성화하는 데 큰 __CHECKER__ 매크로가 사용됩니다.

나는 GCC는이 시점에서 그들과 함께 아무것도하지 있는지 확실하지 않습니다 - 나는 가지 자동으로 2004 리누스 토발즈 (Linus Torvalds)에 다시 자신의 이메일 중 하나에 ... 그들을 무시 생각을 말하고 있었다 :

gcc의 경우 희소 주석은 의미가 없습니다. 그들은 단지 프로그래머에게 에게 "이봐, 그 포인터는 정상적인 포인터가 아니었다"고 말할 수는 있지만, 결국에는 희소식을 사용하지 않는 한 결국 은 읽을 수 없다. 실제로 아무것도.

이 목적으로 열어 진 티켓이 있습니다 (http://www.spinics.net/lists/linux-sparse/msg03366.html).

+1

기사를 공유해 주셔서 감사합니다. 그러나 나는 아직도 이러한 문제를보고하는 데 도움이되는 방법에 대한 답을 찾을 수 없습니다. 나는 여전히 'address_space (num)'가 실제로 경고를 해결하고보고하는 것을 돕는 방법을 얻지 못하고있다. 비슷하게'context (x, x, x)'. –