C ++函数“自动”返回值?

时间:2017-05-08 21:03:07

标签: c++

这是如何工作的?在编写此函数时,我忘记包含return语句:

char *getV(const char *var) {
    char *val = nullptr;
    forward_list<formField>::iterator idx;

    formField ffld;
    idx = _fields.begin();
    while (idx != _fields.end()) {
        ffld = *idx;
        if (strcmp(ffld.Name, var) == 0) {
            val = ffld.Val;
            break;
        }
        idx++;
    }
}

以下是formField

struct formField {
    char    *Name   = nullptr;
    char    *Val    = nullptr;
};

以下是我调用函数的方法:

int main () {
    form fdata;

    fdata.add("FirstName", "Alan");

    char *fval = fdata.getV("FirstName");
    if (fval != nullptr) cout << fval;
    else cout << "not found";
    cout << "\n";
}

在测试函数并编写使用它的其他代码之后,我才注意到丢失的return。该函数应该返回*val ......它确实如此!怎么样?

2 个答案:

答案 0 :(得分:6)

您的平台的调用约定指定函数如何返回它想要返回给调用者的值(例如:保存在寄存器中)。由于寄存器存在,调用者代码只是获取它在那里找到的值,可能是垃圾,或者实际的好价值。无论哪种方式,您的程序都会调用未定义的行为,它不再受信任。

解决方案是打开编译器警告。例如,关于GCC或Clang:

g++ -Wall -Wextra -Werror

答案 1 :(得分:3)

根据[stmt.return]强调我的):

  

在构造函数,析构函数或具有cv void返回类型的函数的末尾流动,相当于没有操作数的return。   否则,离开main以外的函数末尾会导致未定义的行为

通常,您可以通过打开并阅读编译器生成的警告来捕获这些错误(例如,使用带有GCC或Clang的-Wall -Wextra)。