Linux 2.6.36.4, GCC 4.7.2, 수많은 "변수가 설정되었지만 사용되지 않음" 경고 수신

Linux 2.6.36.4, GCC 4.7.2, 수많은 "변수가 설정되었지만 사용되지 않음" 경고 수신

기본적으로 3.5 커널을 실행하는 Linux Mint 14에서 Linux 커널 2.6.36.4를 컴파일하려고 합니다. gcc 버전 4.7.2를 사용합니다. 인터넷 검색을 시도했지만 성공하지 못했습니다. 경고는 다음과 같습니다

warning: variable ‘gfp’ set but not used [-Wunused-but-set-variable]

편집 전반에 걸쳐 이러한 경고가 엄청나게 많이 있습니다. 컴파일은 어디서도 실패하지 않습니다. 최악의 부분은 컴파일된 커널도 성공적으로 부팅되지 않는다는 것입니다.

설정해야 할 gcc 옵션이 더 있습니까? 아니면 무시해야 합니까?

참고: 저는 virtualbox에서 개발 중입니다. 스톡 커널은 잘 작동합니다.

답변1

"변수가 설정되었지만 사용되지 않음" 경고는 정보 제공의 목적으로만 사용됩니다.

~에 따르면공식 문서, -Wunused-but-set-variable다음 동작을 제어합니다.

지역 변수가 할당되었지만 사용되지 않을 때마다(선언 제외) 경고가 발생합니다. 이 경고는 에 의해 활성화됩니다 -Wall.

목적은 프로그래머가 변수에 값을 할당한 다음 더 이상 아무것도 수행하지 않는 상황을 포착하는 것입니다. 커널은 다소 특별합니다. 왜냐하면 저수준 운영 체제 프로그래밍의 심연에서 이런 일을 하는 것이 완벽하게 합법적이거나 심지어는 심지어 나조차도 상상할 수 있기 때문입니다.필요한원하는 결과를 얻으세요.

변수 할당문이 실제로 필요하지 않은 경우 컴파일러는 이를 최적화할 수 있습니다.

결론은 개발자가 아닌 이상 이러한 경고를 무시해도 안전하다는 것입니다. 개발자라면 할당이 필요한지 고려해야 합니다. GCC가 아닌 컴파일러에 대한 이식성이 우선순위가 아닌 경우 __attribute__((unused))변수에 대한 경고를 표시하지 않도록 선언에 추가하는 것을 고려하십시오.변수 속성.

답변2

아니면 무시해야 합니까?

사용되지 않은 변수할 수 있다코딩 오류를 나타냅니다. 이것이 사실이 아니라고 확신하고 특정 변수에 대한 경고를 표시하지 않으려면 다음을 사용할 수 있습니다.(GCC 특정)__attribute__태그(예:

/* Unused parameter (in definition, not declaration): */
void somefunc (int x __attribute__ ((unused))) {
    [...]
}

/* Unused variable. */
int x __attribute__ ((unused));
/* But set... */
x = 1;

첫 번째 경우는 API를 구현하는 경우 드문 일이 아닙니다. 예를 들어 매개변수를 무시하지만 콜백 서명과 일치해야 하는 콜백을 작성하는 경우입니다. 두 번째 경우는 약간 모순되는 것처럼 보이지만 아직 사용되지 않은 것을 선언하고 설정했으며 경고 등으로 인해 주의가 산만해지고 싶지 않은 경우 일시적으로 유용할 수 있습니다.

이는 아마도 -Wunused-parameter종료 및/또는 -Wunused-but-set-variable.

관련 정보