2015-01-08 1 views
0

내가 MSVC와 ICC의 문제가 발생했습니다 스택 손상 컴파일러없이 __stdcall과 가변 인자 사용 : 나는 규칙을 호출 stdcall을 가진 varadic 인수를 사용할 필요가어떻게

을하지만, 컴파일러는 varadic 그것을 무시 스택을 손상시킵니다.

쉽게 해결할 수있는 방법은 인수의 수를 인수로 취한 다음 ESP을 오프셋하기 전에,이 경우에는 함수의 컨텍스트에 대한 인수의 수를 필요로하지 않습니다. 가능하다면 그것을 회피 할 것입니다.

누군가이 방법이 있는지 알고 있습니까? documentation으로 당

+2

기본적으로 할 수 없습니다. 'stdcall'을 사용할 때 _callee_는 스택 정리를 담당합니다. _callee_는 인수의 수 또는 인수가 차지하는 스택 공간의 양을 알지 못하므로 추가 정보가 제공되지 않으면 논리적으로 스택을 정리할 수 없습니다. 당신이하려고하는 것은 좋은 생각이 아니며 그것을 작동시키려는 시도는 그것이 가치있는 것보다 훨씬 더 많은 노력이 될 것입니다. 이것은 XY 문제처럼 들리므로 실제로하려는 것을 재고해야합니다. –

+0

@CaptainObvlious 이것은 전통적인 기능이 아닙니다. 그리고 정말로 가장 좋은 해결책은 내가 묻는 것 (가능한 경우)을하는 것입니다. 그러나 요한의 대답에 대한 제 응답을보십시오. 그것은 조금 더 설명합니다. – Nowayz

답변

1

:

수신자 스택 청소 때문에 컴파일러 가변 인자 함수 __cdecl한다.

이 점을 감안할 때 어떻게 진행할 것인지 잘 모르겠습니다. stdcall에 호출 대상이 스택을 정리해야하지만 vararg 함수에서 호출하는 경우 컴파일 타임에 스택에있는 내용을 알 수 없습니다. 어떻게 작동합니까? stdargva_list 매크로가 호출 프레임을 조작 할 것으로 기대하십니까? 나는 그것이 마이크로 소프트가 보는 방법이라고 생각하지 않는다. 그래서 적어도 마이크로 소프트 컴파일러를 사용하여 C를 작성하는 것만으로는 불가능한 것처럼 보인다.

+0

99 %의 인스턴스에서 시도하는 것은 어리석은 일이며,이 점에 동의합니다. 불행히도 내 함수에서 스택을 올바르게 정리하지만 스택을 정리하는 것은 내 코드가 아니기 때문에 스택을 정리할 수 없습니다. – Nowayz

+2

@Nowayz 부끄러워하지 마라, 그것은 우스운 시간의 100 % 다. –

+0

@CaptainObvlious Not This time :)이 함수는 스택을 자체적으로 정리하는 WINAPI (stdcall)로 프록시를 호출 한 다음 스택 맨 위에서 섞어 야하기 때문에 캐시 된 retn 포인터로 다시 jmp를 수행합니다. 스택에는 매번 제대로 청소해야한다는 100 % garuntee가 있지만 컴파일러는 여전히이를 시도합니다. – Nowayz