기본적으로 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
.