GCC Home

GCC Warning/Error List

이 문서는 GCC (GNU Compiler Collection)에서 발생할 수 있는 경고(warning) 및 에러(error) 메시지들을 나열하고, 어떤 경우에 해당하는 메시지가 발생할 수 있는지를 설명합니다. 저자는 이 글이, C (또는 C++) 언어를 처음 배우는 분들이나, 영어에 서툰 분들에게 도움이 되기를 바랍니다.

이 페이지는 Emacs에 의해 자동적으로 만들어 진 것입니다. 최신 소스는 제 CVS 서버에서 얻을 수 있습니다. 이 문서를 다음과 같은 방식으로 직접 만들기 위해서, GNU Emacs 최신 버전과 GNU enscript가 필요합니다.

      $ cvs -d :pserver:anonymous@www.cinsk.org:/root login
      Password: <RET>
      $ cvs -d :pserver:anonymous@www.cinsk.org:/root co gcc-error
      ...
      $ cvs -d :pserver:anonymous@www.cinsk.org:/root logout
      $ cd gcc-error
      $ make
      ...
      $ ls -F
      CVS/  Makefile	default.css  gcc-error.html  mklist.el	testsuite/
      $ # read gcc-error.html with your favorite web browser.
    


caotsdm.cc

ISO C++ 표준에 따라, offsetof 매크로는 static data member 또는 function member에 쓸 수 없습니다.

caotsdm.cc: In function 'void foo()':
caotsdm.cc:13: error: cannot apply 'offsetof' to static data member 's::c'
caotsdm.cc:11: warning: unused variable 'val'
caotsdm.cc:13: warning: unused variable 'i'
0001: /* $Id: caotsdm.cc,v 1.1 2007/07/09 08:51:30 cinsk Exp $ */
0002: #include <cstddef>
0003: 
0004: struct s {
0005:   int i;
0006:   static char c;
0007: };
0008: 
0009: void foo(void)
0010: {
0011:   static s val;
0012: 
0013:   int i = offsetof(struct s, c);
0014: }
0015: 

attaobs.cc

Bit-field 멤버에는 address-of 연산자(&)를 쓸 수 없습니다.

attaobs.cc: In function 'void foo()':
attaobs.cc:9: error: attempt to take address of bit-field structure member 's::i'
attaobs.cc:9: warning: unused variable 'p'
0001: /* $Id: attaobs.cc,v 1.1 2007/07/09 08:51:30 cinsk Exp $ */
0002: struct s {
0003:   unsigned i: 8;
0004: };
0005: 
0006: void foo(void)
0007: {
0008:   s val;
0009:   unsigned *p = &val.i;
0010: }
0011: 

wnoasfa.c

GCC 확장 기능인 __attribute__ 키워드를 쓸 때, 전달한 인자의 갯수가 틀린 경우에 이 에러가 발생합니다. 이 예제에서 함수 f()에 사용한 `format'의 경우, 세 개의 인자를 전달해야 하는데, 두 개의 인자만 전달했기 때문에, 이 에러가 발생합니다.

wnoasfa.c:2: error: wrong number of arguments specified for 'format' attribute
0001: /* $Id: wnoasfa.c,v 1.1 2007/07/09 08:51:30 cinsk Exp $ */
0002: void f(int a, ...) __attribute__ ((format (printf, 2)));
0003: 

vlal.c

ISO C에서 가변 인자 리스트를 받는 함수는 반드시 하나 이상의 고정된 파라메터를 제공해야 합니다. 이 예제에서 함수 f()는 고정된 파라메터가 하나도 없기 때문에 이 에러가 발생합니다.

vlal.c:2: error: ISO C requires a named argument before '...'
0001: /* $Id: vlal.c,v 1.1 2005/11/29 00:25:12 cinsk Exp $ */
0002: void f(...)
0003: {
0004: }
0005: 

visibility2.c

TODO: visibility arg must be one of "default", "hidden",   "protected", "internal".

visibility.c

TODO: visibility arg not a string

unvalendif.c

#endif directive가 if section(#if, #ifdef 또는 #ifndef 등)과 맞지 않게 쓰였을 때, 이 에러가 발생합니다.

unvalendif.c:3:2: error: #endif without #if
0001: /* $Id: unvalendif.c,v 1.1 2005/11/29 00:25:12 cinsk Exp $ */
0002: 
0003: #endif
0004: 

untermstr.c

주어진 문자열이 쌍 따옴표(")로 끝나지 않을 경우에 발생합니다.

untermstr.c:3: error: missing terminating " character
untermstr.c:3: error: expected expression at end of input
0001: /* $Id: untermstr.c,v 1.1 2005/11/29 07:03:56 cinsk Exp $ */
0002: 
0003: char *str = "Hello
0004: 
0005: 

untermmacro.c

주어진 매크로의 인자를 읽을 때, 괄호가 닫히지 않은 경우, 이 에러가 발생합니다.

untermmacro.c:12:1: error: unterminated argument list invoking macro "NOP"
untermmacro.c:4: error: expected '=', ',', ';', 'asm' or '__attribute__' at end of input
0001: /* $Id: untermmacro.c,v 1.1 2005/11/29 00:25:12 cinsk Exp $ */
0002: #define NOP(x)
0003: 
0004: NOP(foo
0005: 

untermif.c

전처리기 지시어(preprocessor directive)인 #if는 짝이 맞는 #endif가 있어야 합니다.

untermif.c:3:1: error: unterminated #if
0001: /* $Id: untermif.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: 
0003: #if 1
0004:   int i = 0;
0005: 

untermconst.c

문자 상수를 쓸 때, 닫는 작은 따옴표(')를 잊었을 때 발생합니다.

untermconst.c:3: error: missing terminating ' character
untermconst.c:3: error: expected expression at end of input
0001: /* $Id: untermconst.c,v 1.1 2005/11/29 07:03:56 cinsk Exp $ */
0002: 
0003: char ch = 'a;
0004: 

untermcomm.c

untermcomm.c:3:1: error: unterminated comment
0001: /* $Id: untermcomm.c,v 1.1 2005/11/29 07:03:56 cinsk Exp $ */
0002: 
0003: /* This is a comment
0004: 

undef.c

ISO C 또는 컴파일러가 미리 정의해 놓은 매크로(predefined macro)를 없앨 경우에 발생합니다. 이 경고가 발생할 경우, 여러분은 다른 매크로를 써야 합니다. 미리 정의된 매크로를 다른 목적으로 쓰는 것은 좋지 않습니다. ISO C 또는 컴파일러가 미리 정의해 놓은 이름들은 Predefined Macros를 참고하기 바랍니다.

undef.c:2:8: warning: undefining "__FILE__"
0001: /* $Id: undef.c,v 1.1 2005/11/29 00:25:12 cinsk Exp $ */
0002: #undef __FILE__
0003: 

tlsmodel2.c

TODO: tls_model arg must be one of "local-exec",   "initial-exec", "local-dynamic", or "global-dynamic"

tlsmodel.c

TODO: tls_model arg not a string

sizeunknown.c

sizeunknown.c:3: error: storage size of 'st' isn't known
0001: /* $Id: sizeunknown.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: 
0003: struct s st;
0004: 

shadow.c

함수 정의 또는 기타 블럭 구조에서 블럭 안에서 선언한 이름이, 블럭 밖에서 선언한 이름과 같을 경우에 이 경고가 발생합니다. 이 경우, 블럭 밖에서 선언한 이름을 쓸 수 없습니다. 따라서, 가능하면 서로 같지 않게 이름짓는 것이 좋습니다.

shadow.c: In function 'foo':
shadow.c:6: error: 'i' redeclared as different kind of symbol
shadow.c:4: error: previous definition of 'i' was here
shadow.c:6: warning: unused variable 'i'
shadow.c:8: warning: control reaches end of non-void function
0001: /* $Id: shadow.c,v 1.1 2005/11/29 00:25:12 cinsk Exp $ */
0002: 
0003: int
0004: foo(int i)
0005: {
0006:   short i = 3;
0007: 
0008: }
0009: 

retnoval.c

void 타입이 아닌 함수에, 값을 쓰지 않고 "return"만 썼을 때 발생합니다. 함수를 void 타입으로 선언하던지, 아니면 적절한 값을 return하기 바랍니다.

retnoval.c: In function 'foo':
retnoval.c:6: warning: 'return' with no value, in function returning non-void
0001: /* $Id: retnoval.c,v 1.1 2005/11/29 07:03:56 cinsk Exp $ */
0002: 
0003: int
0004: foo(void)
0005: {
0006:   return;
0007: }
0008: 

retarray.c

함수의 리턴 타입으로 배열을 쓸 수 없습니다.

retarray.c:3: error: 'foo' declared as function returning an array
0001: /* $Id: retarray.c,v 1.1 2005/11/29 07:03:56 cinsk Exp $ */
0002: 
0003: int foo(void)[];
0004: 

redefine.c

redefine.c:5: error: redefinition of 'i'
redefine.c:3: error: previous definition of 'i' was here
0001: /* $Id: redefine.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: 
0003: int i = 0;
0004: 
0005: int i = 2;
0006: 

redecl.c

N/A

redecl.c: In function 'foo':
redecl.c:5: error: redeclaration of 'i' with no linkage
redecl.c:4: error: previous declaration of 'i' was here
0001: void
0002: foo()
0003: {
0004:   int i;
0005:   int i;
0006:   i = 3;
0007: }
0008: 

recurse.c

매크로나 #include가 재귀적으로 너무 깊게 반복될 때 발생합니다. 예를 들어 util.h가 types.h를 #include하고, types.h가 다시 util.h를 하는 경우, 둘 중 한 파일을 소스에 포함시키면, 서로가 계속 서로를 포함시키기 때문에, 결국 컴파일러는 이 에러를 출력합니다. 이 경우 #ifndef, #define, #endif 등을 써서 재귀적으로 포함되지 않게 합니다.

In file included from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3,
                 from recurse.c:3:
recurse.c:3:21: error: #include nested too deeply
0001: /* $Id: recurse.c,v 1.1 2005/11/30 14:15:17 cinsk Exp $ */
0002: 
0003: #include "recurse.c"
0004: 

ptrfromint.c

함수의 N번째 파라메터가 포인터 타입인데도, 캐스팅 없이 정수 타입을 인자로 전달한 경우에 발생합니다. 올바른 포인터 타입으로 캐스팅하거나, 잘못된 인자를 썼을 가능성이 높습니다.

ptrfromint.c: In function 'bar':
ptrfromint.c:8: warning: passing argument 1 of 'foo' makes pointer from integer without a cast
0001: /* $Id: ptrfromint.c,v 1.1 2005/11/29 07:03:56 cinsk Exp $ */
0002: 
0003: void foo(char *s);
0004: 
0005: void
0006: bar(void)
0007: {
0008:   foo(4);
0009: }
0010: 

parse.c

N/A

parse.c:2: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'ui'
parse.c: In function 'f':
parse.c:6: error: expected expression before 'else'
0001: typedef int INT;
0002: unsigned INT ui;
0003: 
0004: void f()
0005: {
0006:   else {
0007:   }
0008: }
0009: 
0010: 

panpacv.c

ISO C 표준에 따라, case 문에는 integer constant expression만 쓸 수 있습니다. 본 에러는, case 값으로 포인터를 쓴 경우에 발생합니다.

panpacv.c: In function 'f':
panpacv.c:8: error: pointers are not permitted as case values
panpacv.c:9: error: pointers are not permitted as case values
0001: /* $Id: panpacv.c,v 1.1 2007/07/09 08:51:30 cinsk Exp $ */
0002: int c1, c2, c3;
0003: 
0004: void f(int op)
0005: {
0006:   int *p;
0007:   switch (op) {
0008:   case &c1:
0009:   case p:
0010:     break;
0011:   }
0012: }
0013: 

omitparam.c

함수를 정의할 때, 함수 파라메터에 이름이 빠진 경우, 이 에러가 발생합니다. 예제에서 함수 foo()의 경우에 이 에러가 발생하기 때문에, 전달된 파라메터가 쓰이지 않는 함수인 경우, 함수 bar()와 같이 쓰기 바랍니다.

omitparam.c: In function 'foo':
omitparam.c:4: error: parameter name omitted
omitparam.c: In function 'bar':
omitparam.c:13: warning: control reaches end of non-void function
0001: /* $Id: omitparam.c,v 1.1 2005/11/29 00:25:12 cinsk Exp $ */
0002: 
0003: int
0004: foo(int)
0005: {
0006:   return 0;
0007: }
0008: 
0009: 
0010: int
0011: bar(int unused)
0012: {
0013: }
0014: 

ofconst.c

주어진 상수를 컴파일러가 알아서 변환할 때(implicitly conversion), 오버플로우(overflow)가 발생할 경우, 이 경고가 출력됩니다. 예제 코드에서 int 타입의 범위를 넘는 double 타입의 상수를 대입하려 했기 때문에 이 경고가 발생한 것입니다.

ofconst.c:3: warning: overflow in implicit constant conversion
0001: /* $Id: ofconst.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: 
0003: int i = 1e300;
0004: 

nvoidfunc.c

함수의 리턴 타입이 void가 아닌데도, 적절한 return 문장이 없을 때 이 경고가 발생합니다. 이 경우, 함수의 리턴 타입을 void로 고치거나, 적당하게 return 문장을 넣어주면 됩니다.

nvoidfunc.c: In function 'foo':
nvoidfunc.c:7: warning: control reaches end of non-void function
0001: /* $Id: nvoidfunc.c,v 1.1 2005/11/29 07:03:56 cinsk Exp $ */
0002: 
0003: int
0004: foo(void)
0005: {
0006: 
0007: }
0008: 

notype.c

오브젝트를 정의 또는 선언할 때, 타입을 쓰지 않은 경우 발생합니다. 이 경우 자동적으로 int 타입으로 간주합니다.

notype.c:3: warning: data definition has no type or storage class
notype.c:3: warning: type defaults to 'int' in declaration of 'i'
notype.c:4: warning: data definition has no type or storage class
notype.c:4: warning: type defaults to 'int' in declaration of 'f'
0001: /* $Id: notype.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: 
0003: i;
0004: f();
0005: 

noretfunc.c

함수의 리턴 타입을 생략할 경우에 발생합니다. 리턴 형이 생략된 함수는 자동적으로 int 타입을 리턴하는 것으로 간주하지만, 좋은 코딩 습관이 아닙니다. 올바르게 리턴 타입을 써 주는 것이 좋습니다.

noretfunc.c:4: warning: return type defaults to 'int'
0001: /* $Id: noretfunc.c,v 1.1 2005/11/29 07:03:56 cinsk Exp $ */
0002: 
0003: foo(void)
0004: {
0005:   return 0;
0006: }
0007: 

nonstruct.c

'.' 연산자는 struct 또는 union의 멤버에 접근하기 위해 쓰이며, 다른 곳에서 쓰일 경우 이 에러가 발생합니다. 대개 타입을 잘 못 썼거나, '.'나 '->'를 혼동한 경우에 이 에러가 발생합니다.

nonstruct.c: In function 'foo':
nonstruct.c:14: error: request for member 'i' in something not a structure or union
nonstruct.c:15: error: request for member 'i' in something not a structure or union
0001: /* $Id: nonstruct.c,v 1.1 2005/11/29 07:03:56 cinsk Exp $ */
0002: 
0003: struct s {
0004:   int i;
0005: };
0006: 
0007: 
0008: void
0009: foo(void)
0010: {
0011:   struct s *p;
0012:   char c;
0013: 
0014:   c.i = 3;
0015:   p.i = 2;
0016: }
0017: 

nomember.c

nomember.c: In function 'foo':
nomember.c:13: error: 'struct abc' has no member named 'c'
0001: /* $Id: nomember.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: 
0003: 
0004: struct abc {
0005:   int a, b;
0006: };
0007: 
0008: void
0009: foo(void)
0010: {
0011:   struct abc a;
0012: 
0013:   a.c = 0;
0014: }
0015: 

noinclude.c

#include에서 포함시킨 헤더 파일을 찾을 수 없을 때, 이 에러가 발생합니다. 대개 이 에러는 사용자가 만든 파일을 " 대신 <>로 둘러 싸거나, 파일 이름을 틀리게 입력하거나, 또는 컴파일러 옵션에서 디렉토리 설정이 잘못되어 있는 경우, 또는 컴파일러에서 쓰는 환경 변수가 잘 못 지정되어 있는 경우에 발생합니다. 자세한 것은, Header Files를 참고하기 바랍니다.

noinclude.c:3:25: error: where_is_it.h: No such file or directory
0001: /* $Id: noinclude.c,v 1.1 2005/11/29 08:37:26 cinsk Exp $ */
0002: 
0003: #include <where_is_it.h>
0004: 

nofile.c

컴파일러가 주어진 파일 이름(디렉토리 포함)을 찾을 수 없을 때, 발생합니다. 대개 파일 이름을 틀리게 입력했을 때 발생합니다.

gcc: invalid_filename.c: No such file or directory
gcc: no input files
0001: /* $Id: nofile.c,v 1.1 2005/11/29 08:37:26 cinsk Exp $ */
0002: 
0003: $ gcc where_is_it.c
0004: 

manyarg.c

함수 선언에 쓰인 파라메터의 갯수보다 실제 전달된 인자의 갯수가 많을 경우에 발생합니다.

manyarg.c: In function 'foo':
manyarg.c:8: error: too many arguments to function 'bar'
0001: /* $Id: manyarg.c,v 1.1 2005/11/29 07:03:56 cinsk Exp $ */
0002: 
0003: void bar(int);
0004: 
0005: void
0006: foo(void)
0007: {
0008:   bar(5, 4);
0009: }
0010: 

line.c

Preprocessor directive인 #line 뒤에는 항상 (10진수) 양수가 나와야 합니다. 또한 #line 대신 #만 쓸 수도 있기 때문에 "#-3"처럼 쓴 경우에도 이 에러가 발생합니다.

line.c:2:7: error: "-" after #line is not a positive integer
line.c:3:7: error: "hello" after #line is not a positive integer
line.c:4:2: error: "0x32" after # is not a positive integer
0001: /* $Id: line.c,v 1.2 2005/11/30 05:10:28 cinsk Exp $ */
0002: #line -1 "foo.c"
0003: #line hello
0004: #0x32

invvoid3.c

void 타입은 포인터 타입으로 쓰거나 함수의 리턴 타입으로 쓰이는 경우에만 의미가 있습니다. 다른 경우, 예를 들어 void 타입의 배열을 선언하는 것은 옳지 않습니다.

invvoid3.c:3: error: declaration of 'a' as array of voids
0001: /* $Id: invvoid3.c,v 1.1 2005/11/30 14:15:17 cinsk Exp $ */
0002: 
0003: void a[3];
0004: 

invvoid2.c

invvoid2.c: In function 'foo':
invvoid2.c:10: error: void value not ignored as it ought to be
0001: /* $Id: invvoid2.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: 
0003: 
0004: void bar(void);
0005: 
0006: 
0007: int
0008: foo(void)
0009: {
0010:   int i = bar();
0011: 
0012:   return i;
0013: }
0014: 
0015: 

invvoid.c

변수나 field는 void 타입으로 선언할 수 없습니다.

invvoid.c: In function 'foo':
invvoid.c:6: error: variable or field 'a' declared void
invvoid.c:6: warning: unused variable 'a'
0001: /* $Id: invvoid.c,v 1.1 2005/11/29 08:37:26 cinsk Exp $ */
0002: 
0003: void
0004: foo(void)
0005: {
0006:   void a;
0007: }
0008: 
0009: 

invtypedef.c

typedef는 기존의 타입에 대해서 새 이름을 정의하는 것이기 때문에, 초기값을 가질 수 없습니다.

invtypedef.c:3: error: typedef 'INT' is initialized (use __typeof__ instead)
0001: /* $Id: invtypedef.c,v 1.1 2005/11/29 08:37:26 cinsk Exp $ */
0002: 
0003: typedef int INT = 1;
0004: 

invtype.c

주어진 타입이 완전히 정의되지 않은 상황에서, 이 타입을 쓸 수 없습니다. 이 예에서 함수 bar()의 리턴 타입은 struct s이지만, 아직 정의되지 않았기 때문에, bar()를 호출하는 것은 옳지 않습니다. 이 문제를 해결하려면 먼저 struct s를 정의해야 합니다.

invtype.c: In function 'foo':
invtype.c:10: error: invalid use of undefined type 'struct s'
invtype.c: At top level:
invtype.c:18: error: conflicting types for 'bar'
invtype.c:9: error: previous declaration of 'bar' was here
invtype.c: In function 'bar':
invtype.c:20: error: invalid use of undefined type 'struct s'
0001: /* $Id: invtype.c,v 1.1 2005/11/30 14:15:17 cinsk Exp $ */
0002: 
0003: 
0004: struct s;
0005: 
0006: void
0007: foo(void)
0008: {
0009:   struct s bar();
0010:   bar();
0011: }
0012: 
0013: 
0014: void car(struct s *);
0015: 
0016: void
0017: bar(void)
0018: {
0019:   struct s *p;
0020:   car(p + 1);
0021: }
0022: 
0023: 

invtruth.c

TODO: error: invalid truth-value expression

invtag.c

struct, union 등을 써서 타입을 만들 때, 이 때 사용한 tag (예를 들어 "struct s {};" 에서 tag 이름은 's'가 됩니다.) 이름을 다른 타입에서 쓰게 되면 이 에러가 발생합니다.

invtag.c: In function 'foo':
invtag.c:8: error: 's' defined as wrong kind of tag
invtag.c:8: error: storage size of 'foo' isn't known
invtag.c:8: warning: unused variable 'foo'
0001: /* $Id: invtag.c,v 1.1 2005/11/29 07:03:56 cinsk Exp $ */
0002: 
0003: struct s { int x, y, z; };
0004: 
0005: void
0006: foo(void)
0007: {
0008:   union s foo;
0009: 
0010:   foo.x = 1;
0011: }
0012: 
0013: 

invsizeof.c

invsizeof.c: In function 'foo':
invsizeof.c:8: warning: invalid application of 'sizeof' to a function type
0001: /* $Id: invsizeof.c,v 1.1 2005/12/01 05:48:19 cinsk Exp $ */
0002: 
0003: void bar(int i);
0004: 
0005: int
0006: foo(void)
0007: {
0008:   int i = sizeof(bar);
0009: 
0010:   return i;
0011: }
0012: 

invsharp2.c

## 매크로 연산자는 두 개의 인자를 받아 이들을 하나의 토큰(token)으로 바꾸어 줍니다. 따라서 이 연산자는 '+' 연산자처럼 쓰이며, 양쪽에 인자가 와야 합니다. 그렇지 않을 경우 이 에러가 발생합니다.

invsharp2.c:3:25: error: '##' cannot appear at either end of a macro expansion
0001: /* $Id: invsharp2.c,v 1.1 2005/11/29 07:03:56 cinsk Exp $ */
0002: 
0003: #define bugs(s)         ## s
0004: 

invsharp.c

Stringification 매크로 연산자인 #는 매크로 인자 앞에 나와, 이 인자를 문자열로 만들어 주는 역할을 합니다. 이 에러는 # 연산자 뒤에 매크로 인자가 나오지 않은 경우에 발생합니다.

invsharp.c:3:28: error: '#' is not followed by a macro parameter
0001: /* $Id: invsharp.c,v 1.1 2005/11/29 07:03:56 cinsk Exp $ */
0002: 
0003: #define bugs(s)         s #
0004: 

invrestrict.c

invalid use of `restrict'

0001: /* $Id: invrestrict.c,v 1.1 2005/12/01 05:48:19 cinsk Exp $ */
0002: 

invregs.c

register 키워드를 서써 선언된 변수에, 주소를 얻어내는 'address-of' 연산자를 쓸 수 없습니다. register를 쓴다고 항상 CPU의 레지스터에 이 변수가 위치하는 것은 아니지만, 레지스터의 사용 여부와 상관없이, 주소를 얻는 것은 옳지 않습니다.

invregs.c: In function 'foo':
invregs.c:7: error: address of register variable 'i' requested
invregs.c:7: warning: unused variable 'ip'
0001: /* $Id: invregs.c,v 1.1 2005/11/30 14:15:17 cinsk Exp $ */
0002: 
0003: void
0004: foo(void)
0005: {
0006:   register int i;
0007:   int *ip = &i;
0008: }
0009: 

invradix.c

수치 상수가 표현 방식에 맞지 않을 경우에 발생합니다. 예를 들어 8 진수에서 쓰일 수 있는 문자는 0, 1, ..., 7인데 예에서 보인 것과 같이 문자를 쓴다거나, 16진수에서 쓰일 수 있는 문자는 대소문자 가리지 않고 a, b, c, ..., f인데, f 다음의 문자를 쓰는 경우에 발생합니다.

invradix.c:3:9: error: invalid suffix "a" on integer constant
invradix.c:4:9: error: invalid suffix "xhd" on integer constant
0001: /* $Id: invradix.c,v 1.1 2005/11/29 07:03:56 cinsk Exp $ */
0002: 
0003: int i = 0a;
0004: int j = 0xhd;
0005: 

invptr.c

정의가 되지 않은 (또는 알려지지 않은) 타입의 오브젝트에 수행할 수 있는 연산은 매우 제한되어 있습니다. 이 예의 경우처럼, 포인터 연산은 할 수 없습니다. 에러가 발생하지 않게 하려면 먼저 struct s 타입의 정의를 포함시켜야 합니다.

invptr.c: In function 'foo':
invptr.c:11: error: invalid use of undefined type 'struct s'
0001: /* $Id: invptr.c,v 1.1 2005/11/30 14:15:17 cinsk Exp $ */
0002: 
0003: struct s;
0004: 
0005: void bar(struct s *);
0006: 
0007: void
0008: foo(void)
0009: {
0010:   struct s *p;
0011:   bar(p + 1);
0012: }
0013: 

involdstyle2.c

함수를 선언할 때, ANSI 표준(현재 ISO 표준) 방식과 ANSI 이전 방식 중 하나를 쓸 수 있습니다. 전자의 경우, 함수의 리턴 타입과, 파라메터 (이름과) 타입을 기록하는 것이고, 후자의 경우, 파라메터 리스트를 쓰지 않습니다. 즉, 후자를 쓸 경우, 함수 이름 뒤에 "()"만 써 줍니다. 예제에서는 함수 foo()의 첫번째 파라메터의 타입을 쓰지 않았기 때문에 이 에러가 발생했습니다.

involdstyle2.c:3: warning: parameter names (without types) in function declaration
0001: /* $Id: involdstyle2.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: 
0003: int foo(i);
0004: 

involdstyle.c

오래된 방식으로 선언한 함수에서, 파라메터들은 초기값을 가질 수 없습니다.

involdstyle.c: In function 'foo':
involdstyle.c:4: error: parameter 'i' is initialized
involdstyle.c:6: warning: control reaches end of non-void function
0001: /* $Id: involdstyle.c,v 1.1 2005/11/29 08:37:26 cinsk Exp $ */
0002: 
0003: char foo(i)
0004:      int i = 3;
0005: {
0006: }
0007: 

invmacro.c

Macro 이름은 올바른 C 언어 identifier를 써야 합니다. 즉, 첫글자는 밑줄 문자('_') 또는 알파벳을 써야 하고, 두번째 글자부터는 밑줄 문자, 알파벳 또는 숫자를 쓸 수 있습니다. 즉 첫 글자는 [_a-zA-Z]를 만족해야 하고, 두번째 글자부터는 [_a-zA-Z0-9]를 만족해야 합니다.

invmacro.c:3:9: error: macro names must be identifiers
0001: /* $Id: invmacro.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: 
0003: #define 3PI
0004: 

invmachmode3.c

TODO: unable to emulate '%s'

invmachmode2.c

TODO: no data type for mode `%s'

invmachmode.c

invmachmode.c:3: error: unknown machine mode 'asdf'
0001: /* $Id: invmachmode.c,v 1.1 2005/12/01 05:48:19 cinsk Exp $ */
0002: 
0003: int i __attribute__((mode(asdf)));
0004: 

invinit.c

struct이나 union으로 선언한 오브젝트에 초기값을 줄 때, (중괄호로 싸지 않는 등) 잘못된 초기값을 썼을 때, 이 에러가 발생합니다.

invinit.c:7: error: invalid initializer
0001: /* $Id: invinit.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: 
0003: 
0004: struct s {
0005:   int x;
0006:   int y;
0007: } st = 1;
0008: 

invinclude.c

#include에 쓰이는 파일 이름은 "나 <>로 둘러싸야 합니다.

invinclude.c:3:10: error: #include expects "FILENAME" or <FILENAME>
0001: /* $Id: invinclude.c,v 1.1 2005/11/29 07:03:56 cinsk Exp $ */
0002: 
0003: #include stdio.h
0004: 

invfuncinit.c

함수로 선언된 이름은 초기값을 가질 수 없습니다.

invfuncinit.c:3: error: function 'foo' is initialized like a variable
0001: /* $Id: invfuncinit.c,v 1.1 2005/11/29 08:37:26 cinsk Exp $ */
0002: 
0003: int foo(void) = 3;
0004: 

invextern2.c

함수 내부에서 extern으로 선언된 object는 초기값을 가질 수 없습니다.

invextern2.c: In function 'foo':
invextern2.c:6: error: 'inner' has both 'extern' and initializer
invextern2.c:6: warning: unused variable 'inner'
0001: /* $Id: invextern2.c,v 1.1 2005/11/29 08:37:26 cinsk Exp $ */
0002: 
0003: void
0004: foo(void)
0005: {
0006:   extern int inner = 12;
0007: }
0008: 

invextern.c

전역 변수가 extern이면서 동시에 초기값을 가지고 있을 경우에 이 경고가 발생합니다. 초기값을 주면, extern의 의미가 무시됩니다.

invextern.c:3: warning: 'outer' initialized and declared 'extern'
0001: /* $Id: invextern.c,v 1.1 2005/11/29 08:37:26 cinsk Exp $ */
0002: 
0003: extern int outer = 12;
0004: 

invexpstat.c

TODO: expression statement has incomplete type

invescape.c

문자열(string literal) 또는 문자 상수에서 '\'를 쓴 경우, '\' 뒤 문자를 특별하게 취급합니다. 이를 escape sequence라고 하는데, 쓸 수 있는 문자는 제한되어 있습니다. (예: \a, \b, \f, \n, \r, \t, \v, \", \?, \\, \' 등) 예제 코드에서 처럼, C 언어에서 알려지지 않은 문자가 escape sequence로 쓰인 경우, 이 경고가 출력되고 해당 escape sequence는 일반 문자로 취급됩니다.

invescape.c:2:9: warning: unknown escape sequence '\q'
0001: /* $Id: invescape.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: int i = '\q';
0003: 

invenum.c

Enumerator로 쓰일 수 있는 상수는 반드시 정수 타입의 값을 가져야 합니다. 실수나, 상수가 아닌 값 등을 쓴 경우 이 에러가 발생합니다.

invenum.c:4: error: enumerator value for 'AA' is not an integer constant
0001: /* $Id: invenum.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: 
0003: enum A {
0004:   AA = 0.1,
0005:   BB = 2
0006: };
0007: 

invelse.c

선택적으로 컴파일할 수 있는 전처리기(preprocessor) 지시어(directivestruct)인 #if, #elif, #else, #endif 등에서, #else와 #elif는 항상 #if ... #endif 사이에 나와야 합니다. #elif나 #else가 단독으로 쓰일 수 없습니다.

invelse.c:6:2: error: #else without #if
invelse.c:8:2: error: #endif without #if
invelse.c: In function 'foo':
invelse.c:7: warning: unused variable 'i'
0001: /* $Id: invelse.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: 
0003: void
0004: foo(void)
0005: {
0006: #else
0007:   int i = 2;
0008: #endif
0009: 
0010: };
0011: 

invelif2.c

선택적으로 컴파일할 수 있는 전처리기(preprocessor) 지시어(directivestruct)인 #if, #elif, #else, #endif 등에서, #else와 #elif는 항상 #if ... #endif 사이에 나와야 합니다. #elif나 #else가 단독으로 쓰일 수 없습니다.

invelif.c:13:2: error: #elif after #else
invelif.c:7:1: error: the conditional began here
invelif.c: In function 'foo':
invelif.c:12: warning: unused variable 'i'
0001: /* $Id: invelif2.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: 
0003: void
0004: foo(void)
0005: {
0006: #elif defined(TWO)
0007:   int i = 2;
0008: #endif
0009: 
0010: };
0011: 

invelif.c

선택적으로 컴파일할 수 있는 전처리기(preprocessor) 지시어(directivestruct)인 #if, #elif, #else, #endif 등에서, #elif는 항상 #else 앞에 나와야 합니다.

invelif.c:13:2: error: #elif after #else
invelif.c:7:1: error: the conditional began here
invelif.c: In function 'foo':
invelif.c:12: warning: unused variable 'i'
0001: /* $Id: invelif.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: 
0003: 
0004: void
0005: foo(void)
0006: {
0007: #if defined(ONE)
0008:   int i = 1;
0009: #elif defined(TWO)
0010:   int i = 2;
0011: #else
0012:   int i = 3;
0013: #elif defined(FOUR)
0014:   int i = 4;
0015: #endif
0016: };
0017: 

invdirective.c

잘못된 전처리기(preprocessor) 지시어(directive)를 쓴 경우에 이 에러가 발생합니다.

invdirective.c:3:2: error: invalid preprocessing directive #ABC
0001: /* $Id: invdirective.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: 
0003: #ABC
0004: 

invderef.c

단항 연산자(unary operator)인 *는 포인터 앞에서 이 포인터가 가리키는 대상을 가리키기 위해서(dereferencing) 쓰입니다. * 연산자가 포인터가 아닌 타입에 쓰이면 이 에러가 발생합니다.

invderef.c: In function 'foo':
invderef.c:7: error: invalid type argument of 'unary *'
0001: /* $Id: invderef.c,v 1.1 2005/11/30 14:15:17 cinsk Exp $ */
0002: 
0003: void
0004: foo(void)
0005: {
0006:   int i;
0007:   *i = 3;
0008: }
0009: 

invdefined.c

전처리기(preprocessor)의 연산자인 defined는 매크로 이름으로 쓰일 수 없으며, 정의를 취소할 수도 없습니다.

invdefined.c:3:8: error: "defined" cannot be used as a macro name
invdefined.c:4:9: error: "defined" cannot be used as a macro name
0001: /* $Id: invdefined.c,v 1.1 2005/11/30 14:15:17 cinsk Exp $ */
0002: 
0003: #undef defined
0004: #define defined abc
0005: 

invdefine.c

invdefine.c:3:14: error: missing ')' in macro parameter list
0001: /* $Id: invdefine.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: 
0003: #define max(a
0004: 

invdefault.c

default 키워드는 switch 블럭 안에서만 쓸 수 있습니다.

invdefault.c: In function 'foo':
invdefault.c:6: error: 'default' label not within a switch statement
0001: /* $Id: invdefault.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: 
0003: void
0004: foo(void)
0005: {
0006:  default:
0007:    ;
0008: }
0009: 

invcont.c

continue 키워드는 루프 (예: for, while. do-while) 안에서만 의미가 있습니다. 루프 밖에서 쓰는 것은 옳지 않습니다.

invcont.c: In function 'foo':
invcont.c:6: error: continue statement not within a loop
0001: /* $Id: invcont.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: 
0003: void
0004: foo(void)
0005: {
0006:   continue;
0007: }
0008: 

invcase3.c

case label에 쓰일 수 있는 식(expression)은 정수 상수식(integer constant expression)입니다. 실수나 문자열 등을 쓸 수 없습니다. 정수가 아닌 다른 타입을 써야 한다면 if 등을 써야 합니다.

invcase3.c: In function 'foo':
invcase3.c:9: error: case label does not reduce to an integer constant
invcase3.c:10: error: case label does not reduce to an integer constant
0001: /* $Id: invcase3.c,v 1.1 2005/12/01 05:48:19 cinsk Exp $ */
0002: 
0003: void
0004: foo(void)
0005: {
0006:   char c;
0007: 
0008:   switch (c) {
0009:   case 0.3:
0010:   case "sadf":
0011:     ;
0012:   }
0013: }
0014: 

invcase2.c

case는 switch 블럭 안에서만 쓸 수 있습니다.

invcase2.c: In function 'foo':
invcase2.c:6: error: case label not within a switch statement
0001: /* $Id: invcase2.c,v 1.1 2005/11/30 14:15:17 cinsk Exp $ */
0002: 
0003: void
0004: foo(void)
0005: {
0006:   case 0xffffffff:
0007:     ;
0008: }
0009: 

invcase.c

switch 문에서 쓴 데이터 타입의 범위를 벗어나는 case 상수식을 쓴 경우..

invcase.c: In function 'foo':
invcase.c:9: warning: overflow in implicit constant conversion
0001: /* $Id: invcase.c,v 1.1 2005/11/30 14:15:17 cinsk Exp $ */
0002: 
0003: void
0004: foo(void)
0005: {
0006:   char c;
0007: 
0008:   switch (c) {
0009:   case 0xffffffffffffLL:
0010:     ;
0011:   }
0012: }
0013: 

invbreak.c

break 키워드는 switch, while, do-while, for 내부에서만 쓰일 수 있습니다. 다른 곳에서 쓸 경우, 이 에러가 발생합니다.

invbreak.c: In function 'foo':
invbreak.c:6: error: break statement not within loop or switch
0001: /* $Id: invbreak.c,v 1.1 2005/11/29 07:03:56 cinsk Exp $ */
0002: 
0003: void
0004: foo(void)
0005: {
0006:   break;
0007: }
0008: 

invbitfield4.c

Bit field에 sizeof 연산자를 쓸 수 없습니다.

invbitfield4.c: In function 'foo':
invbitfield4.c:11: error: 'sizeof' applied to a bit-field
0001: /* $Id: invbitfield4.c,v 1.1 2005/11/30 14:15:17 cinsk Exp $ */
0002: 
0003: struct s {
0004:   int i: 3;
0005: };
0006: 
0007: void
0008: foo(void)
0009: {
0010:   struct s p;
0011:   int i = sizeof(p.i);
0012:   i = 3;
0013: }
0014: 

invbitfield3.c

Bit field에, 주소를 얻어내는 'address of' 연산자인 &를 쓸 수 없습니다.

invbitfield3.c: In function 'foo':
invbitfield3.c:12: error: cannot take address of bit-field 'i'
invbitfield3.c:12: warning: unused variable 'ip'
0001: /* $Id: invbitfield3.c,v 1.1 2005/11/30 14:15:17 cinsk Exp $ */
0002: 
0003: struct s {
0004:   int i: 3;
0005: };
0006: 
0007: void
0008: foo(void)
0009: {
0010:   struct s p;
0011: 
0012:   int *ip = &p.i;
0013: }
0014: 

invbitfield2.c

Bit field에서 bit 갯수를 지정할 때, 비트의 갯수가 주어진 타입의 크기를 넘을 때 발생합니다. 크기가 큰 다른 타입을 쓰거나, bit 갯수를 줄여야 합니다

invbitfield2.c:4: error: width of 'x' exceeds its type
0001: /* $Id: invbitfield2.c,v 1.1 2005/11/29 07:03:56 cinsk Exp $ */
0002: 
0003: struct s {
0004:   char x: 30;
0005: };
0006: 
0007: 

invbitfield.c

Bit field에서 bit 갯수를 지정할 때 음수나 0을 쓸 수 없습니다.

invbitfield.c:4: error: negative width in bit-field 'x'
invbitfield.c:5: error: zero width for bit-field 'y'
0001: /* $Id: invbitfield.c,v 1.1 2005/11/29 07:03:56 cinsk Exp $ */
0002: 
0003: struct s {
0004:   int x: -3;
0005:   int y: 0;
0006: };
0007: 
0008: 

invbinop.c

두 개의 피연산자(operand)를 받는 binrary operator (예: +, -, *, /, ==, !=, <, >, <=, >=, &, |, 등)들의 피연산자의 타입은 scalar(스칼라, 즉 정수나 실수) 타입이어야 합니다. struct이나 union 타입이 올 수 없습니다.

예를 들어, 조건식(conditional expression)이 필요한 if, for, while, do-while에서 struct이나 union을 쓸 경우 이 에러가 발생합니다. 또, 서로 다른 타입의 포인터에 연산을 할 때에도 발생할 수 있습니다. 또, "? :" 연산자를 쓸 때, "e1 ? e2 : e3" 꼴에서 e1이 스칼라 타입이 아닌 경우에도 이 에러가 발생합니다.

invbinop.c: In function 'foo':
invbinop.c:11: error: invalid operands to binary !=
invbinop.c:12: error: invalid operands to binary +
invbinop.c:16: error: invalid operands to binary *
invbinop.c:17: error: invalid operands to binary -
0001: /* $Id: invbinop.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: 
0003: struct s {
0004:   int i;
0005: };
0006: 
0007: void
0008: foo(void)
0009: {
0010:   struct s p;
0011:   int i = (p != 0);
0012:   int j = p + 3;
0013:   int *ip = 0;
0014:   double *dp = 0;
0015: 
0016:   while (p * 2 + i - j) {
0017:     ip - dp;
0018:   }
0019: }
0020: 

invalignof.c

invalignof.c: In function 'foo':
invalignof.c:13: error: '__alignof' applied to a bit-field
0001: /* $Id: invalignof.c,v 1.1 2005/12/01 05:48:19 cinsk Exp $ */
0002: 
0003: struct foo {
0004:   int x;
0005:   int b: 3;
0006:   char y;
0007: };
0008: 
0009: 
0010: int
0011: foo(struct foo f)
0012: {
0013:   int i = __alignof__(f.b);
0014: 
0015:   return i;
0016: }
0017: 

invalign3.c

TODO: requested alignment is too large

invalign2.c

TODO: requested alignment is not a power of 2

invalign.c

TODO: requested alignment is not a constant

intptrassign.c

대입 연산에서 포인터 타입의 값을 졍수형 타입의 변수에 저장하려 했을때 이 경고가 발생합니다. 이 경고를 없애려면, 포인터 값을 정수형으로 강제 캐스팅해야 합니다.

intptrassign.c: In function 'foo':
intptrassign.c:9: warning: assignment makes integer from pointer without a cast
0001: /* $Id: intptrassign.c,v 1.1 2005/11/29 07:03:56 cinsk Exp $ */
0002: 
0003: void
0004: foo(void)
0005: {
0006:   char *cp;
0007:   int i;
0008: 
0009:   i = cp;
0010: }
0011: 

intoverflow.c

정수로 취급되는 expression에서 오버플로우(overflow)가 발생할 경우에 이 경고가 발생합니다.

intoverflow.c:7: warning: integer overflow in expression
0001: /* $Id: intoverflow.c,v 1.1 2005/11/29 00:25:12 cinsk Exp $ */
0002: 
0003: #include <limits.h>
0004: 
0005: enum A {
0006:   AA = INT_MAX + 1
0007: };
0008: 

intfromptr.c

함수의 N번째 파라메터가 정수 타입인데도, 캐스팅 없이 포인터를 인자로 전달한 경우에 발생합니다. 올바른 정수 타입으로 캐스팅하거나, 잘못된 인자를 썼을 가능성이 높습니다.

intfromptr.c: In function 'bar':
intfromptr.c:8: warning: passing argument 1 of 'foo' makes integer from pointer without a cast
0001: /* $Id: intfromptr.c,v 1.1 2005/11/29 07:03:56 cinsk Exp $ */
0002: 
0003: void foo(int);
0004: 
0005: void
0006: bar(void)
0007: {
0008:   foo("erroneous");
0009: }
0010: 
0011: 

incomassign.c

대입 연산에서 연산자 '='의 왼쪽, 오른쪽의 타입이 서로 완전히 다릅니다.

incomassign.c: In function 'foo':
incomassign.c:11: error: incompatible types in assignment
0001: /* $Id: incomassign.c,v 1.1 2005/11/29 07:03:56 cinsk Exp $ */
0002: 
0003: struct s {};
0004: 
0005: void
0006: foo(void)
0007: {
0008:   struct s st;
0009:   int i;
0010: 
0011:   i = st;
0012: }
0013: 

incomarg.c

함수 선언에 쓰인 파라메터 타입과 실제 전달된 인자의 타입이 서로 달라서 변환이 불가능할 경우에 발생합니다.

incomarg.c: In function 'foo':
incomarg.c:9: error: incompatible type for argument 2 of 'bar'
0001: /* $Id: incomarg.c,v 1.1 2005/11/29 07:03:56 cinsk Exp $ */
0002: 
0003: struct s { int a; } p;
0004: 
0005: void
0006: foo(void)
0007: {
0008:   void bar(int, int);
0009:   bar(5, p);
0010: }
0011: 

impldecl.c

함수가 호출되기 전에, 올바른 선언이 컴파일러에게 알려져야 합니다.

impldecl.c: In function 'foo':
impldecl.c:6: warning: implicit declaration of function 'bar'
0001: /* $Id: impldecl.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: 
0003: void
0004: foo(void)
0005: {
0006:   bar();
0007: }
0008: 
0009: 

ilii.c

`++' 연산을 쓴 대상이 lvalue가 아닐 경우에 이 에러가 발생합니다.

ilii.c: In function 'foo':
ilii.c:8: error: invalid lvalue in increment
ilii.c:9: error: invalid lvalue in increment
0001: /* $Id: ilii.c,v 1.1 2007/07/09 08:51:30 cinsk Exp $ */
0002: /* TODO: We need a better example than this */
0003: #define INITVAL 0x01
0004: void foo(void)
0005: {
0006:   int i;
0007:   int *p = &i;
0008:   ((char *)p)++ = 4;
0009:   i = INITVAL++;
0010: }
0011: 

ilid.c

`--' 연산을 쓴 대상이 lvalue가 아닐 경우에 이 에러가 발생합니다.

ilid.c: In function 'foo':
ilid.c:8: error: invalid lvalue in increment
ilid.c:9: error: invalid lvalue in increment
0001: /* $Id: ilid.c,v 1.1 2007/07/09 08:51:30 cinsk Exp $ */
0002: /* TODO: We need a better example than this */
0003: #define INITVAL 0x01
0004: void foo(void)
0005: {
0006:   int i;
0007:   int *p = &i;
0008:   ((char *)p)++ = 4;
0009:   i = INITVAL++;
0010: }
0011: 

ilia.c

대입(assignment) 문장에서 왼편이 lvalue가 아닐 경우에 이 에러가 발생합니다.

ilia.c: In function 'foo':
ilia.c:7: error: invalid lvalue in assignment
ilia.c:8: error: invalid lvalue in assignment
0001: /* $Id: ilia.c,v 1.1 2007/07/09 08:51:30 cinsk Exp $ */
0002: /* TODO: We need a better example than this */
0003: void foo(void)
0004: {
0005:   int i;
0006:   int *p = &i;
0007:   (char *)p = 4;
0008:   1234 = 4;
0009: }
0010: 

globalregs.c

register 키워드는 가능한 시스템의 register를 쓰도록 권유하는 것으로, 전역 변수에 쓰일 수 없습니다. [설명 보충 및 수정]

globalregs.c:3: error: register name not specified for 'global_regs'
0001: /* $Id: globalregs.c,v 1.1 2005/11/29 07:03:56 cinsk Exp $ */
0002: 
0003: register int global_regs;
0004: 

globalauto.c

auto 키워드는 automatic variable을 선언하기 위한 것으로, 전역 변수에 쓰일 수 없습니다. 또한 완벽히 생략 가능한 키워드이므로, 이 키워드를 쓸 이유가 없습니다.

globalauto.c:3: error: file-scope declaration of 'global_auto' specifies 'auto'
0001: /* $Id: globalauto.c,v 1.1 2005/11/29 07:03:56 cinsk Exp $ */
0002: 
0003: auto int global_auto;
0004: 

floatfunc.c

TODO: error: non-floating-point argument to function `%s'

fewarg.c

함수 선언에 쓰인 파라메터의 갯수보다 실제 전달된 인자의 갯수가 적을 경우에 발생합니다.

fewarg.c: In function 'foo':
fewarg.c:8: error: too few arguments to function 'bar'
0001: /* $Id: fewarg.c,v 1.1 2005/11/29 07:03:56 cinsk Exp $ */
0002: 
0003: void bar(int, int);
0004: 
0005: void
0006: foo(void)
0007: {
0008:   bar(5);
0009: }
0010: 

error.c

이 에러는 컴파일러에게 소스가 전달되기 전, 전처리기(preprocessor)에 의해 발생합니다. Preprocessor는 #error로 시작하는 문장을 만나면, 바로 처리를 멈추고, "#error ..."를 출력합니다. 이는 대개, 프로그램 소스가 특별한 환경을 요구하는 경우, (예: 컴파일하기 적당하지 않은 경우) 그 조건을 만족하지 못했을 때, 도움말을 출력하는 목적으로 쓰입니다.

ISO C에서는 미리 정의된(predefined) 매크로 상수를 정의하고 있고, 컴파일러에 따라 추가적으로 더 제공합니다. #error의 경우, 이런 매크로들과 같이 쓰이는 경우가 일반적이므로 자세한 것은 Predefined Macros를 참고하기 바랍니다.

error.c:3:2: error: #error Abracadabra..
0001: /* $Id: error.c,v 1.1 2005/11/29 00:25:12 cinsk Exp $ */
0002: 
0003: #error Abracadabra..
0004: 

emptyinclude.c

#include directive에서 파일 이름이 주어지지 않았을 때 발생합니다.

emptyinclude.c:2:12: error: empty filename in #include
0001: /* $Id: emptyinclude.c,v 1.1 2005/11/29 00:25:12 cinsk Exp $ */
0002: #include <>
0003: 

emptyifdef.c

전처리기 지시어(preprocessor directive)인 #ifdef 뒤에는 이름(identifier)이 나와야 합니다.

emptyifdef.c:3:7: error: no macro name given in #ifdef directive
0001: /* $Id: emptyifdef.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: 
0003: #ifdef
0004:   int i = 0;
0005: #endif

emptyif.c

전처리기 지시어(preprocessor directive)인 #if 뒤에는 상수식(constant-expression)이 나와야 합니다.

emptyif.c:3:4: error: #if with no expression
0001: /* $Id: emptyif.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: 
0003: #if
0004:   int i = 0;
0005: #endif
0006: 

emptyconst.c

빈 문자 상수가 쓰였을 때 이 에러가 발생합니다.

emptyconst.c:2:9: error: empty character constant
0001: /* $Id: emptyconst.c,v 1.1 2005/11/29 00:25:12 cinsk Exp $ */
0002: int i = '';
0003: 

dupmember.c

struct이나 union에서 같은 이름이 두 개 이상의 멤버에서 쓰였을 때 이 에러가 발생합니다. 각각 다른 이름을 써서 이 에러를 없앨 수 있습니다.

dupmember.c:5: error: duplicate member 'i'
0001: /* $Id: dupmember.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: 
0003: struct s {
0004:   int i;
0005:   float i;
0006: };
0007: 

dupmacro.c

매크로를 정의할 때, 같은 이름을 두 인자에 대해 썼을 경우, 이 에러가 발생합니다.

dupmacro.c:2:17: error: duplicate macro parameter "a"
0001: /* $Id: dupmacro.c,v 1.1 2005/11/29 00:25:12 cinsk Exp $ */
0002: #define ADD3(a, a, c)   ((a) + (b) + (c))
0003: 

dupdefault.c

한 switch 블럭에서 default label이 두 개 이상 있을 경우 이 에러가 발생합니다. default label은 한 switch 블럭에서 하나만 존재할 수 있습니다.

dupdefault.c: In function 'foo':
dupdefault.c:14: error: multiple default labels in one switch
dupdefault.c:9: error: this is the first default label
0001: /* $Id: dupdefault.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: 
0003: void
0004: foo(void)
0005: {
0006:   int a = 3;
0007: 
0008:   switch (a) {
0009:   default:
0010:     break;
0011:   case 1:
0012:   case 2:
0013:     break;
0014:   default:
0015:     break;
0016:   }
0017: }
0018: 

dupcase.c

두 case label에서 같은 상수 값이 쓰였을 때 발생합니다. 예제 코드의 경우, 1이 두 번 쓰였고, 매크로 CAT과 DOG은 0으로 변환되어 결국 0이 두 번 쓰인 경우입니다.

dupcase.c: In function 'foo':
dupcase.c:13: error: duplicate case value
dupcase.c:12: error: previously used here
dupcase.c:15: error: duplicate case value
dupcase.c:14: error: previously used here
0001: /* $Id: dupcase.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: 
0003: #define CAT     0
0004: #define DOG     0
0005: 
0006: void
0007: foo(void)
0008: {
0009:   int a = 3;
0010: 
0011:   switch (a) {
0012:   case 1:
0013:   case 1:
0014:   case CAT:
0015:   case DOG:
0016:   default:
0017:     break;
0018:   }
0019: }
0020: 

derefvoidptr.c

void 포인터는 다른 타입의 포인터로 캐스팅하기 전에, 이 포인터가 가리키고 있는 것을 읽으려하면 안됩니다. 즉 dereferencing할 수 없습니다. 이 에러를 해결하려면, void 포인터를 다른 형태로 캐스팅해서 쓰면 됩니다.

derefvoidptr.c: In function 'foo':
derefvoidptr.c:9: warning: dereferencing 'void *' pointer
derefvoidptr.c:9: error: void value not ignored as it ought to be
0001: /* $Id: derefvoidptr.c,v 1.1 2005/11/29 07:03:56 cinsk Exp $ */
0002: 
0003: void
0004: foo(void)
0005: {
0006:   void *p;
0007:   int i;
0008: 
0009:   i = *p;
0010:   i = *(int *)p;
0011: }
0012: 

derefincom.c

(선언은 되었을 수 있으나) 정의되지 않은 타입을 가리키는 포인터에 dereference 연산자인 *를 쓸 수 없습니다. 이런 경우는 쓰고자 하는 타입에 대한 정의를 #include 등을 통해서 포함시켜 주면 됩니다.

derefincom.c: In function 'foo':
derefincom.c:11: warning: implicit declaration of function 'g'
derefincom.c:11: error: dereferencing pointer to incomplete type
0001: /* $Id: derefincom.c,v 1.1 2005/11/29 07:03:56 cinsk Exp $ */
0002: 
0003: struct s;
0004: 
0005: void bar(struct s *);
0006: 
0007: void
0008: foo(void)
0009: {
0010:   struct s *p;
0011:   g(*p);
0012: }
0013: 

ctntr.c

`--' 연산을 쓴 대상이 lvalue가 아닐 경우에 이 에러가 발생합니다.

ctntr.c: In function 'foo':
ctntr.c:7: error: conversion to non-scalar type requested
ctntr.c:7: warning: unused variable 'foo'
0001: /* $Id: ctntr.c,v 1.1 2007/07/10 08:03:44 cinsk Exp $ */
0002: /* TODO: We need a better example than this */
0003: struct s {};
0004: 
0005: void foo(void)
0006: {
0007:   struct s foo = (struct s) 10;
0008: }
0009: 

conftype.c

이름을 선언할 때, 같은 이름을 서로 다른 타입으로 선언하면 이 에러가 발생합니다.

conftype.c:4: error: conflicting types for 'i'
conftype.c:3: error: previous declaration of 'i' was here
conftype.c:7: error: conflicting types for 'foo'
conftype.c:6: error: previous declaration of 'foo' was here
0001: /* $Id: conftype.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: 
0003: int i;
0004: long i;
0005: 
0006: void foo(void);
0007: int foo(void);

cleanup2.c

TODO: cleanup arg not a function

cleanup.c

TODO: cleanup arg not an identifier

charwide.c

Wide character 상수는 문자 상수나 문자열 앞에 'L'을 붙여 나타내며 이 타입은 wchar_t 입니다. 이 에러는 wchar_t 타입의 문자열을 char 타입의 배열에 초기값으로 썼을 경우에 발생합니다. 따라서 배열을 wchar_t type으로 바꾸거나 char 타입의 문자열 상수를 써서 (즉 'L'을 빼서) 이 에러를 수정할 수 있습니다.

charwide.c:3: error: char-array initialized from wide string
0001: /* $Id: charwide.c,v 1.2 2005/11/30 14:15:17 cinsk Exp $ */
0002: 
0003: char a[] = L"abc";
0004: 

charrange.c

문자 상수나 문자열에 쓰인 escape sequence가 너무 큰 값을 가지고 있어 표현할 수 없을 때, 이 경고가 발생합니다. 이러한 값들은 적당하게 잘라집니다(truncate).

charrange.c:3:11: warning: hex escape sequence out of range
charrange.c:3:11: warning: octal escape sequence out of range
0001: /* $Id: charrange.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: 
0003: char *p = "\x1ff\400";
0004: 

charlong.c

charlong.c:3:9: warning: character constant too long for its type
0001: /* $Id: charlong.c,v 1.1 2005/11/30 05:10:08 cinsk Exp $ */
0002: 
0003: int i = 'abcde';
0004: 

callnfunc.c

함수처럼 썼으나, 함수가 아닌 경우입니다. 예제에서 보다시피, p의 타입은 char 타입을 가리키는 포인터인데, 함수처럼 쓴 경우에 발생합니다.

callnfunc.c: In function 'foo':
callnfunc.c:8: error: called object 'p' is not a function
0001: /* $Id: callnfunc.c,v 1.1 2005/11/29 07:03:56 cinsk Exp $ */
0002: 
0003: void
0004: foo(void)
0005: {
0006:   char *p;
0007: 
0008:   p();
0009: }
0010: 

array-too-long.c

지정한 배열의 길이보다 초기값의 길이가 더 클 경우, 이 경고가 발생합니다.

array-too-long.c:2: warning: initializer-string for array of chars is too long
0001: /* $Id: array-too-long.c,v 1.1 2005/11/29 00:25:12 cinsk Exp $ */
0002: char ca[3] = "abcd";
0003: 

Any Browser Campaign Valid CSS! Valid XHTML 1.0!
Emacs Powered Graphics by GIMP Vim Powered