본문 바로가기
IT/linux

gcc warning case 정리

by 어느해겨울 2022. 9. 5.

 

gcc warning case 정리

 

[-Waddress]
주소 표현의 의심스러운 사용에 대한 경고.

void f (const char *x) {
  if (x == "abc")   // warning: expression evaluates to false
    puts ("equal");
}
 
void g (void) {
  if (!f)   // warning: expression evaluates to false
    abort ();
}

 

[-Wimplicit-function-declaration]

함수를 명시적으로 선언하지 않은 채 사용한 경우에 경고.

header include 누락, function declaration 누락 등.. 함수를 사용하기 전 명백하게 무엇인지 알려주지 않았다라는 의미.

 

[-Wparentheses]

특정 문맥에서 괄호가 생략되면 경고.

예를 들어 우선순위에 대해 사람들이 자주 혼동하는 연산자가 중첩되어 있는 경우 등.

*pImg[0] = *pImg[0] & *pMaskFont[0] | *pFont[0];      (X)
*pImg[0] = ((*pImg[0] & *pMaskFont[0]) | *pFont[0]);  (O)


[-Wpointer-sign]
포인터 인수 전달 또는 부호가 다른 할당에 대한 경고.

expected 'unsigned char *' but argument is of type 'char *'

 

[-Wsequence-point]

시퀀스 포인트 규칙을 위반하여 정의되지 않은 의미를 가질 수 있는 코드에 대해 경고.

i++ * i++;
i = i++;
# i는 하나의 full expression(seqeunce point)에서 두번 값을 변경했다.
 
a[i] = i++;
# i가 subscript로 쓰이기 전에 증가할지, 쓰인 후 증가할지 알 수 없다.

 

[-Wsign-compare]

부호 있는 값과 부호 없는 값을 비교하여 잘못된 결과를 생성할 수 있는 경우 경고.

int a = 0;
unsigned int b = 1;
 
if( a < b ) ..

 

[-Wtype-limits]

제한된 범위의 데이터 유형으로 인해 비교가 항상 참 또는 항상 거짓 인 경우 경고.
부호 없는 변수가 0 또는 
< 또는 >=과 비교되면 경고.

char arr_data[100000];
for( uint16_t idx = 0; idx < sizeof(arr_data) ; idx++ ) ..
# idx의 range는 65535, arr_data의 size인 100000에 닿을 수 없기 때문에 무한 루프 발생..

 

[-Wunused-but-set-variable]

변수를 선언하고 할당하였지만 사용하지 않는 경우 경고.

 

[-Wunused-function]

함수가 선언되었지만 사용하지 않는 경우 경고.

 

[-Wunused-parameter]

함수의 매개변수(인자)가 선언되었지만 사용하지 않는 경우 경고.

 

[-Wunused-variable]

지역/정적 변수를 선언하였으나 사용하지 않는 경우 경고.
(참고: https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html)

 

 

in definition of macro / in expansion of macro

의미를 정확히 이해하기 어렵다. 
macro function 내 warning이 발생한 경우 해당 macro에 대한 note noti를 주는 것으로 생각된다..
해당 note에 대한 debuging이 필요 없다면 gcc의 -fcompare-debug-second 옵션을 통해 note 알림을 끌 수 있다.
(참고: compiling - Want to turn off "note" level messages in GCC - Unix & Linux Stack Exchange)

 

 

 

 

댓글