C/C++ ¿¡¼ ÇѰ¡Áö ÇØ°á¹æ¹ýÀº ¹öÆÛ ¿À¹öÇÃ·Î¿ì ¹®Á¦¸¦ °®Áö ¾Ê´Â ¶óÀ̺귯¸® ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ù ÇϺΠÀýÀº ÀÛµ¿µÉ ¼ö ÀÖÁö¸¸ ´ÜÁ¡À» °®´Â Ç¥ÁØ C ¶óÀ̺귯¸® ¼Ö·ç¼ÇÀ» ±â¼úÇÏ¸ç ´ÙÀ½ ÀýÀº ¹öÆÛ¿¡ ´ëÇÑ °íÁ¤µÈ ±æÀÌ ¹× µ¿ÀûÀ¸·Î ÀçÇÒ´çµÈ Á¢±Ù ¹æ¹ý¿¡ ´ëÇÑ ÀϹÝÀûÀÎ º¸¾È ÀïÁ¡À» ±â¼úÇÑ´Ù. ´ÙÀ½ ÇϺΠÀýÀº strlcpy ¿Í libmib ¿Í °°Àº ´Ù¾çÇÑ ´ëü ¶óÀ̺귯¸®¸¦ ±â¼úÇÑ´Ù.
C ¿¡¼ ¹öÆÛ ¿À¹öÇ÷ο츦 ¿¹¹æÇϴ ǥÁØÀûÀÎ ÇØ°á¹æ¹ý (¸î¸î C++ ÇÁ·Î±×·¥¿¡¼µµ »ç¿ëµÈ´Ù) Àº ÀÌ·¯ÇÑ ¹®Á¦¿¡ ´ëÇØ º¸È£Çϴ ǥÁØ C ¶óÀ̺귯¸® È£ÃâÀ» »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ÀÌ·¯ÇÑ Á¢±Ù ¹æ¹ýÀº Ç¥ÁØ ¶óÀ̺귯¸® ÇÔ¼öÀÎ strncpy(3) °ú strncat(3) ¿¡ ¸Å¿ì ÀÇÁ¸ÇÑ´Ù. ÀÌ Á¢±Ù ¹æ¹ýÀ» ¼±ÅÃÇÑ´Ù¸é ´ÙÀ½¿¡ ÁÖÀÇÇØ¶ó: ÀÌ È£ÃâÀº ¾à°£Àº ³î¶ö¸¸ÇÑ Àǹ̸¦ °®À¸¸ç ÀûÀýÈ÷ »ç¿ëÇϱⰡ ¾î·Æ´Ù. strncpy(3) ÇÔ¼ö´Â ¼Ò½º ¹®ÀÚ¿ ±æÀ̰¡ Àû¾îµµ ¼ö½ÅÁö ¹®ÀÚ¿ ±æÀÌ¿Í °°´Ù¸é ¼ö½ÅÁö ¹®ÀÚ¿À» NIL ·Î ³¡³»Áö ¾Ê´Âµ¥ µû¶ó¼ strncpy(3) À» È£ÃâÇÑ ÈÄ ¼ö½ÅÁö ¹®ÀÚ¿ÀÇ ¸¶Áö¸· ¹®ÀÚ¸¦ È®½ÇÈ÷ NIL ·Î ¼³Á¤Çضó. µ¿ÀÏÇÑ ¹öÆÛ¸¦ ¿©·¯¹ø Àç»ç¿ëÇÏ·Á°í ÇÏ´Ù¸é È¿°úÀûÀÎ Á¢±Ù ¹æ¹ýÀº ¹öÆÛ°¡ ½ÇÁ¦º¸´Ù ÇÑ ¹®ÀÚ ÂªÀ¸¸ç »ç¿ëÇϱâ Àü¿¡ ¸¶Áö¸· ¹®ÀÚ¸¦ NIL ·Î ¼³Á¤ÇÑ´Ù°í strncpy() ¿¡ ¾Ë·ÁÁÖ´Â °ÍÀÌ´Ù. strncpy(3) °ú strncat(3) µÑ ¸ðµÎ´Â »ç¿ëÇÒ ¼ö ÀÖ°Ô ³²¾ÆÀÖ´Â °ø¹éÀ» °Ç³×ÁÙ °ÍÀ» ¿ä±¸Çϴµ¥ À̴ Ʋ¸®±â ½¬¿î °è»êÀ¸·Î À̸¦ Ʋ¸°´Ù¸é ¹öÆÛ ¿À¹öÇÃ·Î¿ì °ø°ÝÀ» Çã¿ëÇÒ °ÍÀÌ´Ù. ¿À¹öÇ÷ο찡 ÀϾ´Â Áö¸¦ °áÁ¤Çϱâ À§ÇÑ ´Ü¼øÇÑ ¸ÞÄ«´ÏÁòÀ» Àý´ë·Î Á¦°øÇÏÁö ¸¶¶ó. ¸¶Áö¸·À¸·Î strncpy(3) Àº strncpy(3) ÀÌ ¼ö½ÅÁöÀÇ ³ª¸ÓÁö¸¦ NIL ·Î ä¿ì±â¶§¹®¿¡ ¾Æ¸¶ ´ëüµÇ´Â strcpy(3) ¿¡ ºñÇØ ¼º´É¸é¿¡¼ »ó´çÇÑ ºÒÀÌÀÍÀ» °®°í ÀÖ´Ù. ÀúÀÚ´Â ÀÌ·¯ÇÑ ¸¶Áö¸· »çÇ׿¡ ´ëÇØ ³î¶ó¿òÀ» Ç¥ÇöÇÑ À̸ÞÀÏÀ» ¹Þ¾Ò´Âµ¥ ÀÌ´Â Kernighan °ú Ritchie µÎ¹øÂ°ÆÇ [Kernighan 1988, page 249] ¿¡ ¸íÈ®È÷ ¼³¸íµÇ¾î ÀÖÀ¸¸ç ÀÌ µ¿ÀÛÀº ¸®´ª½º, FreeBSD ¹× ¼Ö¶ó¸®½º ¸ÇÆäÀÌÁö¿¡ ¸í¹éÈ÷ ¹®¼ÈµÇ¾î ÀÖ´Ù. ÀÌ´Â ´ÜÁö strcpy ´ë½Å strncpy ¸¦ ¾²´Â °ÍÀº ´ëºÎºÐÀÇ °æ¿ì¿¡ ÀÖ¾î ¾î¶°ÇÑ Àû´çÇÑ ÀÌÀ¯¾øÀÌ ¼º´É¸é¿¡¼ °¡Â÷¾ø´Â ÀúÇϸ¦ ¾ß±âÇÒ ¼ö ÀÖÀ½À» ÀǹÌÇÑ´Ù.
¹öÆÛ ¿À¹öÇ÷ο츦 ¿¹¹æÇÏ´Â µ¿½Ã¿¡ sprintf() ¸¦ »ç¿ëÇÒ ¼ö ÀÖÁö¸¸ À̶§ ÁÖÀǸ¦ ±â¿ïÀÏ Çʿ䰡 ÀÖ´Ù; ÃßõÇϱ⠾î·Á¿ï¸¸Å À̸¦ À߸ø Àû¿ëÇÏ´Â °ÍÀÌ ½±´Ù. sprintf Á¦¾î ¹®ÀÚ¿Àº ´Ù¾çÇÑ º¯È¯ ÁöÁ¤ÀÚ (¿¹, "%s") ¸¦ Æ÷ÇÔÇÒ ¼ö ÀÖÀ¸¸ç Á¦¾î ÁöÁ¤ÀÚ´Â ¼±ÅÃÀûÀÎ ÇÊµå ³Êºñ (¿¹, "%10s") ¿Í Á¤È®µµ ("%.10s") ÁöÁ¤À» °¡Áú ¼ö ÀÖ´Ù. ÀÌ´Â ²Ï À¯»çÇÏ°Ô º¸ÀÌÁö¸¸ (´ÜÁö Â÷ÀÌ´Â ¸¶Ä§Ç¥ÀÌ´Ù) À̵éÀº ¸Å¿ì ´Ù¸£´Ù. ÇÊµå ³Êºñ´Â ´ÜÁö ÃÖ¼Ò ±æÀ̸¦ ÁöÁ¤ÇÏ¸ç ¹öÆÛ ¿À¹öÇ÷ο츦 ¿¹¹æÇϴµ¥ ÀÖ¾î ¿ÏÀüÈ÷ ¾µ¸ð¾ø´Ù. ¹Ý´ë·Î Á¤È®µµ ÁöÁ¤Àº ±× ƯÁ¤ ¹®ÀÚ¿ÀÌ ¹®ÀÚ¿ º¯È¯ ÁöÁ¤ÀÚ·Î »ç¿ëµÉ ¶§ Ãâ·Â¿¡¼ °¡Áú ¼ö ÀÖ´Â ÃÖ´ë ±æÀ̸¦ ÁöÁ¤ÇÑ´Ù - µû¶ó¼ ¹öÆÛ ¿À¹öÇ÷ο쿡 ´ëÇØ º¸È£Çϱâ À§ÇØ »ç¿ëµÉ ¼ö ÀÖ´Ù. Á¤È®µµ ÁöÁ¤Àº ¹®ÀÚ¿À» ´Ù·ê ¶§ ´ÜÁö ÃÑ ÃÖ´ë ±æÀ̸¦ ÁöÁ¤ÇÔÀ» ÁÖ¸ñÇØ¶ó; ´Ù¸¥ º¯È¯ ¿¬»ê°ú´Â ´Ù¸¥ Àǹ̸¦ °®´Â´Ù. Å©±â°¡ "*" ·Î ÁÖ¾îÁö¸é ÃÖ´ë Å©±â¸¦ º¯¼ö·Î¼ ³Ñ°ÜÁÙ ¼ö ÀÖ´Ù (¿¹, sizeof() ¿¬»êÀÇ °á°ú). ÀÌ´Â ¿¹·Î¼ °¡Àå ½±°Ô º¸¿©Áø´Ù - ´ÙÀ½ ¹öÆÛ ¿À¹öÇ÷ο쿡 ´ëÇØ º¸È£Çϴ Ʋ¸° ±×¸®°í ¿ÇÀº ¹æ½ÄÀÌ´Ù:
char buf[BUFFER_SIZE]; sprintf(buf, "%*s", sizeof(buf)-1, "long-string"); /* WRONG */ sprintf(buf, "%.*s", sizeof(buf)-1, "long-string"); /* RIGHT */ |
À̷лó sprintf() ´Â º¹ÀâÇÑ Æ÷¸ËÀ» ÁöÁ¤Çϴµ¥ »ç¿ëÇÒ ¼ö Àֱ⠶§¹®¿¡ ¸Å¿ì µµ¿òÀÌ µÇ´Â ¹Ý¸é ½½ÇÁ°Ôµµ sprintf() ¸¦ Ʋ¸®°Ô »ç¿ëÇÏ´Â °ÍÀº ½±´Ù. Æ÷¸ËÀÌ º¹ÀâÇÏ´Ù¸é ¼ö½ÅÁö°¡ Àüü Æ÷¸ËÀÇ °¡´ÉÇÑ ÃÖ´ë Å©±â¿¡ ´ëÇØ ÃæºÐÈ÷ Å©¸ç Á¤È®µµ Çʵå´Â ´ÜÁö ÇÑ º¯¼öÀÇÅ©±â¸¸ Á¦¾îÇÏ´ÂÁö¸¦ È®ÀÎÇÒ Çʿ䰡 ÀÖ´Ù. "°¡´ÉÇÑ °¡Àå Å« (largest possible)" °ªÀº º¹ÀâÇÑ Ãâ·ÂÀÌ »ý¼ºµÇ°í ÀÖÀ» ¶§ °áÁ¤ÇÏ±â ¾î·Æ´Ù. ÇÁ·Î±×·¥ÀÌ °¡´ÉÇÑ °¡Àå ±ä Á¶ÇÕ¿¡ ´ëÇØ ÃæºÐÇÑ °ø°£À» ÇÒ´çÇÏÁö ¾Ê´Â´Ù¸é ¹öÆÛ ¿À¹öÇÃ·Î¿ì °ø°ÝÀ» ¹Þ±â ½¬¿ï °ÍÀÌ´Ù. ¶ÇÇÑ sprintf() ´Â Àüü ¿¬»êÀÌ ³¡³ ÈÄ ¼ö½ÅÁö¿¡ NUL À» Ãß°¡ÇÑ´Ù - ÀÌ ¿©ºÐÀÇ ¹®ÀÚ´Â Àر⠽¬¿ì¸ç ÀÌ ¹®ÀÚ Çϳª°¡ ¾øÀ½À¸·Î½á ¿¡·¯°¡ »ý±æ ¼ö ÀÖ´Â ±âȸ¸¦ »ý¼ºÇÑ´Ù. ±×·¡¼ À̰ÍÀÌ ÀÛµ¿ÇÏ´õ¶óµµ ¾î¶² »óȲ¿¡¼ »ç¿ëÇÏ´Â °ÍÀº ¹«Ã´ °ï¶õÇÒ ¼ö ÀÖ´Ù.
¶ÇÇÑ À§ Äڵ忡 ´ëÇÑ ¾ð±Þ - sizeof() ¿¬»êÀÌ ¹è¿ÀÇ Å©±â¸¦ »ç¿ëÇßÀ½À» ÁÖ¸ñÇØ¶ó. Äڵ尡 º¯°æµÇ¾î "buf" °¡ ¾î¶² ÇÒ´ç ¸Þ¸ð¸®¿¡ ´ëÇÑ Æ÷ÀÎÅͶó¸é ¸ðµç "sizeof()" ¿¬»êÀº º¯°æµÇ¾î¾ß ÇÒ °ÍÀÌ´Ù (¶Ç´Â sizeof ´Â ´ÜÁö Æ÷ÀÎÅÍÀÇ Å©±â¸¦ ÃøÁ¤ÇÒ °ÍÀ̸ç ÀÌ´Â ´ëºÎºÐÀÇ °ª¿¡ ´ëÇØ ÃæºÐÇÑ °ø°£ÀÌ ¾Æ´Ï´Ù).
strncpy ¿Í °°Àº ÇÔ¼öµéÀº Á¤ÀûÀ¸·Î ÇÒ´çµÈ ¹öÆÛ¸¦ ´ÙµÑ ¶§ À¯¿ëÇѵ¥ ÀÌ´Â ¹öÆÛ°¡ "°¡Àå ±ä À¯¿ëÇÑ Å©±â (longest useful size)" ¿¡ ´ëÇØ ÇÒ´çµÇ¾î ±×¶§ºÎÅÍ °íÁ¤µÈ Å©±â·Î ¸Ó¹°·¯ ÀÖ´Â ÇÁ·Î±×·¡¹Ö Á¢±Ù ¹æ¹ýÀÌ´Ù. ´ë¾ÈÀº ¹öÆÛ¸¦ ÇÊ¿ä·Î ÇÒ¶§¸¶´Ù ±× Å©±â¸¦ µ¿ÀûÀ¸·Î ÀçÇÒ´çÇÏ´Â °ÍÀÌ´Ù. µÎ Á¢±Ù ¹æ¹ý ¸ðµÎ º¸¾È¿¡ ¹ÐÁ¢ÇÏ°Ô °ü·ÃµÇ¾î ÀÖ´Ù.
°íÁ¤µÈ ±æÀÌÀÇ ¹öÆÛ¸¦ »ç¿ëÇÒ ¶§ ÀϹÝÀûÀÎ º¸¾È ¹®Á¦°¡ Àִµ¥ ¹öÆÛ°¡ °íÁ¤µÈ ±æÀ̸¦ °®´Â ´Ù´Â »ç½ÇÀÌ ¾Ç¿ëµÉ ¼ö ÀÖ´Ù. ÀÌ´Â strncpy(3) ¹× strncat(3), snprintf(3), strlcpy(3), strlcat(3) °ú ´Ù¸¥ ±×·¯ÇÑ ÇÔ¼öµé°ú °ü·ÃµÈ ¹®Á¦ÀÌ´Ù. ±âº» °³³äÀº °ø°ÝÀÚ°¡ ½ÇÁ¦ ±ä ¹®ÀÚ¿À» ¼³Á¤Çؼ ¹®ÀÚ¿ÀÇ ³¡ÀÌ À߸± ¶§ ¸¶Áö¸· °á°ú°¡ °ø°ÝÀÚ°¡ ¿øÇß´ø °Í (°³¹ßÀÚ°¡ ÀǵµÇß´ø °Í ´ë½Å¿¡) ÀÏ °ÍÀÌ´Ù¶ó´Â °ÍÀÌ´Ù. ¾Æ¸¶µµ ¹®ÀÚ¿Àº ¿©·¯ ÀÛÀº Á¶°¢À¸·ÎºÎÅÍ ¿¬°áµÈ´Ù; °ø°ÝÀÚ°¡ Àüü ¹öÆÛ¿Í ±æÀ̰¡ °°Àº ù Á¶°¢À» ¸¸µé ¼öµµ ÀÖÀ¸¸ç µû¶ó¼ ÃßÈÄ ¸ðµç ¹®ÀÚ¿À» ¿¬°áÇÏ·Á´Â ½Ãµµ´Â ¹«¿ëÁö¹°ÀÌ µÈ´Ù. ´ÙÀ½ ¾à°£ÀÇ Æ¯Á¤ ¿¹ÀÌ´Ù:
gethostbyname(3) À» È£ÃâÇÏ´Â Äڵ带 »ó»óÇ϶ó. ¸¸¾à ¼º°øÇÑ´Ù¸é strncpy ¶Ç´Â snprintf ¸¦ »ç¿ëÇÏ¿© Áï°¢ÀûÀ¸·Î hostent->h_name À» °íÁ¤µÈ ±æÀÌÀÇ ¹öÆÛ·Î º¹»çÇØ¶ó. strncpy ¶Ç´Â snprintf ¸¦ »ç¿ëÇÑ´Ù¸é ¸Å¿ì ±ä FQDN (fully qualified domain name) ÀÇ ¿À¹öÇ÷ο쿡 ´ëÇØ º¸È£¸¦ ÇÒ ¼ö ÀÖÀ¸¸ç µû¶ó¼ ¸ðµç °ÍÀÌ ³¡³µ´Ù°í »ý°¢ÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª FQDN ÀÇ ¸¶Áö¸·Àº Àß·ÁÁú °ÍÀÌ´Ù. ÀÌ´Â ´ÙÀ½¿¡ ¹«¾ùÀÌ ¹ß»ýÇÒÁö¿¡ µû¶ó ¸Å¿ì ¹Ù¶÷Á÷ÇÏÁö ¾ÊÀ» ¼ö ÀÖ´Ù.
ÆÄÀϽýºÅÛ °´Ã¼ÀÇ Àý´ë °æ·Î¸¦ ¾î¶² ¹öÆÛ¿¡ º¹»çÇϱâ À§ÇØ strncpy, strncat, snprintf µîÀ» »ç¿ëÇÏ´Â Äڵ带 »ó»óÇØ¶ó. ´õ±¸³ª ¿ø·¡ °ªÀº ½Å·ÚµÇÁö ¾ÊÀº »ç¿ëÀÚ¿¡ ÀÇÇØ Á¦°øµÇ¾úÀ¸¸ç º¹»ç °úÁ¤ÀÌ ±× ´ÙÀ½ °è»êÀ» ÇÔ¼ö¿¡ Àü´ÞÇÏ´Â ÇÁ·Î¼¼½ºÀÇ ÀϺκÐÀ̶ó°í »ó»óÇØº¸¶ó. ¾ÈÀüÇÏ°Ô º¸À̴°¡ ±×·±°¡? Áö±Ý °ø°ÝÀÚ°¡ óÀ½ °æ·Î¿¡ ¸¹Àº ¼öÀÇ "/" ¸¦ ä¿ö³Ö¾ú´Ù°í »ó»óÇØº¸¶ó. ÇÁ·Î±×·¥ÀÌ °á°ú°¡ ¾ÈÀüÇÑ °ÍÀ϶ó´Â ¹ÏÀ½À¸·Î °ªÀ» Ãß°¡ÇÑ´Ù¸é ÇÁ·Î±×·¥Àº ¾Ç¿ëµÉ ¼öµµ ÀÖ´Ù. ¶Ç´Â °ø°ÝÀÚ°¡ ¹öÆÛ ±æÀÌ¿¡ °¡±î¿î ±ä ÆÄÀÏ À̸§À» °í¾ÈÇÒ ¼ö ÀÖÀ¸¸ç µû¶ó¼ ÆÄÀÏ À̸§¿¡ Ãß°¡ÇÏ·Á´Â ½Ãµµ´Â ¼Ò¸®¾øÀÌ ½ÇÆÐÇÒ °ÍÀÌ´Ù (¶Ç´Â ¾Ç¿ëµÉ ¼ö ÀÖ°Ô²û ´ÜÁö ºÎºÐÀûÀ¸·Î ÀϾ °ÍÀÌ´Ù).
Á¤ÀûÀ¸·Î ÇÒ´çµÈ ¹öÆÛ¸¦ »ç¿ëÇÒ ¶§ ¼Ò½º ¹× ¼ö½ÅÁö ÀμöÀÇ ±æÀ̸¦ ½ÇÁ¦·Î °í·ÁÇÒ Çʿ䰡 ÀÖ´Ù. ÀԷ°ú °á°úµÇ´Â Áß°£ °è»êÀÇ Á¤»ó¼º (sanity) À» °Ë»çÇÔÀ¸·Î½á ¶ÇÇÑ À̸¦ ´Ù·ê ¼ö ÀÖ´Ù.
´Ù¸¥ ´ë¾ÈÀº °íÁ¤µÈ Å©±âÀÇ ¹öÆÛ¸¦ »ç¿ëÇÏ´Â ´ë½Å ¸ðµç ¹®ÀÚ¿À» µ¿ÀûÀ¸·Î ÀçÇÒ´çÇÏ´Â °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ÀϹÝÀûÀÎ Á¢±Ù ¹æ¹ýÀº ÇÁ·Î±×·¥ÀÌ ÀÓÀÇ Å©±âÀÇ ÀÔ·ÂÀ» ´Ù·ê ¼ö Àֱ⠶§¹®¿¡ (¸Þ¸ð¸®¸¦ ´Ù ¼ÒºñÇÒ ¶§±îÁö) GNU ÇÁ·Î±×·¡¹Ö Áöħ¿¡ ÀÇÇØ ÃßõµÇ°í ÀÖ´Ù. ¹°·Ð µ¿ÀûÀ¸·Î ÇÒ´çµÈ ¹®ÀÚ¿°ú °ü·ÃµÈ ÁÖ¿ä ¹®Á¦´Â ¸Þ¸ð¸®°¡ ºÎÁ·ÇÒ ¼öµµ ÀÖ´Ù´Â °ÍÀÌ´Ù. ¸Þ¸ð¸®´Â ¹öÆÛ ¿À¹öÇ÷ο쿡 ´ëÇØ °ÆÁ¤Çß´ø ºÎºÐÀ̶ó±â º¸´Ù´Â ÇÁ·Î±×·¥³»ÀÇ ¾î¶² ´Ù¸¥ °÷¿¡¼ ¼ÒºñµÉ ¼öµµ ÀÖ´Ù; ¸ðµç ¸Þ¹«¸® ÇÒ´çÀÌ ½ÇÆÐÇÒ °ÍÀÌ´Ù. ¶ÇÇÑ µ¿Àû ÀçÇÒ´çÀº ¸Þ¸ð¸®°¡ ºñÈ¿À²ÀûÀ¸·Î ÇÒ´çµÇ°Ô Çϱ⠶§¹®¿¡ ±â¼úÀûÀ¸·Î ÇÁ·Î±×·¥ÀÌ ¾µ ¼ö ÀÖ´Â ÃæºÐÇÑ °¡»ó ¸Þ¸ð¸®°¡ ÀÖ´Ù°í ÇÏ´õ¶óµµ ¸Þ¸ð¸®°¡ ºÎÁ·ÇÏ°Ô µÇ´Â °ÍÀº ÀüÀûÀ¸·Î °¡´ÉÇÏ´Ù. À̿ܿ¡µµ ¸Þ¸ð¸®°¡ ºÎÁ·Çϱâ Àü¿¡ ÇÁ·Î±×·¥ÀÌ ¾Æ¸¶µµ ¸¹Àº °¡»ó ¸Þ¸ð¸®¸¦ »ç¿ëÇÒ °ÍÀÌ´Ù; ÀÌ´Â "thrashing" Áï ÄÄÇ»ÅͰ¡ ¸ðµç ½Ã°£À» µð½ºÅ©¿Í ¸Þ¸ð¸®»çÀ̸¦ ¿Õº¹Çϴµ¥ (À¯¿ëÇÑ ÀÛ¾÷À» ÇÏ´Â ´ë½Å) ¼ÒºñÇÏ´Â »óȲÀ¸·Î ³¡³¯ °ÍÀÌ´Ù. ÀÌ´Â ¼ºñ½º ºÎÀÎ °ø°Ý°ú °°Àº È¿°ú¸¦ °¡Áú °ÍÀÌ´Ù. ÀÔ·Â Å©±â¿¡ ´ëÇÑ ¾î¶² ÇÕ¸®ÀûÀÎ Á¦ÇÑÀÌ µµ¿òÀÌ µÉ °ÍÀÌ´Ù. ÀϹÝÀûÀ¸·Î ÇÁ·Î±×·¥Àº µ¿ÀûÀ¸·Î ÇÒ´çµÈ ¹®ÀÚ¿À» »ç¿ëÇÏ´Â °æ¿ì ¸Þ¹«¸®°¡ °í°¥µÉ ¶§ ¾ÈÀüÇÏ°Ô ½ÇÆÐÇϵµ·Ï ¼³°èµÇ¾î¾ß ÇÑ´Ù.
OpenBSD ¿¡ ÀÇÇØ »ç¿ëµÈ ´ë¾ÈÀº Miller ¿Í de Raadt [Miller 1999] ¿¡ ÀÇÇÑ strlcpy(3) °ú strlcat(3) ÀÌ´Ù. ÀÌ´Â C ¹®ÀÚ¿ º¹»ç ¹× ¿¬°á¿¡ ´Ù¸¥ (¿¡·¯°¡ ´ú »ý±â´Â) ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÏ´Â ÃÖ¼ÒÇÑÀÇ Á¤Àû Å©±â¸¦ °®´Â ¹öÆÛ Á¢±Ù ¹æ¹ýÀÌ´Ù. ÀÌ ÇÔ¼öÀÇ ¼Ò½º¿Í ¹®¼´Â ftp://ftp.openbsd.org/pub/OpenBSD/src/lib/libc/string/strlcpy.3 ¿¡¼ »õ·Î¿î BSD ½ºÅ¸ÀÏ ¿ÀÇ ¼Ò½º ¶óÀ̼¾½ºÇÏ¿¡¼ ¾òÀ» ¼ö ÀÖ´Ù.
¿ì¼± ´ÙÀ½Àº ¿øÇü (prototype) ÀÌ´Ù:
size_t strlcpy (char *dst, const char *src, size_t size); size_t strlcat (char *dst, const char *src, size_t size); |
µÎ ÇÔ¼ö ¸ðµÎ Àμö·Î¼ (º¹»çµÇ´Â ¹®ÀÚÀÇ ÃÖ´ë ¼ö°¡ ¾Æ´Ñ) ¼ö½ÅÁö ¹öÆÛÀÇ Àý´ë ũ۸¦ ÃëÇÏ¸ç ¸¶Áö¸·À» Á¾°á ¹®ÀÚ NIL ·Î ä¿ì´Â °ÍÀ» º¸ÀåÇÑ´Ù (Å©±â°¡ 0º¸´Ù Å©´Ù¸é). size ¿¡ NIL À» À§ÇÑ ¹ÙÀÌÆ®¸¦ Æ÷ÇÔÇØ¾ß ÇÔÀ» ±â¾ïÇØ¶ó.
strlcpy ÇÔ¼ö´Â NUL ·Î ³¡³ª´Â ¹®ÀÚ¿ ¼Ò½º¸¦ NIL ·Î ³¡³ª´Â °á°úÀÎ dst (destination) ·Î size-1 ¹®ÀÚ±îÁö º¹»çÇÑ´Ù. strlcat ÇÔ¼ö´Â dst ³¡¿¡ NIL ·Î ³¡³ª´Â ¹®ÀÚ¿ ¼Ò½º¸¦ Ãß°¡ÇÑ´Ù. ÀÌ´Â ±â²¯ÇØ¾ß size-strlen(dst)-1 ¹ÙÀÌÆ®¸¦ NIL ·Î ³¡³ª´Â °á°ú¿¡ Ãß°¡ÇÒ °ÍÀÌ´Ù.
strlcpy(3) °ú strlcat(3) ÀÇ ÇѰ¡Áö Áß¿äÇÏÁö ¾ÊÀº ´ÜÁ¡Àº ´ëºÎºÐÀÇ À¯´Ð½º °è¿ ½Ã½ºÅÛ¿¡ µðÆúÆ®·Î ¼³Ä¡µÇ¾î ÀÖÁö ¾Ê´Ù´Â °ÍÀÌ´Ù. OpenBSD ¿¡´Â <string.h> ³»¿¡ Á¸ÀçÇÑ´Ù. ÀÌ´Â ±×·¸°Ô ¾î·Á¿î ¹®Á¦´Â ¾Æ´Ï¸ç À̵éÀº ÀÛÀº ÇÔ¼öÀ̱⠶§¹®¿¡ °¢ÀÚ ÇÁ·Î±×·¥ ¼Ò½º¿¡ À̵éÀ» Æ÷ÇÔÇÒ ¼ö ÀÖÀ¸¸ç À̵éÀ» ÀûÀçÇÒ ¼ö ÀÖ´Â º°µµÀÇ ÀÛÀº ÆÐŰÁö¸¦ ¸¸µé ¼öµµ ÀÖ´Ù. À̸¦ ÀÚµ¿ÀûÀ¸·Î ´Ù·ç±â À§ÇØ autoconf ¸¦ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù. ´õ¿í ¸¹Àº ÇÁ·Î±×·¥ÀÌ À̵é ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù¸é ¿À·¡Áö ¾Ê¾Æ À̵éÀº ¸®´ª½º ¹èÆ÷ÆÇ ¹× ´Ù¸¥ À¯´Ð½º ½Ã½ºÅÛ °è¿ÀÇ Ç¥ÁØ ºÎºÐÀÌ µÉ °ÍÀÌ´Ù. ¶ÇÇÑ ÀÌ ÇÔ¼öµéÀº glib ¶óÀ̺귯¸®¿¡ ÃÖ±Ù¿¡ Ãß°¡µÇ¾úÀ¸¸ç (ÇÊÀÚ´Â À̸¦ À§ÇØ ÆÐÄ¡¸¦ Á¦ÃâÇÏ¿´´Ù) µû¶ó¼ glib ¸¦ »ç¿ëÇÔÀ¸·Î½á À̵éÀ» ÀÌ¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù (¹Ì·¡¿¡). glib ¿¡¼´Â glib ¶óÀ̺귯¸® ³×ÀÌ¹Ö °ü·Ê¿¡ ÀÏÄ¡ÇÏ´Â g_strlcpy ¿Í g_strlcat ·Î À̸§Áö¾îÁ³´Ù.
¶ÇÇÑ strlcat(3) Àº Á¦°øµÈ Å©±â°¡ 0 À̰ųª ¶Ç´Â ¼ö½ÅÁö ¹®ÀÚ¿ dst (ÁÖ¾îÁø ¹®ÀÚ³»¿¡¼) ³»¿¡ NIL ¹®ÀÚ°¡ ¾ø´Ù¸é ¾à°£ ´Ù¸¥ Àǹ̸¦ °®´Â´Ù. OpenBSD ¿¡¼´Â Å©±â°¡ 0 ÀÌ¸é ¼ö½ÅÁö ¹®ÀÚ¿ÀÇ ±æÀÌ´Â 0 À¸·Î °£ÁֵȴÙ. Å©±â°¡ 0 ÀÌ ¾Æ´ÏÁö¸¸ ¼ö½ÅÁö ¹®ÀÚ¿ (¹®ÀÚÀÇ Å©±â ¼ö³»¿¡¼) ³»¿¡ NIL ¹®ÀÚ°¡ ¾ø´Ù¸é ¼ö½ÅÁöÀÇ ±æÀ̰¡ Å©±â¿Í °°´Ù°í °£ÁÖÇÑ´Ù. ÀÌ·¯ÇÑ ±ÔÄ¢µéÀº ³»Àå NIL ¹®ÀÚ°¡ ¾ø´Â ¹®ÀÚ¿À» Àϰü¼ºÀÖ°Ô ´Ù·é´Ù. ºÒÇàÈ÷ Àû¾îµµ ¼Ö¶ó¸®½º´Â ¿ø·¡ ¹®¼¿¡ ÀÌ·¯ÇÑ ±ÔÄ¢µéÀ¸ µéÀ» ±¸Ã¼ÀûÀ¸·Î ¸í½ÃÇÏÁö ¾Ê¾Ò±â ¶§¹®¿¡ À̵éÀ» µû¸£Áö ¾Ê´Â´Ù. ÀúÀÚ´Â Todd Miller ¿¡°Ô ¸»ÇßÀ¸¸ç µÑ ¸ðµÎ OpenBSD ÀÇ¹Ì Ã¼°è°¡ ¿Ç´Ù´Â °Í¿¡ µ¿ÀÇÇÏ¿´´Ù (¼Ö¶ó¸®½º´Â ¿ÇÁö ¾Ê´Ù). Áõ¸íÀº °£´ÜÇÏ´Ù: ¾î¶°ÇÑ Á¶°ÇÇÏ¿¡¼µµ strlcat ¶Ç´Â strlcpy °¡ Å©±â ¹üÀ§¹Û¿¡¼ ¼ö½ÅÁö ³»ÀÇ ¹®ÀÚµéÀ» Á¶»çÇÏÁö ¾Ê¾Æ¾ß ÇÑ´Ù; ÀÌ·¯ÇÑ Á¢±ÙÀº ¹üÀ§°¡ ÃʰúµÈ ¸Þ¸ð¸®¸¦ Á¢±ÙÇÔÀ¸·Î½á ÄÚ¾î ´ýÇÁ¸¦ ¾ß±âÇÒ ¼öµµ ÀÖÀ¸¸ç ´õ ³ª¾Æ°¡¼´Â ±â¾ï ÀåÄ¡ ´ëÀÀ ÀÔÃâ·Â (memory-mapped I/O) ¸¦ ÅëÇØ Çϵå¿þ¾î »óÈ£ÀÛ¿ëÀ» ¾ß±âÇÒ ¼öµµ ÀÖ´Ù. µû¶ó¼, ´ÙÀ½°ú °°Àº °æ¿ì:
a = strlcat ("Y", "123", 0); |
Á¤È®ÇÑ ´äÀº 3 (0+3=3) ÀÌÁö¸¸ ¼Ö¶ó¸®½º´Â ¼ö½ÅÁö³»ÀÇ "Å©±â" ±æÀ̸¦ ³Ñ¾î¼´Â ¹®ÀÚ¸¦ ºÎÁ¤È®ÇÏ°Ô º¸±â¶§¹®¿¡ ´äÀÌ 4 ¶ó°í ÁÖÀåÇÒ °ÍÀÌ´Ù. ¿ì¼± ÀúÀÚ´Â Å©±â°¡ 0 À̰ųª ¼ö½ÅÁö°¡ NIL ¹®ÀÚ¸¦ °®Áö ¾Ê´Â °æ¿ì¸¦ ÇÇÇ϶ó°í Á¦¾ÈÇÑ´Ù. glib ÀÇ ÇâÈÄ ¹öÀü¿¡¼´Â ÀÌ Â÷À̰¡ ¾øÀ» °ÍÀÌ¸ç ´Ã OpenBSD ÀÇ ÀÇ¹Ì Ã¼°è¸¦ »ç¿ëÇÒ °ÍÀÌ´Ù.
ÀÚµ¿ÀûÀ¸·Î ¹®ÀÚ¿À» µ¿ÀûÀ¸·Î ÀçÇÒ´çÇÏ´Â C ÀÇ ÇѰ¡Áö Åø¼ÂÀº ``libmib ÇÒ´ç ¹®ÀÚ¿ ÇÔ¼ö" ÀÌ´Ù. ÀÌ´Â Forrest J. Cavalier III ¿¡ ÀÇÇÑ °ÍÀ¸·Î http://www.mibsoftware.com/libmib/astring ¿¡¼ ¾òÀ» ¼ö ÀÖ´Ù. libmib ¿¡´Â µÎ°¡Áö º¯ÇüÀÌ Àִµ¥ ``libmib-open" Àº ¼öÁ¤°ú Àç¹èÆ÷¸¦ Çã¿ëÇÏ´Â X11°ú À¯»çÇÑ ¶óÀ̼¾½ºÇÏÀÇ ¿ÀÇ ¼Ò½ºÃ³·³ º¸ÀÌÁö¸¸ Àç¹èÆ÷½Ã ´Ù¸¥ À̸§À» ¼±ÅÃÇØ¾ß ÇÑ´Ù. ±×·¯³ª °³¹ßÀÚ´Â À̰ÍÀÌ ``¿Ïº®È÷ °Ë»çµÇÁö ¾Ê¾ÒÀ» Áöµµ ¸ð¸¥´Ù" ¶ó°í ¸»Çϰí ÀÖ´Ù. °è¼ÓÇØ¼ ¹ßÀüµÈ libmib ¸¦ ¾ò±â À§Çؼ´Â °¡ÀÔÀ» À§ÇØ µ·À» ÁöºÒÇØ¾ß ÇÑ´Ù. ¹®¼´Â ¿ÀǼҽº°¡ ¾Æ´ÏÁö¸¸ ÀÚÀ¯·ÎÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
C++ °³¹ßÀÚ´Â ³»ÀåµÇ¾î ÀÖ´Â std::string Ŭ·¡½º¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÌ´Â ½ºÅ丮Áö°¡ ÇÊ¿äÇѸ¸Å Ä¿Áö´Â µ¿ÀûÀÎ Á¢±Ù ¹æ¹ýÀÌ´Ù. ±×·¯³ª ÀÌ Å¬·¡½ºÀÇ µ¥ÀÌŸ°¡ ¹öÆÛ ¿À¹öÇÃ·Î¿ì ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Â ``char *" ·Î ¼Ò¸®¾øÀÌ º¯È¯µÉ ¼ö ÀÖÀ½À» ¾ð±ÞÇÏ´Â °ÍÀº Áß¿äÇÏ´Ù. µû¶ó¼ ÀÌ Å¬·¡½º·ÎºÎÅÍ º¯È¯ÇÒ ¶§ ÁÖÀÇÇÒ Çʿ䰡 ÀÖ´Ù.
·ç½¼Æ® Å×Å©³î·ÎÁö»çÀÇ Arash Baratloo, Timothy Tsai ¿Í Navjot Singh ´Â stack smashing °ø°Ý¿¡ Ãë¾àÇÏ´Ù°í ¾Ë·ÁÁø ¸î°¡Áö ¶óÀ̺귯¸® ÇÔ¼öÀÇ wrapper ÀÎ Libsafe ¸¦ °³¹ßÇß´Ù. ÀÌ wrapper (À̵éÀº ¹Ìµé¿þ¾î¶ó°í ºÎ¸¥´Ù) ´Â strcpy(3) °ú °°Àº C ¶óÀ̺귯¸® ÇÔ¼öÀÇ ¼öÁ¤ ¹öÀüÀ» Æ÷ÇÔÇÑ °£´ÜÇÑ µ¿Àû ÀûÀç ¶óÀ̺귯¸®·Î ÀÌ ¼öÁ¤ ¹öÀüÀº ¿ø·¡ ±â´É¼ºÀ» ±¸ÇöÇÏÁö¸¸ ¸ðµç ¹öÆÛ ¿À¹öÇ÷ο찡 ÇöÀç ½ºÅà ÇÁ·¹ÀÓ³»¿¡ Æ÷ÇԵǾî ÀÖÀ½À» º¸ÀåÇÏ´Â ¹æ½ÄÀ¸·Î ±¸ÇöµÇ¾î ÀÖ´Ù. Ãʱ⠼º´É ºÐ¼®Àº ÀÌ ¶óÀ̺귯¸®ÀÇ ¿À¹öÇìµå°¡ ¸Å¿ì ÀÛ´Ù°í Á¦¾ÈÇÑ´Ù. Libsafe ³í¹®°ú ¼Ò½º ÄÚµå´Â http://www.bell-labs.com/org/11356/libsafe.html ¿¡¼ ¾òÀ» ¼ö ÀÖ´Ù. Libsafe ¼Ò½ºÄÚµå´Â ¿ÏÀüÇÑ ¿ÀÇÁ ¼Ò½º LGPL ¶óÀ̼¾½ºÇÏ¿¡ ¾òÀ» ¼ö ÀÖÀ¸¸ç ¸¹Àº ¸®´ª½º ¹èÆ÷¾÷üµéÀÌ À̸¦ »ç¿ëÇÏ·Á°í Çϰí ÀÖ´Ù.
Libsafe ÀÇ Á¢±Ù ¹æ¹ýÀº ¾î´À Á¤µµ À¯¿ëÇÑ °Íó·³ º¸ÀδÙ. Libsafe ´Â ¸®´ª½º ¹èÆ÷¾÷ÀÚ¿¡ ÀÇÇÑ Æ÷ÇÔÀÌ È®½ÇÈ÷ °í·ÁµÇ°í ÀÖÀ¸¸ç ¶ÇÇÑ ´Ù¸¥ Á¡¿¡ ÀÇÇØ¼µµ °í·ÁÇÒ °¡Ä¡°¡ ÀÖ´Ù. ¿¹¸¦ µé¾î ÀúÀÚ´Â ¸Çµå·¹ÀÌÅ© 7.1 ¹öÀüÀÌ À̸¦ Æ÷ÇÔÇÔÀ» ¾Ë°í ÀÖ´Ù. ±×·¯³ª ¼ÒÇÁÆ®¿þ¾î °³¹ßÀڷμ Libsafe ´Â öÀúÇÑ ¹æ¾î (defense-in-depth) ¸¦ Áö¿øÇÏ´Â À¯¿ëÇÑ ¸ÞÄ«´ÏÁòÀ̸¸ ½ÇÁ¦·Î ¹öÆÛ ¿À¹öÇ÷ο츦 ¿¹¹æÇÏÁö´Â ¸øÇÑ´Ù. ÄÚµå °³¹ßµ¿¾È¿¡ Libsafe ¿¡¸¸ ÀÇÁ¸ÇÏÁö ¾Ê¾Æ¾ß ÇÒ ¸î°¡Áö ÀÌÀ¯°¡ ´ÙÀ½¿¡ ¼³¸íµÈ´Ù:
Libsafe ´Â ´ÜÁö ¸í¹éÇÑ ¹öÆÛ ¿À¹öÇÃ·Î¿ì ¹®Á¦¸¦ °®´Â ÀûÀº ¼öÀÇ ¾Ë·ÁÁø ÇÔ¼ö¸¸À» º¸È£ÇÑ´Ù. ÀÌ ¹®¼ ÀÛ¼º½ÃÁ¡¿¡¼ ÀÌ ¸ñ·ÏÀº ÀÌ ¹®Á¦°¡ ÀÖ´Ù°í ¾Ë·ÁÁø ÀÌ Ã¥¿¡ ÀÖ´Â ÇÔ¼ö ¸ñ·Ïº¸´Ù »ó´çÈ÷ Àû´Ù. ¶ÇÇÑ ¹öÆÛ ¿À¹öÇ÷ο츦 ¾ß±âÇÏ´Â °¢ÀÚ°¡ ÀÛ¼ºÇÑ Äڵ忡 ´ëÇØ º¸È£¸¦ ÇÏÁö ¸øÇÒ °ÍÀÌ´Ù (¿¹, while ·çÇÁ).
libsafe °¡ ¹èÆ÷ÆÇ¿¡ ¼³Ä¡µÇ¾î ÀÖ´õ¶óµµ ¼³Ä¡µÈ ¹æ½ÄÀÌ »ç¿ë¿¡ ¿µÇâÀ» ¹ÌÄ£´Ù. ¹®¼´Â libsafe ÀÇ º¸È£ ±â´ÉÀ» µ¿ÀÛÇϵµ·Ï LD_PRELOAD ¸¦ ¼³Á¤ÇÒ °ÍÀ» ÃßõÇÏÁö¸¸ ¹®Á¦´Â »ç¿ëÀÚ°¡ ÀÌ È¯°æ º¯¼öÀÇ ¼³Á¤À» ÇØÁ¦ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. µû¶ó¼ º¸È£ ±â´ÉÀÌ ±ÝÁöµÇ´Â °ÍÀÌ´Ù.
Libsafe ´Â ¹Ýȯ ÁÖ¼Ò·ÎÀÇ ½ºÅÃÀÇ ¿À¹öÇ÷ο쿡 ´ëÇØ¼¸¸ º¸È£¸¦ ÇÑ´Ù; ¾ÆÁ÷µµ ÇÁ·Î½ÃÁ® ÇÁ·¹ÀÓ¿¡¼ Èü ¶Ç´Â ´Ù¸¥ º¯¼öµéÀ» ¿À¹ö·±½Ãų ¼ö ÀÖ´Ù.
¸ðµç »ç¿ëµÇ°í ÀÖ´Â Ç÷§ÆûÀÌ libsafe (¶Ç´Â ÀÌ¿Í À¯»çÇÑ) ¸¦ »ç¿ëÇÒ °ÍÀ̶ó°í º¸ÀåÇÏÁö ¸øÇÑ´Ù¸é libsafe °¡ ¾øÀ» ¶§Ã³·³ ÇÁ·Î±×·¥À» º¸È£ÇØ¾ß ÇÒ °ÍÀÌ´Ù.
Libsafe ´Â À¯º¸µÈ (saved) ÇÁ·¹ÀÓ Æ÷ÀÎÅͰ¡ °¢ ½ºÅà ÇÁ·¹ÀÓÀÇ Ã³À½¿¡ ÀÖ´Ù°í °¡Á¤ÇÑ µíÇÏ´Ù. À̰ÍÀÌ ´Ã ¿ÇÀº °ÍÀº ¾Æ´Ï´Ù. gcc ¿Í °°Àº ÄÄÆÄÀÏ·¯´Â ÃÖÀûȸ¦ ÇÒ °ÍÀÌ¸ç Æ¯È÷ -fomit-frame-pointer ¿É¼ÇÀº libsafe °¡ ÇÊ¿äÇÒ °Í °°Àº Á¤º¸¸¦ Á¦°ÅÇÑ´Ù. µû¶ó¼ libsafe °¡ ¾î¶² ÇÁ·Î±×·¥¿¡ ´ëÇØ¼´Â ÀÛµ¿ÇÏÁö ¾ÊÀ» ¼öµµ ÀÖ´Ù.
Libsafe °³¹ßÀÚ ÀÚ½ÅÀº ¼ÒÇÁÆ®¿þ¾î °³¹ßÀÚ°¡ libsafe ¸¸ ÀÇÁ¸Çؼ´Â ¾ÈµÈ´Ù¶ó°í ÀÎÁ¤Çϰí ÀÖ´Ù. ´ÙÀ½Àº À̵éÀÇ ¸»ÀÌ´Ù:
¹öÆÛ ¿À¹öÇÃ·Î¿ì °ø°Ý¿¡ ´ëÇÑ ÃÖ»óÀÇ ÇØ°áÃ¥Àº °áÇÔÀÖ´Â ÇÁ·Î±×·¥À» ¼öÁ¤ÇÏ´Â °ÍÀ̶ó°í ÀϹÝÀûÀ¸·Î ¹Þ¾Æµé¿©Áö°í ÀÖ´Ù. ±×·¯³ª °áÇÔÀÖ´Â ÇÁ·Î±×·¥À» ¼öÁ¤ÇÏ´Â °ÍÀº Ưº°ÇÑ ÇÁ·Î±×·¥ÀÌ °áÇÔÀÌ ÀÖ´Ù´Â °ÍÀ» ¾Ë¾Æ¾ß¸¸ ÇÑ´Ù. libsafe ¹× ´Ù¸¥ ´ë¾È º¸¾È Á¶Ä¡¸¦ »ç¿ëÇÔÀ¸·Î½á ¾ò°Ô µÇ´Â ÀÌÀÍÀº ¾ÆÁ÷±îÁö Ãë¾àÇÏ´Ù°í ¾Ë·ÁÁöÁö ¾ÊÀº ÇÁ·Î±×·¥¿¡ ´ëÇÑ ¹Ì·¡ÀÇ °ø°Ý¿¡ ´ëÇÑ º¸È£ÀÌ´Ù.
glibc °¡ ¾Æ´Ñ glib ¶óÀ̺귯¸®´Â C ÇÁ·Î±×·¡¸Ó¿¡°Ô ¸¹Àº À¯¿ëÇÑ ÇÔ¼ö¸¦ Á¦°øÇϰí ÀÖ´Â ³Î¸® »ç¿ëµÉ ¼ö ÀÖ´Â ¿ÀÇ ¼Ò½º ¶óÀ̺귯¸®ÀÌ´Ù. GTK+ °ú GNOME ¸ðµÎ glib ¸¦ »ç¿ëÇÑ´Ù. ¾Õ¿¡¼ ¾ð±ÞÇÑ ¹Ù¿Í °°ÀÌ glib ¹öÀü 1.3.2 ¿¡ ÀúÀÚ°¡ Á¦ÃâÇÑ ÆÐÄ¡¸¦ ÅëÇØ g_strlcpy() ¿Í g_strlcat() °¡ Ãß°¡µÇ¾ú´Ù. ÀÌ´Â glib ÀÇ ³ªÁß ¹öÀüÀÌ »ç¿ëµÉ ¼ö Àֱ⸸ ÇÏ´Ù¸é ÀÌ·¯ÇÑ ÇÔ¼ö¸¦ À̽ļºÀÖ°Ô »ç¿ëÇÏ´Â °ÍÀ» ´õ¿í ½±°Ô ÇÑ´Ù. ÇöÀç ½ÃÁ¡¿¡¼ ÀúÀÚ´Â glib ¶óÀ̺귯¸® ÇÔ¼ö°¡ ¹öÆÛ ¿À¹öÇ÷ο쿡 ´ëÇØ º¸È£ÇÔÀ» ¸í¹éÈ÷ º¸ÀÌ´Â ºÐ¼®À» ÇÏÁö ¾Ê¾Ò´Ù. ±×·¯³ª ¸¹Àº glib ÇÔ¼ö´Â ÀÚµ¿ÀûÀ¸·Î ¸Þ¸ð¸®¸¦ ÇÒ´çÇϸç ÀÚµ¿ÀûÀ¸·Î ½ÇÆÐ¸¦ °¡·Îç ¾î¶°ÇÑ ÇÕ´çÇÑ ¹æ½ÄÀÌ ¾øÀÌ ½ÇÆÐÇÑ´Ù (¿¹, ´ë½Å ´Ù¸¥ ¾î¶² °ÍÀ» ÇÏ·Á°í ÇÔÀÌ ¾øÀÌ). ±× °á°ú·Î ¸¹Àº °æ¿ì¿¡ ÀÖ¾î ´ëºÎºÐÀÇ glib ÇÔ¼ö´Â ´ëºÎºÐÀÇ º¸¾ÈÀûÀÎ ÇÁ·Î±×·¥¿¡ »ç¿ëµÉ ¼ö ¾ø´Ù. GNOME ÁöħÀº g_strdup_printf() ¿Í °°Àº ÇÔ¼ö »ç¿ëÀ» ÃßõÇϴµ¥ ÀÌ´Â ¸Þ¸ð¸® °í°¥ÀÌ ¹ß»ýÇÒ ¶§ ÇÁ·Î±×·¥ÀÌ Áï°¢ÀûÀ¸·Î Å©·¡½¬Çصµ ¹«¹æÇÏ´Ù¸é ÁÁ´Ù. ±×·¯³ª À̸¦ ¹Þ¾ÆµéÀÏ ¼ö ¾ø´Ù¸é ÀÌ·± ·çƾÀ» »ç¿ëÇÏ´Â °ÍÀº ÀûÀýÇÏÁö ¸øÇÏ´Ù.