Codeblocks (mingw에서 GCC 사용) 내에서 Visual Studio 2008 SP1에서 만든 dll (공용 언어 런타임 지원 사용)을 사용하려고합니다. dll에 전달되는 인수 중 일부는 호출 함수에 의해 동적으로 할당됩니다. 내 질문 :DLL 호출의 힙/스택 손상
"dll에 전달되는 인수가 호출하는 함수의 힙에 상주 할 수 있습니까? 안전하게 할 수 있습니까?"
dll에서 돌아 왔을 때 호출 함수의 스택이 손상되어 액세스하려고 할 때이 문제를 디버그하려고 할 때 codeblocks 내에 SIGTRAP이 생깁니다.
왜 이런 이유가있을 수 있습니까?
DLL 함수의 프로토 타입은 다음과 같이 진행됩니다
int __cdecl myTesseractOCR(myOCRData* labels_for_ocr);
myOCRDaata 정의는 아래와 같습니다 :
typedef struct __ocr_data
{
char* arr_image [NUMOBJ_LIMIT_HIGH];
int start_x [NUMOBJ_LIMIT_HIGH];
int start_y [NUMOBJ_LIMIT_HIGH];
int width [NUMOBJ_LIMIT_HIGH];
int height [NUMOBJ_LIMIT_HIGH];
int widthstep [NUMOBJ_LIMIT_HIGH];
char number_plate_buff [2*NUMOBJ_LIMIT_HIGH];
int ocr_label_count;
} myOCRData;
arr_image 점을 호출하는 함수의 힙에있는 데이터를 어디에 같은 모든 위의 구조체의 다른 멤버는 호출하는 함수의 스택에 있습니다. 스택에있는 모든 구성원이 손상되어 프로그램이 SIGTRAP을 생성합니다. 나는 이러한 문제가 stackoverflow의 다양한 스레드에서 모두 논의되는 것을 보았지만 아직 구체적인 해결책을 찾지 못했습니다.
나는 동의하지 않습니다. DLL에서 내 보낸 함수에 구조를 전달하는 것은 매우 일상적입니다. Win32는 이것에 광범위하게 의존하며 절대적으로 훌륭하게 작동합니다. –
@ David Heffernan 구조체가 동일하게 포장되어있는 한 작동합니다. OP가 2 개의 컴파일러를 사용하기 때문에 다른 패킹이 그가보고있는 손상의 원인 일 수 있습니다. – Praetorian
그것은 실제로 가능한 원인이며이를 수정하는 것은 쉽지 않습니다. –