|
ºí·Î±×¿¡ ¾´±ÛÀ» ºÙ¿© ³Ö°í º¸´Ï ±Û¸ð¾ç»õµµ Çϳªµµ ¸Â°í
±×¸²µµ ÀÌ»óÇÏ°í ³°¨Çϱº¿ä. Ȥ½Ã ´Ù¸¥°÷¿¡ º¹»çÇØ°¡½Ã·Á¸é Á¦
ºí·Î±×¿¡
Àִ°ÍÀ» Âü°í Çϼ¼¿ä. ¿ÀŸµµ ¸¹ÀÌ º¸À̴µ¥ ¼öÁ¤ÇϰڽÀ´Ï´Ù.
static_cast¿Í c typeÀÇ °Á¦ castÀÇ Àå´ÜÁ¡Àº ÀÍÈ÷µé ¾Ë°í ÀÖÀ» °ÍÀÌ´Ù. ´Ùµé static_cast¸¦ ½á¶ó¶ó°í °Á¶ ÇÑ´Ù.
ÄÚµå ÀÛ¼ºÀÚ ÀÔÀå¿¡¼´Â º°·Î Â÷ÀÌÁ¡ÀÌ ¾ø´Âµ¥ static_cast¸¦ »ç¿ëÇÏ´Â ÀÌÀ¯´Â ¿©·¯°¡Áö°¡ ÀÖ°ÚÁö¸¸, ·±Å¸Àӽÿ¡ ¹ß»ýÇÒ ¼ö ÀÖ´Â
¿À·ù¸¦
ÄÄÆÄÀÏ Å¸ÀÓ¿¡ Àâ¾Æ³» ÁÙ¼ö ÀÖ´Ù´Â°Ô ÇϳªÀÇ ÀÌÀ¯ÀÏ ¼öµµ ÀÖ´Ù.
¼·Î casting ÇÒ ¼ö »óȲÀÇ °ÍÀÎ °æ¿ì c typeÀÇ cast´Â ¹ö±×ÀÇ °¡´É¼ºÀ» ¸¸µé¾î ÁÖÁö¸¸ static_cast´Â ¾ÈÀüÇϰÔ
casting ÇØÁְųª
ÄÄÆÄÀÏ Å¸ÀÓ¿¡ ¿À·ù¸¦ ³½´Ù.
call by reference ¹æ¹ýÀ¸·Î´Â reference¸¦ ¾²´Â ¹æ¹ý°ú pointer¸¦ ¾²´Â ¹æ¹ýÀÌ ÀÖ´Ù. »ç½Ç ¹®¹ýÀûÀÎ
¸ð¾ç»õ³ª ±×µ¿¾È¿¡ °ü½ÀÀûÀ¸·Î
¾²ÀÓÀ» ¼±ÅÃÇϰï Çϴµ¥, ¾î¶»°Ô º¸¸é ¿ö³« ±âÃÊÀûÀÎ ºÎºÐÀÌ´Ù¶ó°í »ý°¢ÇÒ ¼ö ÀÖÁö¸¸, ÄÚµùÀÇ ½Å³äÀ̳ª ÀڽŸ¸ÀÇ
ÄÚµùÄÁº¥¼ÇÀ»
°¡Áö°í ÀÖÁö ¾ÊÀ¸¸é µÎ°³»çÀÌ¿¡¼ »ç¿ëÇÔÀÇ ¸Á¼³ÀÓÀ» °®°Ô µÇ´Â °æ¿ì°¡ ÀÖ´Ù.
¿À¸®Áö³Î C ½ÃÀýºÎÅÍ ÀÇ·Ê °ªÀÌ º¯°æµÇ´Â call by reference´Â Æ÷ÀÎÅ͸¦ ÀÌ¿ëÇßÀ¸¹Ç·Î °ªÀÌ º¯°æµÇ´Â OUT ÀÎÀÚÀϰæ¿ì Æ÷ÀÎÅÍ·Î
¼±¾ðÀ» Çϰí, reference´Â ±¸Á¶Ã¼µîÀÇ ÀÎÀÚ Àü´Þ½Ã space complexity¿¡ ÀÌÀ±À» ³²±â±â À§Çؼ ¾´´Ù¶ó°í ±â¼úµÇ¾î Àִ åµµ
ÀÖ°í,
¾î¶²°ÍÀº Æ÷ÀÎÅÍÀÇ ´ÜÁ¡À» ³ª¿Çϸç ÁÖ·Î reference¸¦ ½á¶ó ¶ó´Â ¾ÆÆ¼Å¬µµ ÀÖ´Ù.
#define OUT
void foo(OUT Obj& a)
{
a++;
}
void main()
{
Obj a(0);
foo(a);
printf("%d", a.value);
}
Àú·± °æ¿ì¿¡ foo ÇÔ¼öÀÇ ÀÎÀÚ´Â call by reference¶ó´Â °ÍÀ» OUTÀ» ÅëÇØ¼ ¾Ë·ÁÁáÀ¸¹Ç·Î °ü½ÀÀûÀÎ ºÎºÐ¿¡ ¾î´ÀÁ¤µµ ¸éÁ˺ΰ¡
ÀÖ´Ù°í ÇϰڴÙ. ±×¸®°í, pointer¸¦ ³Ñ±è¿¡ ºñÇØ reference´Â ¹Ýµå½Ã Ãʱâȸ¦ ÇØÁà¾ß ÇÑ´Ù´Â Á¶°ÇÀÌ Àֱ⠶§¹®¿¡ NULL üũÁ¤µµ´Â
¾ÈÇØµµ µÇ´Â °£ÆíÇÑ ÀåÁ¡µµ ÀÖ´Ù. ÇÏÁö¸¸ Èʳ¯ °¡µ¶¼ºÀ» À§Çؼ Æ÷ÀÎÅ͸¦ ½á¶ó, Èì, ÀÌ·¡¼ °¥ÆÎ ÁúÆÎ ÇÏ°Ô µÇ´Â °æÇâÀÌ ÀÖ¾ú´ø°Í °°´Ù.
Àú·¸°Ô OUT°ú °°ÀÌ ÁÖ¼®Àº ¾Æ´ÏÁö¸¸, ÇÔ¼ö »ç¿ëÀÚ¿¡°Ô ÈòÆ®¸¦ ÁÖ´Â °ÍÀ» Annotation À̶ó°í ÇÑ´Ù.
C¿¡¼ ¹®ÀÚ¿Àº ´Ü¼øÈ÷ ¸¶Áö¸·¿¡ NULL üũ¿¡ ÀÇÁöÇϰí Àֱ⠶§¹®¿¡ ¹öÆÛ¿À¹ö·±À» ¹ß»ý½Ãų ¿äÁö°¡ ¸¹´Ù. ±×¸®°í ÀÌ·± ¹öÆÛ
¿À¹ö·±
¹ß»ýÀº ²À ¸±¸®Áî ÈÄ¿¡ Ä¡¸íÀûÀÎ ÀÏÀÌ ÀÖ°ÔµÈ ÈÄ¿¡ ¾Ë°Ô µÈ´Ù.
¹®ÀÚ¿ °ü·Ã ÇÔ¼ö¸¦ »ìÆì º¸¸é ÀÌ·¯ÇÑ ¹öÆÛ¿À¹ö·±¿¡ Ãë¾àÇÑ ÇüÅ·Π¼±¾ðµÈ ÇÔ¼öµéÀÌ ¸¹´Ù. ´ÙÀ½ÀÇ strcpy °°Àº°æ¿ì´Â ¹Þ´Â ¹öÆÛÀÇ
Å©±â°¡
ÀÛÀº°æ¿ì ¹®Á¦°¡ ¹ß»ýµÈ´Ù.
char *strcpy(char *strDestination, const char *strSource);
±×·¡¼ ´ÙÀ½°ú °°Àº ¾ÈÀüÇÑ ½ºÆ®¸µ ó¸® ÇÔ¼ö ÇüŰ¡ µîÀåÇß´Ù. (strsafeÇÔ¼ö¿¡ ´ëÇØ¼´Â ½Å¿µÁø´Ôºí·Î±×¿¡ ±ò²ûÇÑ °Á°¡
ÀÖ´Ù.) STRSAFEAPI StringCchCopy(STRSAFE_LPSTR pszDest, size_t cchDest, STRSAFE_LPCSTR pszSrc);
ÇÁ·Î±×·¡¸Ó ÀÔÀå¿¡¼´Â ¹öÆÛÀÇ »çÀÌÁ ¸í½ÃÇØ¼ Çѹø ´õ °¢¼ºÇÏ°Ô µÇ´Â È¿°ú°¡ ÀÖ´Ù.
À̰ÍÀ» Èä³»³»¾î ´ÙÀ½°ú °°Àº ½ºÆ®¸µ°ªÀ» ¹öÆÛ¿¡ ä¿öÁÖ´Â ÇÔ¼ö¸¦ ¸¸µé¾ú´Ù°í °¡Á¤ÇØ º¸¸é,
void FillChar(TCHAR* buffer, int cchBuf, TCHAR c)
{
for(int i = 0; i < cchBuf; ++i)
buffer[i] = c;
}
±×¸®°í ´ÙÀ½°ú °°ÀÌ À߸ø »ç¿ëÇß´Ù°í °¡Á¤ÇØ º¸ÀÚ. TCHAR* buf = (TCHAR*)malloc(128 * sizeof(TCHAR));
FillChar(buf, 256, 'a');
À§È¸é°ú °°ÀÌ ºñÁÖ¾ó ½ºÆ©µð¿À 2005¿¡¼ Warning level 4·Î Çϰí ÄÄÆÄÀÏÀ» ÇÑ´Ù°í ÇÏ´õ¶óµµ, ÀÌ ÇÔ¼ö¿¡ ´ëÇÑ ¾Æ¹«·± °æ°í¸¦
ÁÖÁö
¾Ê´Â´Ù. °á±¹ ¸±¸®Áî ÈÄ ¹®Á¦ ¹ß»ýÇÑ ´ÙÀ½¿¡¾ß °ü·Ã ¹öÆÛ¸¦ °Ë»öÇÏ´Ù°¡ ¼öÁ¤ÀÌ µÉ È®·üÀÌ ³ô¾Æ Áø´Ù.
StrSafe.h¿¡ ÀÖ´Â ÇÔ¼öµé ó·³ ±ò²ûÇÏ°Ô ÇÔ¼ö ¼³°è¸¦ ÇÑ´Ù¸é¾ß ÁÁ°ÚÁö¸¸, ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Ù º¸¸é ÇÔ¼ö¶ó´Â°Ô óÀ½ ¸¶À½¸ÔÀº
ÇüÅ´ë·Î¸¸ ¼±¾ðÀÇ ¸ð¾ç»õ¸¦ °®Ãߴ°ÍÀº ¾î·Æ´Ù.
±×¸®°í ¹«ÇÑÁ¤ ¹æ¾îÄÚµùÀ» ÇØÁÙ¼öµµ ¾ø´Â ³ë¸©ÀÌ´Ù. FillCharÀ̶õ ÇÔ¼ö´Â cchBuf°ª¸¸ ¹®Á¦¾ø´Ù¸é ¿ÀÄÉÀÌÀÎ °£´ÜÇÑ ±â´ÉÀ» Çϱâ
¶§¹®ÀÌ´Ù.
Standard Annotation Language¸¦ »ç¿ëÇϸé cchBuf°ªÀ» ÄÄÆÄÀÏ Å¸ÀÓ¿¡ °Ë»çÇØ ÁÙ ¼ö ÀÖÀ» »Ó ¾Æ´Ï¶ó
¿©·¯°¡ÁöÀÇ ´Ù¾çÇÑ ¹öÆÛ¸¦
´Ù·ç´Â °ËÁõÀ» ÄÄÆÄÀÏ Å¸ÀÓ¿¡ ¼öÇàÇØ ÁÙ ¼ö ÀÖ´Ù. À§¿¡¼ ¿¹·Îµç cchBuf°ªÀ» ÄÄÆÄÀÏŸÀÓ¿¡ °Ë»çÇÏ´Â SALÀ» Àû¿ëÇϸé
´ÙÀ½°ú
°°ÀÌ ÇÔ¼ö¿¡ AnnotationÀ» Ãß°¡ÇÒ ¼ö ÀÖ´Ù.
#include <sal.h>
void FillChar(__out_ecount(cchBuf) TCHAR* buffer, int cchBuf, TCHAR c)
{
for(int i = 0; i < cchBuf; ++i)
buffer[i] = c;
}
±×·±µ¥ ¿ä°É ÄÄÆÄÀÏ ÇÏ·Á¸é ¸î°¡Áö ÁغñÇØ¾ß µÉ °ÍµéÀÌ ÀÖ´Ù. ÇÔ²² ¼³Á¤ÇØ º¸µµ·Ï ÇϰڴÙ.
¸ÕÀú Visual Studio 2005 Team FoundationÀÌ ÇÊ¿äÇѵ¥, ´ëºÎºÐÀÇ Visual Studio 2005 »ç¿ëÀÚ´Â
2005 team suite ȤÀº professional
´ÜÀϹöÀüÀÌ ±ò·ÈÀ» °ÍÀε¥, ±×·¸´Ù¸é SDK for Vista°¡ ÇÊ¿äÇÏ´Ù. ¾Æ¸¶ ´ëºÎºÐÀÇ
°³¹ßÀÚ¶ó¸é SDK for Vista°¡ ±ò·Á ÀÖÀ» °ÍÀ̶ó »ý°¢µÈ´Ù.
óÀ½ SDK for Vista¸¦ ¼³Ä¡Çß´Ù¸é ±× ´ÙÀ½ Visual Studio¿¡¼ SDKÀÇ path ¼³Á¤À» ÇØ ÁÖ¾î¾ß ÇÑ´Ù.
Tools - Options - Projects and
Solutions - VC++ Directories¿¡ ¼³Ä¡µÈ SDK°¡ °¡Àå ÀÂÊ¿¡
¹Ý¿µµÇµµ·Ï ¿Ã·ÁÁÖ¾î¾ß Çϴµ¥, ÀÏÀÏÀÌ ¼öµ¿À¸·Î ¼³Á¤ ÇØÁÖÁö ¾Ê¾Æµµ µÈ´Ù.
À ±×¸²¿¡ ÀÖ´Â ¹èÄ¡ÆÄÀÏÀ» ½ÇÇàÇϸé ÀÚµ¿À¸·Î ¼ÂÆÃÇØÁֹǷÎ, ¿¹Àü SDK ±ò°í ¼öµ¿À¸·Î Àû¾î¼ ¿Ã·ÁÁá´ø ³ë°¡´Ù´Â ÇÏÁö ¾Ê¾Æµµ µÈ´Ù.
±×´ã, Project ¿É¼Ç¿¡¼ SALÀ» Ȱ¼ºÈ ½ÃŰ´Â ¿É¼ÇÀ» ÁÖ¾î¾ß Çϴµ¥ Áö±Ý pc°¡ Team FoundationÀÌ ¾Æ´Ï¶ó¼,
¿É¼Ç¿¡ ³ª¿ÍÀÖ´Â UI
½º¼¦Àº ÂïÁö ¸øÇϰí, ProfessionalÀ̶ó¸é ȸ鿡¼ ó·³ ¿É¼ÇÀ» Command Line¿¡ ³Ö¾î ÁÖ¸é µÈ´Ù. ¾îÂ¥ÇÇ
ÄÄÆÄÀÏÀ̶õ ÀÛ¾÷Àº IDE°¡
cl.exe ¿¡ ¿É¼ÇµéÀ» ÀÎÀÚ·Î ³Ö¾î Áֱ⸸ Çϴ°ÍÀ̹ǷΠcl.exe¸¸ /analyze¸¦ ÀνÄÇÑ´Ù¸é »ó°ü¾ø´Ù.
¸¸ÀÏ ´ÙÀ½°ú °°Àº 9040 WarningÀÌ ¶á´Ù¸é ȸé°ú °°ÀÌ Executable Path¸¦ Ãß°¡ ¼³Á¤ÇØ ÁØ´Ù. À ¹®Àå¿¡¼ ³ÍÁî½Ã
¾ê±â ÇßÁö¸¸
professional ¹öÀüÀÇ cl.exe´Â /analyze ¿É¼ÇÀ» ÀÎÁö ÇÏÁö ¸øÇÑ´Ù. Vista SDK¿¡ ÀÖ´Â cl.exe¸¦
»ç¿ëÇϱâ À§ÇÑ ÀÛ¾÷ÀÌ´Ù.
cl : Command line warning D9040 : ignoring option '/analyze'; Code Analysis warnings are not available in this edition
of the compiler
C:\Program Files\Microsoft SDKs\Windows\v6.0\VC\Bin
ÀÌÁ¦ À§¿¡ ¸¶·ÃµÈ ¼Ò½º¸¦ ÄÄÆÄÀÏ ÇØº¸¸é 3°³ÀÇ warningÀÌ ¶á´Ù. À߸øµÈ ºÎºÐÀ» Á¦´ë·Î ¤¾î ÁÖ°í ÀÖ´Ù.
1>c:\documents and settings\yhkim\my documents\visual studio 2005\projects\testtest\main.cpp(13) : warning C6057:
Buffer overrun due to number of characters/number of bytes mismatch in call to 'FillChar'
1>c:\documents and settings\yhkim\my documents\visual studio 2005\projects\testtest\main.cpp(13) : warning C6386:
Buffer overrun: accessing 'argument 1', the writable size is '128*sizeof(TCHAR)' bytes, but '512' bytes might be written: Lines: 12, 13
1>c:\documents and settings\yhkim\my documents\visual studio 2005\projects\testtest\main.cpp(13) : warning C6387:
'argument 1' might be '0': this does not adhere to the specification for the function 'FillChar': Lines: 12, 13
¿ö´×¸¸ ÇØ°áÇÑ´Ù¸é FillCharÀº ³ª¸§´ë·Î È¿À²ÀûÀÌ°í ¾ÈÀüÇÏ°Ô ¾²¿´´Ù°í ÇÒ ¼ö ÀÖ°Ú´Ù.
/analyze ¿É¼Ç°ú °ü·ÃÇØ¼ ¼ö½Ê°³ÀÇ »õ·Î¿î warningÀ» ´ÙÀ½¸µÅ©¿¡¼ Ãß°¡·Î º¼¼ö°¡ ÀÖ´Ù. ¿øÇÏÁö ¾Ê´Â WarningÀÌ ÀÖ´Ù¸é
Àü󸮱â·Î
²ô¸é µÇ°Ú´Ù.
http://msdn2.microsoft.com/en-us/library/a5b9aa09(VS.80).aspx
SAL¿¡ ´ëÇÑ °¡Àå ÁÁÀº ¸Þ´º¾óÀº sal.h¿¡ ¾ÕºÎºÐ¿¡ ±â¼úµÇ¾î ÀÖ´Â ÁÖ¼®ÀÌ´Ù. ½Ã°£À» ³»¾î ÀÚ¼¼È÷ »ìÆì º¸¸é ¸Å¿ì À¯¿ëÇÑ
¸ÅÅ©·ÎµéÀ»
¹ß°ßÇÒ ¼ö ÀÖ°í, assertó·³ °è¼ÓÀûÀ¸·Î »ç¿ëÇÏ·Á´Â ½À°üÀ» µéÀÌ´Â ³ë·ÂÀ» ÇØ¾ß ÇÑ´Ù.
__in °ú °°Àº°ÍÀ» »ç¿ëÇÏ¸é ¾Õ¼ ¸»Çß´ø referenceÀÇ ÀåÁ¡À» ±×´ë·Î °¡Àú°¡¸é¼ °ü½À´ë·Î point¸¦ À¯¿¬ÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù.
¸¶Áö¸·À¸·Î, strsafe.h ¿¡ Á¤ÀÇµÈ StringCchCopy¸¦ ´Ù½Ã »ìÆì º¸¸é ´ÙÀ½°ú °°ÀÌ µÇ¾î ÀÖ´Ù.
STDAPI StringCchCopy( __out_ecount(cchDest) LPTSTR pszDest,
__in size_t cchDest,
__in LPCTSTR pszSrc
);
°¢ ÀÎÀÚµé ¾Õ¿¡ SAL°ú °°Àº AnnotationÀÌ ºÙ¾î ÀÖ´Ù. Windows Vista¿¡¼ strcpy °°Àº ºÒ¾ÈÇÑ ÇÔ¼ö¸¦ »ç¿ëÇÏÁö ¾Ê°í
ÀÌ·¸°Ô SALÀ»
»ç¿ëÇßÀ» °æ¿ì ±âÁ¸ÀÇ ¹öÆÛ¿À¹ö·± ¿¡·¯À²À» 84%³ª °¨¼Ò½Ãų¼ö ÀÖ¾ú´Ù°í ÇÑ´Ù. À̰ÍÀº strsafe.h¿¡ ÀÖ´Â ÇÔ¼ö¸¦ Àû±Ø
»ç¿ëÇ϶ó´Â
ÀÌÀ¯Áß Çϳª°¡ µÇ±âµµ ÇÏ´Ù.
|