¸®ÆÑÅ丵 - ¸ðµç °æ°í¸Þ½ÃÁö¸¦ üũÇ϶ó.
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

³ª °°Àº °æ¿ì ÀÏ´Ü µ¹¾Æ°¡´Â Äڵ带 ¸¸µé°í µ¹¾Æ°¡´ÂÁö ´«À¸·Î È®ÀÎÇÑ´ÙÀ½ ¼ÕÀ» º¸´Â ½ºÅ¸ÀÏÀ̶ó¼­, ³ªÁß¿¡ ¸¹Àº ÀܼÕÁú - °ÅâÇÏ°Ô ¸®ÆÑÅ丵 -À» ÇÏ°Ô µÈ´Ù. À̶§ ¸ðµâÈ­¿Í ÇÔ²² °¡Àå¸ÕÀú ¼Õ½±°Ô ÁøÇàÇÒ ¼ö ÀÖ´Â°Ô °æ°í¸Þ½ÃÁö¸¦ Á¦°ÅÇÏ´Â °ÍÀÌ´Ù. ÀÌ ¹®¼­´Â gcc 4.0.x ¸¦ ±âÁØÀ¸·Î ÀÛ¼ºµÇ¾ú´Ù.

gcc¶ó¸é ´ÙÀ½°ú °°Àº ¿É¼ÇÀ» ÀÌ¿ëÇØ¼­ °æ°í¸Þ½ÃÁö¸¦ Ãâ·ÂÇϵµ·Ï ÇÒ ¼ö ÀÖ´Ù.
# gcc -Wall -c testcode.c 
# gcc -W -c testcode testcode.c 
... 
 
º¸ÅëÀº -Wall ¿É¼Ç¸¸À» »ç¿ëÇÏ´Â °æ¿ì°¡ ¸¹À» °ÍÀÌ´Ù. ±×·¯³ª °æ°í¸Þ½ÃÁö´Â ´Ù¾çÇÑ ¿µ¿ªÀ» °¡Áö°í ÀÖÀ¸´Ù. -Wall ÀÇ all¿¡ ¼ÓÁö ¸»±â ¹Ù¶õ´Ù. allÀ̶ó´Â ´Ü¾î°¡ ºÙÀº°Í °ú´Â ´Ù¸£°Ô, ÀϺοµ¿ªÀÇ °æ°í¸Þ½ÃÁö¸¸À» Ãâ·ÂÇØÁØ´Ù. ¿¹¸¦ µé¸é ¾Æ·¡¿Í °°ÀÌ ¸®ÅϰªÀÌ ¸í½ÃµÇÁö ¾ÊÀº °æ¿ì °æ°í¸Þ½ÃÁö¸¦ Ãâ·ÂÇÑ´Ù.
int foo (unsigned int x) 
{ 
  int y; 
  if (y < x) x=x+2; 
  else x= x+1; 
} 
 

-Wall ¿É¼ÇÀ» ÁÖ°í ÄÄÆÄÀÏ ÇØº¸ÀÚ.
# gcc -Wall -c foo.c  
foo.c: In function `foo': 
foo.c:6: warning: control reaches end of non-void function 
 
±×·¯³ª if (y < x)¿¡¼­ unsigned¿Í signed¿ÍÀÇ ºñ±³¿Í °°Àº °æ°í´Â Àâ¾Æ³»Áö ¾Ê´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. °á±¹ ¸ðµç °æ°í¸Þ½ÃÁö¸¦ ¾ø¾Ö°í ½Í´Ù¸é, ´Ù¾çÇÑ Á¾·ùÀÇ °æ°í¿É¼ÇÀ» ÇÔ²² »ç¿ëÇØ¾ß ÇÑ´Ù.

-W

signed ¿Í unsignedÀÇ ºñ±³. Á¶°Ç¹®¿¡¼­ body°¡ ¸í½ÃµÇÁö ¾Ê°Å³ª, °áÄÚµµ´ÞÇÒ ¼ö ¾ø´Â Á¶°Ç¹®µîÀ» ã¾Æ³¾ ¼ö ÀÖ´Ù. ¾Æ·¡ÀÇ ÄÚµå´Â ÄÄÆÄÀÏµÇ°í ½ÇÇàµÇ´Âµ¥ ÀüÇô ¹®Á¦´Â ¾øÀ» °ÍÀÌ´Ù. ±×·¯³ª if (x < 0) ¹®Àº °áÄÚ ¸¸Á·ÇÒ ¼ö ¾ø´Ù. ÀÌ·¯ÇÑ ÄÚµå´Â ¹ö±×¸¦ ¸¸µé¾î³¾ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
int foo (unsigned int x) 
{ 
  if (x < 0) 
    return 0;  // °áÄÚ µµ´ÞÇÒ ¼ö ¾ø´Ù.  
  else 
    return 1; 
} 
 
-Wall ¿É¼ÇÀ» ÀÌ¿ëÇÏ¸é °æ°í¸Þ½ÃÁö°¡ Ãâ·ÂµÇÁö ¾ÊÀ» °ÍÀÌ´Ù.
# gcc -Wall -c foo.c 
 
±×·¯³ª -W ¿É¼ÇÀ» ÀÌ¿ëÇÏ¸é ´ÙÀ½°ú °°Àº °æ°í¸Þ½ÃÁö°¡ Ãâ·ÂµÇ´Â°É È®ÀÎÇÒ ¼ö ÀÖ´Ù.
# gcc -W -c foo.c 
foo.c: In function `foo': 
foo.c:4: warning: comparison of unsigned expression < 0 is always false 
 

ÀϹÝÀûÀ¸·Î -W ¿É¼ÇÀº -Wall ¿É¼Ç°ú ÇÔ²² »ç¿ëÇÑ´Ù.

-Wconversion

ÀÌ ¿É¼ÇÀº Çüº¯È¯(type conversion)°ú °ü·ÃµÇ¾î¼­ À߸ø »ç¿ëµÈ Äڵ忡 ´ëÇÑ °æ°í¸¦ Àâ¾Æ³½´Ù. floating-point¿Í integer, long°ú short integers »çÀÌÀÇ Çüº¯È¯°ú °°Àº °ÍµéÀÌ´Ù. ¿¹¸¦ µé¾î¼­ abs()´Â ½Ç¼öÇü Á¤¼ö¿¡ ´ëÇØ¼­ Àý´ë°ªÀ» ¸®ÅÏÇÏ´Â ÇÔ¼öÀÌ´Ù. ¸¸¾à ÀÎÀÚ·Î float°ªÀ» ÀÔ·ÂÇÑ´Ù¸é ¿øÇÏÁö ¾Ê´Â °á°ú°¡ Ãâ·ÂµÉ °ÍÀÌ´Ù.
#include <stdio.h> 
#include <stdlib.h> 
 
int main (void) 
{ 
  double x = -3.14; 
  double y = abs(x);  /* fabs(x)¸¦ »ç¿ëÇØ¾ß ÇÔ. */ 
  printf ("x = %g |x| = %g\n", x, y); 
  return 0; 
} 
 
-Wall ¿É¼ÇÀ» ÁÖ°í ÄÄÆÄÀÏ Çϸé, °æ°í¸Þ½ÃÁö¸¦ Ãâ·ÂÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. ±×·¯³ª ÇÁ·Î±×·¥À» ½ÇÇà½Ã۸é À߸øµÈ °á°ú¸¦ º¸¿©ÁÖ°Ô µÈ´Ù.
# gcc -Wall -o abs abs.c 
# ./abs 
x = -3.14 |x| = 3 
 

ÀÌÁ¦ -Wconversion ¿É¼ÇÀ» ÁÖ°í ½ÇÇà½ÃÄÑ º¸ÀÚ.
# gcc -Wconversion -o abs abs.c 
abs.c: In function ¡®main¡¯: 
abs.c:7: warning: passing argument 1 of ¡®abs¡¯ as integer rather than  
    floating due to prototype 
 
abs() ÇÔ¼ö´ë½Å¿¡ fabs()ÇÔ¼ö¸¦ ÀÌ¿ëÇϸé, À§ ÄÚµåÀÇ ³í¸®Àû¿À·ù¸¦ ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù.

ÀÌ ¿Ü¿¡µµ -Wconversion ¿É¼ÇÀº º¯¼ö¿¡ À߸øµÈ °ªÀ» ÇÒ´çÇÏ´Â ¿À·ùµµ ã¾Æ³½´Ù.
unsigned int x = -1; 
 
±â¼úÀûÀ¸·Î ANSI/ISO C Ç¥ÁØÀº À§ÀÇ Äڵ带 Çã¿ëÇÑ´Ù. ±×·¯¹Ç·Î ´ëºÎºÐÀÇ ÄÄÆÄÀÏ·¯°¡ ¿¡·¯¾øÀÌ ÄÄÆÄÀÏÀ» ÇØÁØ´Ù. ±×·¯³ª Äڵ尡 Á¦´ë·Î ÀÛµ¿ÇÒÁö´Â º¸ÀåÇÒ ¼ö ¾ø´Ù.

-Wshadow

À̰ÍÀº ¼±¾ðµÈ º¯¼ö¸íÀ» ´Ù¸¥ scope¿¡¼­ ´Ù½Ã ¼±¾ðÇÑ °æ¿ì °æ°í¸¦ ¹ß»ý½ÃŲ´Ù. ÀÌ·¸°Ô º¯¼ö°¡ ¼±¾ðµÉ °æ¿ì À̰ÍÀ» shadowingº¯¼ö¶ó°í ÇÑ´Ù. ´ÙÀ½ÀÇ Äڵ带 È®ÀÎÇØ º¸µµ·Ï ÇÏÀÚ.
#include <stdio.h> 
double test (double x) 
{ 
  double y = 1.0; 
  { 
    double y; 
    y = x; 
  } 
  return y; 
} 
int main (void) 
{ 
  printf("%lf\n", test(5.0)); 
} 
 
2°³ÀÇ scope¿¡¼­ yº¯¼ö°¡ ¼±¾ðµÇ¾úÀ½À» ¾Ë ¼ö ÀÖ´Ù. À̰æ¿ì ºñ·Ï À̸§Àº °°Áö¸¸, scope°¡ ´Ù¸£¹Ç·Î ÀüÇô´Ù¸¥ º¯¼ö À̸§ Å×À̺íÀ» °¡Áö°Ô µÈ´Ù. ´ç½ÅÀÌ »ç¿ëÇÏ´Â ÄÄÆÄÀÏ·¯°¡ ANSI/ISO C¸¦ ÁؼöÇÑ´Ù¸é, 1À» ¸®ÅÏÇÒ °ÍÀÌ´Ù. shadowing º¯¼öÀÇ »ç¿ëÀÚü°¡ ¹®Á¦°¡ µÇ´Â°Ç ¾Æ´ÏÁö¸¸, º¸ÅëÀÇ °æ¿ì ½Ç¼ö·Î »ç¿ëÇÏ´Â °æ¿ì°¡ ¸¹À¸¹Ç·Î -Wshadow ¿É¼ÇÀ» ÀÌ¿ëÇØ¼­ Á¦°ÅÇϵµ·Ï ÇÏÀÚ.
# gcc -Wshadow -o abs abs.c 
abs.c: In function ¡®test¡¯: 
abs.c:7: warning: declaration of ¡®y¡¯ shadows a previous local 
 

-Wcast-qual

const¿Í °°Àº ŸÀÔ Á¦ÇÑÀÚ¸¦ À߸ø »ç¿ëÇßÀ» °æ¿ì °æ°í¸Þ½ÃÁö¸¦ Ãâ·ÂÇÑ´Ù. ¾Æ·¡ÀÇ ÄÚµå¿Í °°Àº °æ¿ì´Ù.
#include <stdio.h> 
 
void f (const char * str) 
{ 
  char * s = (char *)str; 
  s[0] = '\0'; 
} 
 
int main() 
{ 
  char *a = "hello World"; 
  f(a); 
} 
 
ÀÌ ÇÁ·Î±×·¥Àº ¾Æ¹«·± ¹®Á¦¾øÀÌ ÄÄÆÄÀÏ µÉ °ÍÀÌ´Ù. ±×·¯³ª ½ÇÇà½Ã۸é segmentation fault¸¦ Ãâ·ÂÇϰí Á¾·áµÇ¾î ¹ö¸± °ÍÀÌ´Ù. ¿ÀÈ÷·Á À§ÀÇ °æ¿ì´Â ÇÁ·Î±×·¥ÀÌ Á×¾î¹ö¸²À¸·Î Áï½Ã ¹®Á¦¸¦ ãÀ» ¼ö ÀÖÀ¸´Ï Å« ¹®Á¦°¡ µÇÁö ¾ÊÀ» °ÍÀÌ´Ù. ´ÙÀ½°ú °°Àº °æ¿ì°¡ ¹®Á¦°¡ µÈ´Ù.
int main() 
{ 
  char a[] = "hello World"; 
  f(a); 
  printf("%s\n", a); 
} 
 
¿ì¸®°¡ f ÇÔ¼öÀÇ ÀÎÀÚ¸¦ const ·Î ÇѰÍÀº strÀÌ º¯°æµÇ´Â°É ¸·±â À§ÇÑ ¸ñÀûµµ °¡Áö°í ÀÖÀ» °ÍÀÌ´Ù. ±×·±µ¥ À§ÀÇ °æ¿ì ÀǵµÇÏÁö ¾Ê°Ô strÀÌ º¯°æµÇ¾î ¹ö¸®°Ô µÈ´Ù. -Wcast-qual ¿É¼ÇÀ» ÀÌ¿ëÇϸé ÀÌ·¯ÇÑ ¹®Á¦¸¦ »çÀü¿¡ ¿¹¹æÇÒ ¼ö ÀÖ´Ù.
# gcc -Wcast-qual -o f f.c 
f.c: In function ¡®f¡¯: 
f.c:5: warning: cast discards qualifiers from pointer target type 
 

-Wtraditional

´ëºÎºÐÀÇ ÄÄÆÄÀÏ·¯´Â ANSI/ISO Ç¥ÁØÀ» µû¸£Áö¸¸, Á» ´õ À¯¿¬ÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖµµ·Ï È®ÀåµÈ ºÎºÐÀÌ ÀÖ´Ù. ÀÌ ¿É¼ÇÀ» ÁÖ¸é ANSI/ISOÀÇ Ç¥ÁØÀ» ¾ö°ÝÇÏ°Ô °Ë»çÇϰí ÀÌ¿¡ ´ëÇÑ °æ°í¸Þ½ÃÁö¸¦ Ãâ·ÂÇÑ´Ù. ÀÌ ±âÁ¾°£ ȣȯµÇ´Â Äڵ带 ÀÛ¼ºÇϰíÀÚ ÇÑ´Ù¸é °í·ÁÇØº¼¸¸ ÇÏ´Ù.

°æ°í¸Þ½ÃÁö Á¦°Å

ÀÌÁ¦ À§¿¡ ¾ð±ÞµÈ ¿É¼ÇÀ» ÀÌ¿ëÇØ¼­ parse.cc¸¦ ÄÄÆÄÀÏ ÇØº¸µµ·Ï ÇÏÀÚ. parse.cc´Â µÎ¹øÀÇ ¸®ÆÑÅ丵 °úÁ¤ÀÌ ³¡³­ ÄÚµå·Î ¸®ÆÑÅ丵 - ¸ðµâÈ­¹®¼­ÀÇ Äڵ带 »ç¿ëÇÒ °ÍÀÌ´Ù.

# g++ -W -Wall -Wcast-qual -Wshadow -o parse parse.cc 
parse.cc: In function `char* html_trim(char*, char*, int)': 
parse.cc:54: warning: unused variable `char specia[10]' 
parse.cc: In function `int main(int, char**)': 
parse.cc:87: warning: declaration of `lt_flag' shadows a global declaration 
parse.cc:22: warning: shadowed declaration is here 
parse.cc:83: warning: unused variable `int ridx' 
parse.cc:84: warning: unused variable `int widx' 
parse.cc:87: warning: unused variable `int lt_flag' 
parse.cc:96: warning: unused variable `int tag_status' 
 
´ëºÎºÐ ¼±¾ð¸¸ ÇÏ°í »ç¿ëÇÏÁö ¾Ê´Â º¯¼ö¿¡ °üÇÑ °æ°íÀ̰í, shadows º¯¼ö»ç¿ë¿¡ µû¸¥ °æ°í°¡ ¹ß°ßµÇ¾ú´Ù.

´ÙÀ½Àº °æ°í°¡ ¹ß»ýÇÑ ºÎºÐÀ» ¸ðµÎ Á¤¸®ÇÑ ÄÚµå´Ù.
#include <stdio.h> 
#include <sys/types.h> 
#include <string.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <sys/stat.h> 
#include <stdlib.h> 
 
using namespace std; 
 
const int MAX_BUF_SIZE=1024; 
 
enum tag_token {TAG_LT = '<', TAG_GT='>'}; 
 
void help() 
{ 
  printf("Usage : ./parse [-h] [-f FILENAME]\n"); 
  printf("-f : Input Source File\n"); 
  printf("-h : This Message\n"); 
} 
 
int lt_flag = 0; 
 
char *html_trim(char *src, char *dst, int size) 
{ 
  int ridx = 0; 
  int widx = 0; 
 
  while(ridx < size) 
  { 
    if (src[ridx] == TAG_LT) 
    { 
      lt_flag++; 
    } 
    if (src[ridx] == TAG_GT) 
    { 
      lt_flag--; 
      if (lt_flag == 0) 
      { 
        ridx++; 
        continue; 
      } 
    } 
 
    if (lt_flag == 1) 
    { 
      ridx++; 
      continue; 
    } 
 
    if(src[ridx] == '&') 
    { 
      unsigned int i = 0; 
      char specia[10] = {0x00,}; 
      for (i = 0; i < 10; i++) 
      { 
        if (src[ridx+i] == ';') 
        { 
          ridx= (ridx+i); 
          break; 
        } 
      } 
    } 
 
    if (src[ridx] == '\n' || src[ridx] =='\r') 
    { 
      dst[widx] = ' '; 
    } 
    else 
    { 
      dst[widx] = src[ridx]; 
    } 
    widx++; 
    ridx++; 
  } 
  return dst; 
} 
 
int main(int argc, char **argv) 
{ 
  int fd; 
  int readn; 
  int ridx; 
  int widx; 
  char rbuf[MAX_BUF_SIZE] = {0x00,}; 
  char wbuf[MAX_BUF_SIZE] = {0x00,}; 
  int lt_flag = 0; 
  int test_argv=0; 
  int c; 
  char *src_file; 
 
  // used tokenizing 
  char seps[] = "()|{}, \t.;&-[]\"\':`+#="; 
  char *tr; 
 
  int tag_status = 0; 
  int offset = 0; 
 
  while((c = getopt(argc, argv, "hf:")) != -1) 
  { 
    switch(c) 
    { 
      case 'h': 
        break; 
      case 'f': 
        src_file = optarg; 
        test_argv = 1; 
        break; 
      default: 
        break; 
    } 
  } 
 
  if (!test_argv) 
  { 
    help(); 
    return 1; 
  } 
 
 
  if ((fd = open(src_file, O_RDONLY)) < 0) 
  { 
    return 1; 
  } 
 
  while ((readn = read(fd, rbuf+offset, MAX_BUF_SIZE)) > 0) 
  { 
    html_trim(rbuf, wbuf, readn); 
    tr = strtok(wbuf, seps); 
    while (tr != NULL) 
    { 
      printf("%s ", tr); 
      tr = strtok(NULL, seps); 
    } 
    memset(rbuf, 0x00, MAX_BUF_SIZE); 
    memset(wbuf, 0x00, MAX_BUF_SIZE); 
  } 
  return 0; 
} 
 

´ñ±Û

EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.