Stack around the variable '변수명' was corrupted 오류 질문 좀 부탁드립니다. ㅠㅠ

조회수 478회

define _CRT_SECURE_NO_WARNINGS

include

include

include

char* my_strcap(char* str1, char* str2) { char* result = (char*)malloc(sizeof(char) * 40);

int i, j;

if (result != NULL)
{
    //배열 형태로 문자열이 저장되어 있으니 각 배열 인덱스에 저장하는 방식
    for (i = 0; i < *(str1 + i) != 0; i++)
    {
        *(result + i) = *(str1 + i);
    }
    //i+j인 이유는 첫번째 배열이 저장된 인덱스 다음 인덱스에 저장되어야 하기 때문
    //처음 문자열이 4글자라고 하면 i는 0,1,2,3까지 돌고 4인 상태로 넘어옴
    //즉 4번째 인덱스부터 넣어주게 될 것임
    for (j = 0; i < *(str2 + j) != 0; j++)
    {
        *(result + i + j) = *(str2 + j);
    }
    //문자열의 끝을 지정하기 위해서.
    //마찬가지로 두번째 문자열이 3글자이면 j는 3인 상태로 넘어옴
    //즉 4+3 = 7인 인덱스에 넣어질 것임.
    //abcd + efg (+ null)로 총7글자, 배열로 따지면 arr[7]임.
    *(result + i + j) = NULL;
}

return result;

}

int main() { char input1[21], input2[21]; int input_1 = 0, input_2 = 0;

do
{
    scanf("%s %s", input1, input2);

    input_1 = strlen(input1);
    input_2 = strlen(input2);

    printf("%d, %d", input_1, input_2);

    if (input_1 <= 20 && input_2 <= 20)
    {
        printf("%s", my_strcap(input1, input2));
    }
    else
    {
        printf("입력 오류로 종료함.\n\n");
    }

} while (input_1 > 20 || input_2 > 20);

return 0;

}

//질문 들어가겠습니다..

해당 구문은 20자 이내의 문자열 2개를 받고, 두 문자열이 각각 20자 이내라면 이어주는 코드입니다.

한번에 두 문자열이 각각 20자 이내면 문제 없이 진행되나

한번이라도 두 문자열 중 한 문자열이라도 20자가 넘으면 다시 입력을 받는데 이 과정에서

제대로 입력이 되어도 마지막에 Stack around the variable '변수명' was corrupted. 라는 오류가 뜹니다.

이는 배열의 크기보다 더 큰? 입력이 들어가거나 할 때 발생한다고 하는데..아무리 생각해도 해결법을 모르겠습니다.

어떻게 하면 될까요?

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • linux 기준으로 간단히 말씀드리면...

    -------스택-------
    input_B
    input_A
    canary bit
    eip
    ------------------
    

    인데 input_B 와 input_A 는 스택위치는 컴파일러에 따라 달라질거같네요 여튼... 특정 변수(위 경우 input_A) 의 길이가 넘어갈경우 canary bit 를 오염시켜서 프로그램내 메모리 오염(해킹)을 식별한거고요..

    해결책은

    #define _CRT_SECURE_NO_WARNINGS 이거 끄시고 scanf_s를 사용하셔서.. 입력받을 길이에 대해 검증하세요..

  • 답변이라고 할 수 있는지모르겠지만 제의견을 적어둘께요. 저는 실행이 됐습니다! 하지만 코드는 20자이내라면 멈추고 20자이상이면 다시입력받는코드인것같아요.

    abcdefghijklmnopqrstuvwxyz //첫번째입력
    asdfdsasdf //두번째입력
    26, 10입력 오류로 종료함. //오류가 났으므로 종료해야합니다
    //printf("입력 오류로 종료함.\n\n");이라서 2번 줄바꿈되고, 
    asdfdsaasdfdsadsfds //다시루프가 됩니다.
    adsfasdfa
    19, 9asdfdsaasdfdsadsfdsadsfasdfa //제대로 입력했더니 종료됩니다.
    

    입출력이 위와같이됐습니다.

    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h> 
    #include <stdlib.h>
    #include <string.h>
    
    char* my_strcap(char* str1, char* str2)
    {
        char* result = (char*)malloc(sizeof(char) * 40);
    
        int i, j;
    
        if (result != NULL)
        {
            //배열 형태로 문자열이 저장되어 있으니 각 배열 인덱스에 저장하는 방식
            for (i = 0; i < *(str1 + i) != 0; i++)
            {
                *(result + i) = *(str1 + i);
            }
            //i+j인 이유는 첫번째 배열이 저장된 인덱스 다음 인덱스에 저장되어야 하기 때문
            //처음 문자열이 4글자라고 하면 i는 0,1,2,3까지 돌고 4인 상태로 넘어옴
            //즉 4번째 인덱스부터 넣어주게 될 것임
            for (j = 0; i < *(str2 + j) != 0; j++)
            {
                *(result + i + j) = *(str2 + j);
            }
            //문자열의 끝을 지정하기 위해서.
            //마찬가지로 두번째 문자열이 3글자이면 j는 3인 상태로 넘어옴
            //즉 4+3 = 7인 인덱스에 넣어질 것임.
            //abcd + efg (+ null)로 총7글자, 배열로 따지면 arr[7]임.
            *(result + i + j) = NULL;
        }
    
        return result;
    }
    
    int main()
    {
        char input1[21], input2[21];
        int input_1 = 0, input_2 = 0;
    
        do
        {
            scanf("%s %s", input1, input2);
    
            input_1 = strlen(input1);
            input_2 = strlen(input2);
    
            printf("%d, %d", input_1, input_2);
    
            if (input_1 <= 20 && input_2 <= 20)
            {
                printf("%s\n", my_strcap(input1, input2));//잘보이게 \n를 넣어봤습니다.
            }
            else
            {
                printf("입력 오류로 종료함.\n\n");
            }
    
        } while (input_1 < 20 && input_2 < 20); //여기의 부호가 반대였습니다. (>) 와 (||)
    
        return 0;
    }
    

    해결방법은 모르지만 저의경우 Stack around the variable '변수명' was corrupted.에러는 input1와 input2둘다 20이상일때 났습니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)