这是如何工作的?在编写此函数时,我忘记包含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
......它确实如此!怎么样?
答案 0 :(得分:6)
您的平台的调用约定指定函数如何返回它想要返回给调用者的值(例如:保存在寄存器中)。由于寄存器存在,调用者代码只是获取它在那里找到的值,可能是垃圾,或者实际的好价值。无论哪种方式,您的程序都会调用未定义的行为,它不再受信任。
解决方案是打开编译器警告。例如,关于GCC或Clang:
g++ -Wall -Wextra -Werror
答案 1 :(得分:3)
根据[stmt.return](强调我的):
在构造函数,析构函数或具有cv
void
返回类型的函数的末尾流动,相当于没有操作数的return
。 否则,离开main
以外的函数末尾会导致未定义的行为。
通常,您可以通过打开并阅读编译器生成的警告来捕获这些错误(例如,使用带有GCC或Clang的-Wall -Wextra
)。