함수포인터 호출시 인자 개수가 안맞는 경우 문제가 되나요?
글쓴이: trymp / 작성시간: 목, 2021/11/11 - 1:16오후
int testfunc(int a, intb) { return (a+b); } void dummyfunc(void) { printf("dummy"); } int main(int ac, char *av[]) { typeof(testfunc) *funcptr; funcptr = (typeof(testfunc))dummyfunc; funcptr(3,5); return 0; }
위와 같이 함수포인터에 인자가 적은 함수를 넣어서 호출해도 문제가 없을까요?
메모리를 깨거나 하는 문제는 없을까요?
노파심에 질문드립니다. 도움 주시면 감사하겠습니다 .
Forums:
함수 호출 인터페이스가 architecture 마다
함수 호출 인터페이스가 architecture 마다 좀 다릅니다.
통상적으로 함수의 매개변수는 register 를 통해 전달되는데, 레지스터를 몇개 사용하느냐의 문제가 되며, 이는 메모리를 깨거나 심각한(?) 문제를 만들진 않습니다.
위의 예제와 같이 dummyfunc() 가 아무 매개변수를 확인하지 않아 문제가 없지만, dummyfunc(int a, int b, int c) 등과 같이 선언되어있으면 의도하지 않은 값이 c 변수에서 사용될 가능성이 있습니다..
자세한건, 컴파일 한 실행파일을 disassemble 해서 확인해보시는게 정확합니다.
https://en.wikipedia.org/wiki/Calling_convention
누구나 한번쯤은 생각해보기도 하고 실제로 해 보았을
누구나 한번쯤은 생각해보기도 하고 실제로 해 보았을 주제네요.
코드를 정확한 입력에 한해서 정확한 출력을 반환하는 머신이라고 정의하면 위와 같은 실험은 정확한 결과를 얻을 수 없다고 봐야 할 겁니다.
IDE에 따라서 소스 코드 수준이 아니라 어셈블리 수준에서 line-by-line으로 step debug가 가능한게 있을 겁니다. 여러가지 상황에서 어떻게 스택 레지스터가 변하는지 보세요. 별 영양가는 없지만 함수 호출이 어떤 방식으로 이루어지는지 실습할 수 있게 됩니다.
댓글 달기