어떤 이유가있을 수 있으며이를 어떻게 수정합니까?
한 시나리오는 다음 예제와 같습니다
: 당신은 문자열 또는 문자열의 일부를 취소 할 수 있습니다
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void swap (char *a , char *b);
void revSTR (char *const src);
int main (void){
char arr[] = "A-B-C-D-E";
revSTR(arr);
printf("ARR = %s\n", arr);
}
void swap (char *a , char *b){
char tmp = *a;
*a = *b;
*b = tmp;
}
void revSTR (char *const src){
char *start = src;
char *end = start + (strlen(src) - 1);
while (start < end){
swap(&(*start) , &(*end));
start++;
end--;
}
}
이 프로그램에서는 이런 일에 예를 호출 reverse()
을위한 경우
reverse(arr + 2);
이 같은 배열의 길이 통과하기로 결정하는 경우 :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void swap (char *a , char *b);
void revSTR (char *const src, size_t len);
int main (void){
char arr[] = "A-B-C-D-E";
size_t len = strlen(arr);
revSTR(arr, len);
printf("ARR = %s\n", arr);
}
void swap (char *a , char *b){
char tmp = *a;
*a = *b;
*b = tmp;
}
void revSTR (char *const src, size_t len){
char *start = src;
char *end = start + (len - 1);
while (start < end){
swap(&(*start) , &(*end));
start++;
end--;
}
}
을
잘 작동합니다.
그러나 당신이 할 때 :
revSTR(arr + 2, len);
당신이 얻을 수 :
==7125== Command: ./program
==7125==
ARR = A-
*** stack smashing detected ***: ./program terminated
==7125==
==7125== Process terminating with default action of signal 6 (SIGABRT)
==7125== at 0x4E6F428: raise (raise.c:54)
==7125== by 0x4E71029: abort (abort.c:89)
==7125== by 0x4EB17E9: __libc_message (libc_fatal.c:175)
==7125== by 0x4F5311B: __fortify_fail (fortify_fail.c:37)
==7125== by 0x4F530BF: __stack_chk_fail (stack_chk_fail.c:28)
==7125== by 0x400637: main (program.c:14)
을 그리고 첫 번째 코드에서, arr
의 길이는 괜찮 revSTR()
의 내부에 선택되어 있기 때문에 이런 일이 발생, 두 번째 코드에서는 길이를 전달합니다 :
revSTR(arr + 2, len);
길이가 이제는 arr + 2
이라고 말할 때 실제로 길이가 길어집니다.
길이는 strlen (arr + 2)
! = strlen (arr)
입니다.
코드의 어느 부분에서 스택 스매싱이 발생했는지 확인할 수 있습니까? 그러면 우리는 왜 그것이 어떻게 일어나고 그것을 정정하는지를 정확히 지적 할 수있을 것입니다. –