함수에 관한 질문입니다.

lovejin0309의 이미지

C 언어에 대해 질문 드립니다.

다음과 같은 형태로 호출하는 함수가 있습니다.

Fun A ----- > Fun B ----> Fun C

위와 같은 상황에서 함수 B가 함수 C를 호출하면 함수 A는 메모리에서 삭제해야 합니다. 가능할까요?

raynear의 이미지

스택에 순서대로 호출되서 쌓이는데 A를 삭제하면 돌아갈 곳이 없어지잖아요

안될거라고 생각하는데요...

그런거 없다

lovian의 이미지

캐너리 비트같은 것이 복잡하게 쌓이지 않는다면야
리턴어드레스를 변조하는 법도..

-----------------
한글을 사랑합니다.

cinsk의 이미지

DLL을 제외한다면, LISP 계통의 언어가 아닌 이상, 함수를 메모리에서 제거하는 것은 불가능합니다.

spacelee의 이미지

저는 답은 잘 모르겠지만, (안될꺼 같긴 한데...^^:;)
호기심에서..왜 그런 상황이 필요한지 정말 궁금합니다.~
주어진 문제가 어떤건지 알려주시면 안될까요?^^

권위를 의심할 것,어긋남을 존경할 것,자리잡기를 거부할 것,항상 자신을 재창조할 것 - MIT 미디어랩 -

익명 사용자의 이미지

머 실용성은 없겠지만..

inline assembly 로

마치 a 에서 온것이 아닌냥..
link register 를 변조하고
함수 text 부분을 지우고.. 하면 불가능할것도 없죠..

익명 사용자의 이미지

장모군 wrote:
머 실용성은 없겠지만..

inline assembly 로

마치 a 에서 온것이 아닌냥..
link register 를 변조하고
함수 text 부분을 지우고.. 하면 불가능할것도 없죠..

조그마한 예제를 올려주시면 감사하겠습니다.

kkb110의 이미지

마침 제가 예전에 테스트용으로 만들어본 소스가 있어서 올립니다.
vc++에서만 컴파일 되구요.
흠 함수 지우는 부분은 아니고 장모군님이 말씀하신 "inline assembly로 마치 a에서 온것이 아닌냥.." 하는 부분입니다.

main에서 ff(3)을 호출하면 ff함수에서는 f(2,3)을 호출합니다.
f(2,3)은 전역변수 z를 2*3으로 설정하고 main으로 곧바로 돌아갑니다.
그래서 ff함수의 z=10이 실행되지 않고 6이 출력됩니다.

#include <tchar.h>
#include <iostream>


void __stdcall f(char x,char y);
char z;

void __declspec(naked) ff(char y)
{
    _asm
    {
        pop     ebx;
        push    2;
        push    ebx;
        jmp     f;
        
    }
    z = 10;
}

int _tmain(int argc, _TCHAR* argv[])
{
    ff(3);
 
    _asm sub         esp,4;
 
    std::cout << (int)z;
    std::cin >> z;
    return 0;
}

void __stdcall f(char x,char y)
{
    z = x*y;
}
전웅의 이미지

kkb110 wrote:
마침 제가 예전에 테스트용으로 만들어본 소스가 있어서 올립니다.
vc++에서만 컴파일 되구요.
흠 함수 지우는 부분은 아니고 장모군님이 말씀하신 "inline assembly로 마치 a에서 온것이 아닌냥.." 하는 부분입니다.

main에서 ff(3)을 호출하면 ff함수에서는 f(2,3)을 호출합니다.
f(2,3)은 전역변수 z를 2*3으로 설정하고 main으로 곧바로 돌아갑니다.
그래서 ff함수의 z=10이 실행되지 않고 6이 출력됩니다.

#include <tchar.h>
#include <iostream>


void __stdcall f(char x,char y);
char z;

void __declspec(naked) ff(char y)
{
    _asm
    {
        pop     ebx;
        push    2;
        push    ebx;
        jmp     f;
        
    }
    z = 10;
}

int _tmain(int argc, _TCHAR* argv[])
{
    ff(3);
 
    _asm sub         esp,4;
 
    std::cout << (int)z;
    std::cin >> z;
    return 0;
}

void __stdcall f(char x,char y)
{
    z = x*y;
}

floating-point register 만 무시할 수 있다면, 리눅스 상에서는
C 언어만으로도 동일한 기능 구현이 가능합니다.

하지만, 이미 표준 라이브러리에 non-local jump 가 제공되므로, 이를
활용하는 것이 여러모로 좋으리라 생각합니다.

#include <setjmp.h>
#include <stdio.h>

int z;
jmp_buf jb;

void f(int x, int y)
{
    z = x * y;
    longjmp(jb, 1);    // jumps to main
}

void ff(int y)
{
    f(2, y);
    z = 10;    // never executed
}

int main(void)
{
    if (setjmp(jb) == 0)
        ff(3);

    printf("%d\n", z);    // prints 6, not 10

    return 0;
}

그나저나 OP 의 "함수 A는 메모리에서 삭제해야 합니다" 가 단순히
non-local jump 를 뜻하는 것인지, 실제 물리적 메모리에서 함수 스택 및
함수 이미지를 지워야 한다는 뜻인지는 분명치 않네요.

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

kkb110의 이미지

좋은거배워가네요~ 감사합니다 전웅님! :D

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.