[C언어] Flex&Bison을 이용한 MiniC Compiler 구현 중 FILE 포인터에 의한 메모리 침범 문제
안녕하세요.
현재 학교 수업으로 컴파일러를 배우고 있는 대학생입니다.
제가 여쩌보고픈 문제는 바로 파일 입출력을 위한 FILE*와 구조체 동적할당간의 메모리 침범에 대해서 입니다.
수업 과제로 Flex&Bison을 이용해 MiniC Compiler를 구현하게 되었는데요.
과제를 하는 내내 문제가 생겼던 부분이 하나 있습니다.
바로 포인터를 이용한 동적할당 시 생길 수 있는 메모리 침범 문제 때문입니다.
저는 AST를 AST.h의 PROGRAM이라는 구조체에 동적할당을 통해 트리 구조로 저장시켰습니다.
그런데 문제는 파일 포인터를 이용해 파일로 출력시켜야 하는데 파일포인터를 사용하면, 정확히 말하면 파일 포인터에 fopen 함수를 이용해 파일 정보를 저장시키면 PROGRAM안에 저장되어있는 하위 노드의 주소값이 변경되는 겁니다.
아래 이미지파일 두 개는 파일 포인터를 쓴 것과 안 쓴 것의 결과를 올린 것입니다.
결과 화면의 주소값을 잘 보시면 세그멘테이션 오류가 난 결과는 root->FuncList->prev 가 이상한 음수 값으로 나옵니다.
텍스트 편집기로는 VI를 사용했고, 컴파일러는 gcc를 사용했습니다.
FLEX와 BISON을 통해 어휘분석기와 구문분석기가 만들어지고, 거기에 printAST.c라는 파일을 합쳐서 gcc로 컴파일 했습니다.
혹시 FLEX와 BISON이 문제인가 해서 파일 포인터와 fopen함수를 printAST로 옮겨서도 실행해보았지만 실패했습니다.
현재 파일포인터 관련 변수와 함수는 minic.y파일에 작성되어 있습니다.
FILE *f는 8번 줄에, fopen 함수는 701번 줄에 있습니다.
제발 해결책을 알려주시면 감사하겠습니다.
첨부 | 파일 크기 |
---|---|
![]() | 734.68 KB |
![]() | 607.17 KB |
![]() | 1.32 MB |
음 ..
minic.y 에 보면 memory alloc 하는 부분을 전부 malloc(sizeof(struct PROGRAM*)) 와 같이 쓰셨는데..
결과적으로 temp 에는 구조체 크기가 아닌 포인터 크기만큼만 공간이 할당됩니다.
일단은 저렇게 쓰신 부분 전부 찾아서 실제 구조체 크기만큼 할당하도록 고치고 다시 돌려보세요.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
댓글 달기