5.2. C/C++ ¿¡¼­ÀÇ ¶óÀ̺귯¸® ¼Ö·ç¼Ç

C/C++ ¿¡¼­ ÇѰ¡Áö ÇØ°á¹æ¹ýÀº ¹öÆÛ ¿À¹öÇÃ·Î¿ì ¹®Á¦¸¦ °®Áö ¾Ê´Â ¶óÀ̺귯¸® ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ù ÇϺΠÀýÀº ÀÛµ¿µÉ ¼ö ÀÖÁö¸¸ ´ÜÁ¡À» °®´Â Ç¥ÁØ C ¶óÀ̺귯¸® ¼Ö·ç¼ÇÀ» ±â¼úÇÏ¸ç ´ÙÀ½ ÀýÀº ¹öÆÛ¿¡ ´ëÇÑ °íÁ¤µÈ ±æÀÌ ¹× µ¿ÀûÀ¸·Î ÀçÇÒ´çµÈ Á¢±Ù ¹æ¹ý¿¡ ´ëÇÑ ÀϹÝÀûÀÎ º¸¾È ÀïÁ¡À» ±â¼úÇÑ´Ù. ´ÙÀ½ ÇϺΠÀýÀº strlcpy ¿Í libmib ¿Í °°Àº ´Ù¾çÇÑ ´ëü ¶óÀ̺귯¸®¸¦ ±â¼úÇÑ´Ù.

5.2.1. Ç¥ÁØ C ¶óÀ̺귯¸® ¼Ö·ç¼Ç

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 ´Â ´ÜÁö Æ÷ÀÎÅÍÀÇ Å©±â¸¦ ÃøÁ¤ÇÒ °ÍÀ̸ç ÀÌ´Â ´ëºÎºÐÀÇ °ª¿¡ ´ëÇØ ÃæºÐÇÑ °ø°£ÀÌ ¾Æ´Ï´Ù).

5.2.2. Á¤Àû ¹× µ¿Àû ÇÒ´ç ¹öÆÛ

strncpy ¿Í °°Àº ÇÔ¼öµéÀº Á¤ÀûÀ¸·Î ÇÒ´çµÈ ¹öÆÛ¸¦ ´ÙµÑ ¶§ À¯¿ëÇѵ¥ ÀÌ´Â ¹öÆÛ°¡ "°¡Àå ±ä À¯¿ëÇÑ Å©±â (longest useful size)" ¿¡ ´ëÇØ ÇÒ´çµÇ¾î ±×¶§ºÎÅÍ °íÁ¤µÈ Å©±â·Î ¸Ó¹°·¯ ÀÖ´Â ÇÁ·Î±×·¡¹Ö Á¢±Ù ¹æ¹ýÀÌ´Ù. ´ë¾ÈÀº ¹öÆÛ¸¦ ÇÊ¿ä·Î ÇÒ¶§¸¶´Ù ±× Å©±â¸¦ µ¿ÀûÀ¸·Î ÀçÇÒ´çÇÏ´Â °ÍÀÌ´Ù. µÎ Á¢±Ù ¹æ¹ý ¸ðµÎ º¸¾È¿¡ ¹ÐÁ¢ÇÏ°Ô °ü·ÃµÇ¾î ÀÖ´Ù.

°íÁ¤µÈ ±æÀÌÀÇ ¹öÆÛ¸¦ »ç¿ëÇÒ ¶§ ÀϹÝÀûÀÎ º¸¾È ¹®Á¦°¡ Àִµ¥ ¹öÆÛ°¡ °íÁ¤µÈ ±æÀ̸¦ °®´Â ´Ù´Â »ç½ÇÀÌ ¾Ç¿ëµÉ ¼ö ÀÖ´Ù. ÀÌ´Â strncpy(3) ¹× strncat(3), snprintf(3), strlcpy(3), strlcat(3) °ú ´Ù¸¥ ±×·¯ÇÑ ÇÔ¼öµé°ú °ü·ÃµÈ ¹®Á¦ÀÌ´Ù. ±âº» °³³äÀº °ø°ÝÀÚ°¡ ½ÇÁ¦ ±ä ¹®ÀÚ¿­À» ¼³Á¤Çؼ­ ¹®ÀÚ¿­ÀÇ ³¡ÀÌ À߸± ¶§ ¸¶Áö¸· °á°ú°¡ °ø°ÝÀÚ°¡ ¿øÇß´ø °Í (°³¹ßÀÚ°¡ ÀǵµÇß´ø °Í ´ë½Å¿¡) ÀÏ °ÍÀÌ´Ù¶ó´Â °ÍÀÌ´Ù. ¾Æ¸¶µµ ¹®ÀÚ¿­Àº ¿©·¯ ÀÛÀº Á¶°¢À¸·ÎºÎÅÍ ¿¬°áµÈ´Ù; °ø°ÝÀÚ°¡ Àüü ¹öÆÛ¿Í ±æÀ̰¡ °°Àº ù Á¶°¢À» ¸¸µé ¼öµµ ÀÖÀ¸¸ç µû¶ó¼­ ÃßÈÄ ¸ðµç ¹®ÀÚ¿­À» ¿¬°áÇÏ·Á´Â ½Ãµµ´Â ¹«¿ëÁö¹°ÀÌ µÈ´Ù. ´ÙÀ½ ¾à°£ÀÇ Æ¯Á¤ ¿¹ÀÌ´Ù:

Á¤ÀûÀ¸·Î ÇÒ´çµÈ ¹öÆÛ¸¦ »ç¿ëÇÒ ¶§ ¼Ò½º ¹× ¼ö½ÅÁö ÀμöÀÇ ±æÀ̸¦ ½ÇÁ¦·Î °í·ÁÇÒ Çʿ䰡 ÀÖ´Ù. ÀԷ°ú °á°úµÇ´Â Áß°£ °è»êÀÇ Á¤»ó¼º (sanity) À» °Ë»çÇÔÀ¸·Î½á ¶ÇÇÑ À̸¦ ´Ù·ê ¼ö ÀÖ´Ù.

´Ù¸¥ ´ë¾ÈÀº °íÁ¤µÈ Å©±âÀÇ ¹öÆÛ¸¦ »ç¿ëÇÏ´Â ´ë½Å ¸ðµç ¹®ÀÚ¿­À» µ¿ÀûÀ¸·Î ÀçÇÒ´çÇÏ´Â °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ÀϹÝÀûÀÎ Á¢±Ù ¹æ¹ýÀº ÇÁ·Î±×·¥ÀÌ ÀÓÀÇ Å©±âÀÇ ÀÔ·ÂÀ» ´Ù·ê ¼ö Àֱ⠶§¹®¿¡ (¸Þ¸ð¸®¸¦ ´Ù ¼ÒºñÇÒ ¶§±îÁö) GNU ÇÁ·Î±×·¡¹Ö Áöħ¿¡ ÀÇÇØ ÃßõµÇ°í ÀÖ´Ù. ¹°·Ð µ¿ÀûÀ¸·Î ÇÒ´çµÈ ¹®ÀÚ¿­°ú °ü·ÃµÈ ÁÖ¿ä ¹®Á¦´Â ¸Þ¸ð¸®°¡ ºÎÁ·ÇÒ ¼öµµ ÀÖ´Ù´Â °ÍÀÌ´Ù. ¸Þ¸ð¸®´Â ¹öÆÛ ¿À¹öÇ÷ο쿡 ´ëÇØ °ÆÁ¤Çß´ø ºÎºÐÀ̶ó±â º¸´Ù´Â ÇÁ·Î±×·¥³»ÀÇ ¾î¶² ´Ù¸¥ °÷¿¡¼­ ¼ÒºñµÉ ¼öµµ ÀÖ´Ù; ¸ðµç ¸Þ¹«¸® ÇÒ´çÀÌ ½ÇÆÐÇÒ °ÍÀÌ´Ù. ¶ÇÇÑ µ¿Àû ÀçÇÒ´çÀº ¸Þ¸ð¸®°¡ ºñÈ¿À²ÀûÀ¸·Î ÇÒ´çµÇ°Ô Çϱ⠶§¹®¿¡ ±â¼úÀûÀ¸·Î ÇÁ·Î±×·¥ÀÌ ¾µ ¼ö ÀÖ´Â ÃæºÐÇÑ °¡»ó ¸Þ¸ð¸®°¡ ÀÖ´Ù°í ÇÏ´õ¶óµµ ¸Þ¸ð¸®°¡ ºÎÁ·ÇÏ°Ô µÇ´Â °ÍÀº ÀüÀûÀ¸·Î °¡´ÉÇÏ´Ù. À̿ܿ¡µµ ¸Þ¸ð¸®°¡ ºÎÁ·Çϱâ Àü¿¡ ÇÁ·Î±×·¥ÀÌ ¾Æ¸¶µµ ¸¹Àº °¡»ó ¸Þ¸ð¸®¸¦ »ç¿ëÇÒ °ÍÀÌ´Ù; ÀÌ´Â "thrashing" Áï ÄÄÇ»ÅͰ¡ ¸ðµç ½Ã°£À» µð½ºÅ©¿Í ¸Þ¸ð¸®»çÀ̸¦ ¿Õº¹Çϴµ¥ (À¯¿ëÇÑ ÀÛ¾÷À» ÇÏ´Â ´ë½Å) ¼ÒºñÇÏ´Â »óȲÀ¸·Î ³¡³¯ °ÍÀÌ´Ù. ÀÌ´Â ¼­ºñ½º ºÎÀÎ °ø°Ý°ú °°Àº È¿°ú¸¦ °¡Áú °ÍÀÌ´Ù. ÀÔ·Â Å©±â¿¡ ´ëÇÑ ¾î¶² ÇÕ¸®ÀûÀÎ Á¦ÇÑÀÌ µµ¿òÀÌ µÉ °ÍÀÌ´Ù. ÀϹÝÀûÀ¸·Î ÇÁ·Î±×·¥Àº µ¿ÀûÀ¸·Î ÇÒ´çµÈ ¹®ÀÚ¿­À» »ç¿ëÇÏ´Â °æ¿ì ¸Þ¹«¸®°¡ °í°¥µÉ ¶§ ¾ÈÀüÇÏ°Ô ½ÇÆÐÇϵµ·Ï ¼³°èµÇ¾î¾ß ÇÑ´Ù.

5.2.3. strlcpy and strlcat

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 ÀÇ ÀÇ¹Ì Ã¼°è¸¦ »ç¿ëÇÒ °ÍÀÌ´Ù.

5.2.4. libmib

ÀÚµ¿ÀûÀ¸·Î ¹®ÀÚ¿­À» µ¿ÀûÀ¸·Î ÀçÇÒ´çÇÏ´Â C ÀÇ ÇѰ¡Áö Åø¼ÂÀº ``libmib ÇÒ´ç ¹®ÀÚ¿­ ÇÔ¼ö" ÀÌ´Ù. ÀÌ´Â Forrest J. Cavalier III ¿¡ ÀÇÇÑ °ÍÀ¸·Î http://www.mibsoftware.com/libmib/astring ¿¡¼­ ¾òÀ» ¼ö ÀÖ´Ù. libmib ¿¡´Â µÎ°¡Áö º¯ÇüÀÌ Àִµ¥ ``libmib-open" Àº ¼öÁ¤°ú Àç¹èÆ÷¸¦ Çã¿ëÇÏ´Â X11°ú À¯»çÇÑ ¶óÀ̼¾½ºÇÏÀÇ ¿ÀÇ ¼Ò½ºÃ³·³ º¸ÀÌÁö¸¸ Àç¹èÆ÷½Ã ´Ù¸¥ À̸§À» ¼±ÅÃÇØ¾ß ÇÑ´Ù. ±×·¯³ª °³¹ßÀÚ´Â À̰ÍÀÌ ``¿Ïº®È÷ °Ë»çµÇÁö ¾Ê¾ÒÀ» Áöµµ ¸ð¸¥´Ù" ¶ó°í ¸»Çϰí ÀÖ´Ù. °è¼ÓÇØ¼­ ¹ßÀüµÈ libmib ¸¦ ¾ò±â À§Çؼ­´Â °¡ÀÔÀ» À§ÇØ µ·À» ÁöºÒÇØ¾ß ÇÑ´Ù. ¹®¼­´Â ¿ÀǼҽº°¡ ¾Æ´ÏÁö¸¸ ÀÚÀ¯·ÎÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

5.2.5. C++ std::string class

C++ °³¹ßÀÚ´Â ³»ÀåµÇ¾î ÀÖ´Â std::string Ŭ·¡½º¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÌ´Â ½ºÅ丮Áö°¡ ÇÊ¿äÇѸ¸Å­ Ä¿Áö´Â µ¿ÀûÀÎ Á¢±Ù ¹æ¹ýÀÌ´Ù. ±×·¯³ª ÀÌ Å¬·¡½ºÀÇ µ¥ÀÌŸ°¡ ¹öÆÛ ¿À¹öÇÃ·Î¿ì ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Â ``char *" ·Î ¼Ò¸®¾øÀÌ º¯È¯µÉ ¼ö ÀÖÀ½À» ¾ð±ÞÇÏ´Â °ÍÀº Áß¿äÇÏ´Ù. µû¶ó¼­ ÀÌ Å¬·¡½º·ÎºÎÅÍ º¯È¯ÇÒ ¶§ ÁÖÀÇÇÒ Çʿ䰡 ÀÖ´Ù.

5.2.6. Libsafe

·ç½¼Æ® Å×Å©³î·ÎÁö»çÀÇ 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 °³¹ßÀÚ ÀÚ½ÅÀº ¼ÒÇÁÆ®¿þ¾î °³¹ßÀÚ°¡ libsafe ¸¸ ÀÇÁ¸Çؼ­´Â ¾ÈµÈ´Ù¶ó°í ÀÎÁ¤Çϰí ÀÖ´Ù. ´ÙÀ½Àº À̵éÀÇ ¸»ÀÌ´Ù:

¹öÆÛ ¿À¹öÇÃ·Î¿ì °ø°Ý¿¡ ´ëÇÑ ÃÖ»óÀÇ ÇØ°áÃ¥Àº °áÇÔÀÖ´Â ÇÁ·Î±×·¥À» ¼öÁ¤ÇÏ´Â °ÍÀ̶ó°í ÀϹÝÀûÀ¸·Î ¹Þ¾Æµé¿©Áö°í ÀÖ´Ù. ±×·¯³ª °áÇÔÀÖ´Â ÇÁ·Î±×·¥À» ¼öÁ¤ÇÏ´Â °ÍÀº Ưº°ÇÑ ÇÁ·Î±×·¥ÀÌ °áÇÔÀÌ ÀÖ´Ù´Â °ÍÀ» ¾Ë¾Æ¾ß¸¸ ÇÑ´Ù. libsafe ¹× ´Ù¸¥ ´ë¾È º¸¾È Á¶Ä¡¸¦ »ç¿ëÇÔÀ¸·Î½á ¾ò°Ô µÇ´Â ÀÌÀÍÀº ¾ÆÁ÷±îÁö Ãë¾àÇÏ´Ù°í ¾Ë·ÁÁöÁö ¾ÊÀº ÇÁ·Î±×·¥¿¡ ´ëÇÑ ¹Ì·¡ÀÇ °ø°Ý¿¡ ´ëÇÑ º¸È£ÀÌ´Ù.

5.2.7. ´Ù¸¥ ¶óÀ̺귯¸®

glibc °¡ ¾Æ´Ñ glib ¶óÀ̺귯¸®´Â C ÇÁ·Î±×·¡¸Ó¿¡°Ô ¸¹Àº À¯¿ëÇÑ ÇÔ¼ö¸¦ Á¦°øÇϰí ÀÖ´Â ³Î¸® »ç¿ëµÉ ¼ö ÀÖ´Â ¿ÀÇ ¼Ò½º ¶óÀ̺귯¸®ÀÌ´Ù. GTK+ °ú GNOME ¸ðµÎ glib ¸¦ »ç¿ëÇÑ´Ù. ¾Õ¿¡¼­ ¾ð±ÞÇÑ ¹Ù¿Í °°ÀÌ glib ¹öÀü 1.3.2 ¿¡ ÀúÀÚ°¡ Á¦ÃâÇÑ ÆÐÄ¡¸¦ ÅëÇØ g_strlcpy() ¿Í g_strlcat() °¡ Ãß°¡µÇ¾ú´Ù. ÀÌ´Â glib ÀÇ ³ªÁß ¹öÀüÀÌ »ç¿ëµÉ ¼ö Àֱ⸸ ÇÏ´Ù¸é ÀÌ·¯ÇÑ ÇÔ¼ö¸¦ À̽ļºÀÖ°Ô »ç¿ëÇÏ´Â °ÍÀ» ´õ¿í ½±°Ô ÇÑ´Ù. ÇöÀç ½ÃÁ¡¿¡¼­ ÀúÀÚ´Â glib ¶óÀ̺귯¸® ÇÔ¼ö°¡ ¹öÆÛ ¿À¹öÇ÷ο쿡 ´ëÇØ º¸È£ÇÔÀ» ¸í¹éÈ÷ º¸ÀÌ´Â ºÐ¼®À» ÇÏÁö ¾Ê¾Ò´Ù. ±×·¯³ª ¸¹Àº glib ÇÔ¼ö´Â ÀÚµ¿ÀûÀ¸·Î ¸Þ¸ð¸®¸¦ ÇÒ´çÇϸç ÀÚµ¿ÀûÀ¸·Î ½ÇÆÐ¸¦ °¡·Îç ¾î¶°ÇÑ ÇÕ´çÇÑ ¹æ½ÄÀÌ ¾øÀÌ ½ÇÆÐÇÑ´Ù (¿¹, ´ë½Å ´Ù¸¥ ¾î¶² °ÍÀ» ÇÏ·Á°í ÇÔÀÌ ¾øÀÌ). ±× °á°ú·Î ¸¹Àº °æ¿ì¿¡ ÀÖ¾î ´ëºÎºÐÀÇ glib ÇÔ¼ö´Â ´ëºÎºÐÀÇ º¸¾ÈÀûÀÎ ÇÁ·Î±×·¥¿¡ »ç¿ëµÉ ¼ö ¾ø´Ù. GNOME ÁöħÀº g_strdup_printf() ¿Í °°Àº ÇÔ¼ö »ç¿ëÀ» ÃßõÇϴµ¥ ÀÌ´Â ¸Þ¸ð¸® °í°¥ÀÌ ¹ß»ýÇÒ ¶§ ÇÁ·Î±×·¥ÀÌ Áï°¢ÀûÀ¸·Î Å©·¡½¬Çصµ ¹«¹æÇÏ´Ù¸é ÁÁ´Ù. ±×·¯³ª À̸¦ ¹Þ¾ÆµéÀÏ ¼ö ¾ø´Ù¸é ÀÌ·± ·çƾÀ» »ç¿ëÇÏ´Â °ÍÀº ÀûÀýÇÏÁö ¸øÇÏ´Ù.