gdb时候遇到的奇怪问题(关于返回值)

背景

在gdb一段代码的时候,发现在执行n的时候,并没有按照预期进行执行,而是运行到另一行代码中。而该行代码是在整体的代码逻辑中由于条件不满足是不可能进入的。
代码框架如下:

if(条件1)
    {
        处理1
        if(条件2)
        {
            处理2
            if(条件3)
            {
                处理3
                if(条件4)
                {
                    return false;
                }
                处理4
                if(条件5)
                {
                    处理5
                    return true;
                }
                else
                {
                    //如果执行到这个条件,但是缺失了一个return操作的话,则在n操作的时候跳转到OutErrorMsgFmt("一段信息");下面的return false位置。
                    //如果这行缺失的话,产生意想不到的出错??
                }
                std::cout<<"hh"<<std::endl;
            }
            else
            {
                return false;
            }
        }
        else
        {
            if(条件)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
    else
    {
        if(array.size() > 0)
        {
            if(align)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        else
        {
            std::cout<<"2222"<<std::endl;
            int flag = -3;
            std::cout<<"333"<<std::endl;
            OutErrorMsgFmt("一段信息");
            return false;//会异常跳转的位置???
        }
    }

当执行到条件5中的else中时,由于缺失一个return语句,此时如果继续n执行下一步操作的话,会先执行最外层条件1的位置,再到OutErrorMsgFmt(“一段信息”)下面的return false。这里如果在代码最后补充任何的语句,比如std::cout打印任何字符,也不会出现上述奇怪跳转。
这是由于该函数本该有一个返回值,但是程序运行的时候,发现得不到返回值。但是为何会去执行到该行的return false呢?尝试注释掉该行的return false,而在下面又增加一个return 返回值,发现原有的执行,变成新的return值的位置?猜测,是否是在寻找代码块中最末尾的return位置作为替代呢??还望高人指点?

另一个问题:

这就导出一个问题,在一个需要返回值的时候,如果函数实现过程中没有返回值呢?会如何?
下面的测试代码是可以在g++里面正常编译的,系统会给一个返回值。

int testfun(int a)
{
    if(a<0)
        std::cout<<"a"<<std::endl;
        // return true;
    else
        std::cout<<"b"<<std::endl;
}
void main()
{
    int a=10;
    // bool b = testfun(a);
    std::cout<<testfun(a)<<std::endl;}

按照https://gcc.gnu.org/onlinedocs/gcc-4.6.3/gcc/Warning-Options.html#Warning-Options
中的说法是会在编译的时候加上-Wreturn-type参数或者-Wall的时候,给出warning信息。
if语句里面的条件判断不是在编译时就可以确定的。程序运行时才知道,是动态联编。

当然,正常情况下,是可以在最后一行return一个值的,在条件中也给予对应的返回值,就不会出现这些异常。

GDB(GNU Debugger)是一个强大的调试工具,它支持多种编程语言的源代码级调试。在使用GDB调试程序,查看函数的返回值是一个常见需求。通常情况下,函数返回值存储在特定的寄存器中,这个寄存器取决于目标系统和CPU架构。例如,在x86架构的Linux系统中,函数的返回值通常存储在EAX寄存器中。 要在GDB中查看函数返回值,你可以使用以下步骤和命令: 1. 首先,启动GDB并加载你的程序: ``` gdb ./your_program ``` 2. 运行程序直到你想要检查返回值的函数执行结束。你可以使用`run`命令启动程序,并使用`break`命令设置断点。 3. 当程序在断点处停止使用`print`命令加上特定的寄存器来查看函数返回值。例如,查看返回值: ``` (gdb) print $eax ``` 如果你正在调试的是一个32位程序,并且你的GDB会话没有特别指定寄存器名称,你可能需要使用: ``` (gdb) print $ax ``` 对于返回值是结构体或者复杂类型的情况,你可以直接打印函数返回值的地址所指向的内容,例如: ``` (gdb) print *(YourReturnValueType *)$eax ``` 其中`YourReturnValueType`是函数返回值的数据类型。 4. 使用`next`、`step`或`continue`命令继续执行程序。 请注意,不同的CPU架构和操作系统可能会有不同的寄存器和约定用于存储函数返回值。例如,在64位系统中,返回值可能存储在RAX寄存器中,而且可能涉及到其他与调用约定相关的寄存器(比如x86-64架构中的RCX和RDX)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值