당신은 당신의 코드에 문제가 : 당신은에 가리키는 char
을 '\0'
에 대해 자신을 src
테스트하고 있지 않습니다.
while (src != '\0');
는 고속 /가 짧은 얻을
while (*src != '\0');
먼저 바로 그것을 얻을 수 있어야합니다.
이 페이지 전체에서 예외 안전성에 대해 쓰고 있습니다. C를 사용하고 있으므로 예외 (예 : C++이 아닌)와 같은 모국어 개념이 없습니다.
어쨌든, 당신의 코드를 올릴 수있는 예외의 유일한 유형은 하드웨어 예외는 정상에 의해 체포 될 수 없다 (페이지 오류, 스택 오류, 정렬 검사, ...)입니다 C++ try-catch
. 하드웨어 예외 처리는 플랫폼에 따라 다르므로 플랫폼 특정 메커니즘을 사용하여이를 catch해야합니다 (Windows의 경우 SEH, Unix의 경우 signal handler). 이 접근법은 내가 추천 한 것은 아니지만,을 읽으십시오.
하드웨어 예외를 포착하는 것보다 훨씬 나은 방법은 시도하지 않는 것이 좋습니다. 귀하의 코드에서 이것은 단지 != 0
에 대한 입력 포인터를 테스트하는 것을 의미합니다. char* dst = 0xDEADBEEF;
과 같은 유효하지 않은 포인터를 식별 할 기회가 없으며 액세스 한 후에 예외를 처리 할 수있는 유일한 방법은 위에서 언급 한 것과 같은 플랫폼 종속 코드입니다. 그러나 이와 같은 하드 오류는 일반적으로 프로그램에서 처리해서는 안됩니다.
예 :
// Returns the new string length, or -1 on error.
int strcat(char* dst, char const* src)
{
// Check arguments before doing anything.
if (dst == 0)
return -1;
if (src == 0)
return -1;
// Store begin of destination to compute length later on.
char const* const dstBegin = dst;
// Skip to end of destination.
while (*dst != '\0')
*dst++ ;
// Copy source to destination.
do
{
*dst++ = *src++;
}
while (*src != '\0');
// Return new length of string (excluding terminating '\0').
return (dst - dstBegin - 1);
}
가 선택적으로 당신은 당신이 효과적으로 탐지하고 버퍼 오버 플로우를 방지 할 수 있도록 대상 버퍼의 크기를 나타내는 것
dstSize
매개 변수를 도입 할 수있다. 당신이 원하는 경우
당신은 작동하는 것 같다면,이 codereview.stackexchange.com로 이동합니다 ... 한 줄에 –
을 기록 할 수 있습니다. 코드가 작동합니까? 무슨 이슈가 아니라면, 제발? – alk
@alk 당신은 그것을 보아서는 안됩니다. 심각한 문제가 있습니다. –