精华内容
下载资源
问答
  • C/C++获取函数返回地址

    千次阅读 2012-03-11 13:20:33
    一般而言, 能否覆盖函数返回地址是栈溢出攻击成功与否的前提, 而获取函数返回地址原理很简单, 栈回溯即可, 下面是x86上相应获取代码(仅为示例不可用于生产): #define Stack_Length (4 * 4 * 4) static void *_esp_...
    一般而言, 能否覆盖函数返回地址是栈溢出攻击成功与否的前提, 而获取函数返回地址原理很简单, 栈回溯即可, 下面是x86上相应获取代码(仅为示例不可用于生产): 
    
    #define Stack_Length (4 * 4 * 4)
    static void *_esp_arr[Stack_Length];
    void *GetRet(void *caller)
    {
    	void *_esp;
    	__asm mov _esp, esp
    	for (int i = 0; i <= Stack_Length - 1; ++i) {
    		_esp_arr[i] = &_esp[i];
    	}
    	DWORD Protect = 0x00, CodeProtect = Protect | PAGE_EXECUTE_READ;
    	for (int k = 0; k <= Stack_Length - 1; k++) {
    		if (_esp[k] > caller) {
    			Protect = MemoryAllocator::Query(AppBase::GetCurrentProcess(), *_esp_arr[k])->Protect;
    			if (Protect == CodeProtect) {
    				_esp = _esp_arr[k]; 
    				break;
    			}
    		}
    	}
    	return *_esp;
    }
    

    函数返回地址受编译器优化影响, 比如内联、函数打包等, 在实际生产过程中, 获取函数返回地址应用范围似乎有限, 但是在模块调用合法性检查、自定义异常跳转(其实setjmp和longjmp就可以了)、异常信息打印等功能上确十分有用, 主流C/C++编译器都提供了内建拓展来获取函数返回地址, 比如

    // gcc
    __builtin_return_address

    // msvc
    // https://docs.microsoft.com/zh-cn/cpp/intrinsics/returnaddress
    _ReturnAddress



    展开全文
  • 函数返回地址

    千次阅读 2019-01-16 20:20:39
    #include &lt;iostream&gt; #include&lt;stdio.h&...int *fun(int *a, int *b)///形参为指针变量时形参和实参数据是可以传递的 ...///把a,b中较大数的那个地址作为函数值传回 return b; } int ...

     

    #include <iostream>
    #include<stdio.h>
    using namespace std;
    int *fun(int *a, int *b)///形参为指针变量时形参和实参数据是可以传递的
    {
        if( * a > * b)return a;///把a,b中较大数的那个地址作为函数值传回
        return b;
    }
    int main()
    {
        int x,y,*p;
        printf("Enter x y: ");
        scanf("%d%d",&x,&y);///实参取地址,将x地址作为参数传递给a
        p=fun(&x,&y);///函数的数据类型可以是数据类,可以是指针类型
        printf("x=%d + y=%d *p= %d\n",x,y,*p);
        return 0;
    }
    

     

    展开全文
  • Go语言---函数返回局部变量地址

    千次阅读 多人点赞 2018-05-05 21:10:52
    一、C语言中返回函数中局部变量值和指针(1) 在...(2) 函数返回局部变量地址:局部变量内存分配在栈空间,因为函数返回后,系统自动回收了函数里定义的局部变量,所以运行时去访问一个被系统回收后的地址空间,一定就...

    一、C语言中返回函数中局部变量值和指针

    (1) 在C语言中,一个函数可以直接返回函数中定义的局部变量,其实在函数返回后,局部变量是被系统自动回收的,因为局部变量是分配在栈空间,那为什么还可以返回局部变量,其实这里返回的是局部变量的副本(拷贝)

    (2) 函数返回局部变量地址:局部变量内存分配在栈空间,因为函数返回后,系统自动回收了函数里定义的局部变量,所以运行时去访问一个被系统回收后的地址空间,一定就会发生段错误,这是C/C++语言的特点。内存空间分配在堆中即可。

    二、GO函数中返回变量,指针

    示例代码:

    package main
    
    import "fmt"
    
    func fun() *int {    //int类型指针函数
        var tmp := 1
        return &tmp      //返回局部变量tmp的地址
    }
    
    func main() {
        var p *int
        p = fun()
        fmt.Printf("%d\n", *p) //这里不会像C,报错段错误提示,而是成功返回变量V的值1
    }

    参考go FAQ里面的一段话:

    How do I know whether a variable is allocated on the heap or the stack?
    
    From a correctness standpoint, you don't need to know. Each variable in Go exists as long as there are references to it. The storage location chosen by the implementation is irrelevant to the semantics of the language.
    
    The storage location does have an effect on writing efficient programs. When possible, the Go compilers will allocate variables that are local to a function in that function's stack frame. However, if the compiler cannot prove that the variable is not referenced after the function returns, then the compiler must allocate the variable on the garbage-collected heap to avoid dangling pointer errors. Also, if a local variable is very large, it might make more sense to store it on the heap rather than the stack.
    
    In the current compilers, if a variable has its address taken, that variable is a candidate for allocation on the heap. However, a basic escape analysis recognizes some cases when such variables will not live past the return from the function and can reside on the stack.

    意思是说go语言编译器会自动决定把一个变量放在栈还是放在堆,编译器会做逃逸分析(escape analysis),当发现变量的作用域没有跑出函数范围,就可以在栈上,反之则必须分配在堆。所以不用担心会不会导致memory leak,因为GO语言有强大的垃圾回收机制。go语言声称这样可以释放程序员关于内存的使用限制,更多的让程序员关注于程序功能逻辑本身。

    对于动态new出来的局部变量,go语言编译器也会根据是否有逃逸行为来决定是分配在堆还是栈,而不是直接分配在堆中。

    结论:

    函数内部局部变量,无论是动态new出来的变量还是创建的局部变量,它被分配在堆还是栈,是由编译器做逃逸分析之后做出的决定。
    展开全文
  • C++ 不支持在函数返回局部变量的地址,除非定义局部变量为 static 变量。 错误代码: int main(){ int *p; p=funcGetPointer(); for (int i = 0; i ; i++) { cout*(p+"): "; cout*(p+i)<<en
    C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为  static  变量。

    错误代码:

    int main(){
     
        int *p;
        p=funcGetPointer();
        for (int i = 0; i < 10; i++)
        {
            cout<<"*(p+"<<i<<"):  ";
            cout<<*(p+i)<<endl;
        }
        return 0;
    }
     
    //函数返回指针
    int * funcGetPointer(){
     
        int arr[10];
        srand((unsigned)time(NULL));
        for (int i = 0; i < 10; i++)
        {
            arr[i]=rand()%7+2;
        }
        cout<<"The contents is:"<<endl;
        for (int i = 0; i < 10; i++)
        {
            cout<<arr[i]<<"  ";
        }
        cout<<endl;
        return arr;
    }


    传递之后并不能得到正确的数组的值。

    原因就是在数组内的数组没有设为静态。

    更改:其他位置不变,只是将返回指针的函数中的数组变为静态即可:


    运行结果:

    展开全文
  • read函数返回立即返回0

    万次阅读 2017-09-13 20:53:19
    最近在测试一个网络程序的时候,每次调用read函数返回立即返回0,read是阻塞函数,没有读到数据竟然立即返回0,有些奇怪。想了一下,和tcp的四次挥手有关,看代码。 服务端: #include #include #include #...
  • C++函数返回引用

    万次阅读 多人点赞 2016-12-08 13:31:23
    函数返回值和返回引用是不同的 函数返回值时会产生一个临时变量作为函数返回值的副本,而返回引用时不会产生值的副本,既然是引用,那引用谁呢?这个问题必须清楚,否则将无法理解返回引用到底是个什么概念。以下是...
  • 函数返回结构体的内幕

    万次阅读 2014-11-23 13:08:01
    函数返回结构体的内幕 在刚接触C语言编程时,无论是前辈还是教科书,都反复告诫我们两件事: ①函数的参数是值传递(意味着在函数中对参数本身的修改无法“传回”); ②不要返回函数体内局部变量的地址,因为...
  • Matlab 函数返回多个值--样例

    万次阅读 多人点赞 2018-02-14 19:52:36
    1.第一行写 function [返回值1/返回矩阵1,返回值2/返回矩阵2,...,返回值n/返回矩阵n]=该函数文件名(参数1,参数2,...,参数n) 2.第二行开始写你的函数代码 二、下面是一个简单的例子 现在需要将xx矩阵和yy...
  • 函数返回局部变量问题

    千次阅读 2016-05-21 20:16:02
    因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的...
  • C从函数返回数组

    万次阅读 多人点赞 2018-11-08 11:05:04
    如果您想要从函数返回一个一维数组,必须声明一个返回指针的函数,如下: int * myFunction() { } 另外,C 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。 现在,让我们来看下面的函数...
  • C语言,函数返回数组

    千次阅读 2018-02-04 21:48:41
    可以的,但大多数方式都是说将数组的首地址作参数输入,或是指针函数返回一个数组的首地址。而这种方式并非真正意义上的“输入”或“输出”。 参数是一个新的量被附了参考量的值,无论函数内部如何改变这个参数,都...
  • Matlab 函数返回一个值--样例

    万次阅读 2018-02-13 21:58:25
    博主针对返回多个值也有相关样例,可见于博主文章:matlab 函数返回多个值--样例 一、Matlab的函数文件--返回一个值--写法为: 1.第一行写 function 返回值/返回矩阵=该函数文件名(参数1,参数2,...,参数n) 2...
  • 函数能否返回函数内指针

    千次阅读 多人点赞 2018-06-01 08:48:12
    为什么函数能够返回 静态变量的地址而不能返回局部自动变量的地址,到底什么样的对象能够返回地址,而什么样的对象不能够返回地址?静态变量与局部自动变量的主要区别是什 么? 要想明白这些就需要理解程序的...
  • C++中函数返回引用

    千次阅读 2019-08-25 22:56:52
    1. 返回引用和不返回引用的区别 下面两个代码是在类中的成员函数,而m_data_变量为类的私有成员变量。 int& at() { return m_data_; } int at() { return m_data_; } 上面两个函数,第一个返回值是int的引用...
  • Python 函数式编程 2返回函数返回函数的意思就是:函数作为返回值。(高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。) 举个例子:实现一个可变参数的求和。 正常的函数:def calc_sum(*args)...
  • C++ 自定义函数返回类型

    千次阅读 2019-06-29 00:11:06
    为了能够让C++的函数返回类型也可以不受数量上限制,我们可以先定义一个我们希望的数据类型的类或者结构体。如果使用类的话,该类当中只包含成员变量和构造函数。下面我们定义一个同时返回一个数字和一个字符串的...
  • 因为函数的类型由它的返回类型和形参类型共同决定,与函数名无关,所以想要声明一个函数指针,只需要用指针替换函数名即可,例如:比较字符串长度的函数:bool LengthCompare(const string &amp;, const string ...
  • c++ 函数返回引用

    万次阅读 多人点赞 2010-07-17 15:15:00
    c++ 返回函数引用
  • c++函数返回引用

    万次阅读 多人点赞 2010-07-28 17:10:00
    细细研究研究函数返回引用的情况。
  • 这里可以简单的修改任意函数返回地址,可以做到自定义EIP的指向,即可执行当前进程空间的任意指令,这里只是让大家更清楚栈帧结构,没有涉及跨进程的inline HOOK 等,后面会陆续讲下读取任意进程内存,修改任意...
  • 关于 C++ 函数返回局部变量的警告

    千次阅读 2014-11-27 16:21:35
    关于 C++ 函数返回局部变量的警告 当函数返回时,局部变量和临时对象被销毁,所以返回的地址是无效的。需要修改代码,使其不返回局部对象的地址。 那么如何解决?该怎么修改代码?
  • c++ 函数返回类对象

    千次阅读 2016-12-03 11:41:26
    函数返回类对象的时候,c++编译器会进行返回值优化 返回值优化(Return value optimization,缩写为RVO)是C++的一项编译优化技术。即删除保持函数返回值的临时对象。这可能会省略两次复制构造函数,即使复制构造...
  • python 函数返回多个值

    万次阅读 2017-08-01 16:48:53
    (廖雪峰Python教程学习笔记)函数体内部的语句在执行时,一旦执行到return,函数就执行完毕,并将结果返回。 如果没有return语句,函数执行完毕后也会返回结果,只是结果为None。 return None可以简写为return。...
  • 怎样让函数返回数组

    万次阅读 2016-10-15 10:23:59
    用动态内存new和形参的方法让C++中函数返回一个数组
  • java函数返回类型

    千次阅读 2016-03-28 15:26:16
    Java有8种基本类型,均可以作为函数返回类型,除此之外还可以返回特殊类型——类。如下面的代码: public static ClassA getObject(){  ClassA newObject = new ClassA();  newObject.value+= 10;  
  • c++函数返回一个数组

    千次阅读 多人点赞 2018-12-13 19:39:02
    调用某个函数时经常需要函数返回一个值,我们都知道c++ 的函数返回的是一个copy,所以当只返回一个值时不会出现什么问题,直接return一个copy就行了,但是如果返回一个数组,事情就变得有趣了,我最近就遇到了这个...
  • Python——返回函数

    千次阅读 2018-08-16 12:03:33
    一....高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。 &gt;&gt;&gt; def lazy_sum(*args): ... def sum(): ... z = 0 ... for i in args: ... z += i ... ret...
  • 指针实现函数返回多个值

    千次阅读 2015-08-07 12:14:12
    通常情况下,函数如果有返回值,那么该...下面我们通过指针来间接实现函数返回多个值 void caculator(int a,int b,int *add,int *jian,int *cheng,float *chu){  *add=a+b;  *jian=a-b;  *cheng=a*b;
  • 在看unix环境高级编程的时候,看到里面的signal函数是一个可以返回一个函数函数; 特别惊讶,以前并没有想过C语言也可以这样实现函数。 按照书里所说,signal声明如下: #include void (*signal(int sign, void ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,708,665
精华内容 1,483,466
关键字:

函数的返回地址