看一下以下C ++代码:
// imagine 10.000 lines if C++ here
bool test() {
// imagine 300 loc here
return "";
}
int main(int argc, char** argv) {
bool whaaaaaat = test();
return 0;
}
编译这些行时,结果为:
BUILD SUCCESSFUL (total time: 208ms)
甚至没有警告!
请确认:
问题: 当程序继续时,是否会对程序状态产生负面影响(内存损坏?)。
此设置非常危险,编译器至少应该发出警告!
答案 0 :(得分:2)
你基本上是对的。
你的字符串文字char const[1]
会衰减到char const*
,和任何指针一样,booleanisation会告诉你它是否为空。这个不是。
我通常倾向于同意这种隐式转换很危险,但这只是因为你的程序行为可能不是你想要的那样。没有“破纪录”。
答案 1 :(得分:1)
""
被C ++编译器视为char[1]
又名char**
""
被视为一个常量 char
的数组。 not 与char*
相同,但在某些情况下,它可以转换为const char*
(const-ness特定于C ++)。
然后转换为
bool
,!= 0
=>总是true
纠正两点。
当程序继续时,是否会对程序状态产生负面影响(内存损坏?)
这绝对没有任何后果:没有内存泄漏,没有悬空指针或其他坏事。
答案 2 :(得分:1)
它被明确定义为boolean conversions(隐式转换之一):
整数,浮点,无范围枚举的prvalue,指针, 和指向成员的类型可以转换为类型的prvalue 布尔。
零值(对于积分,浮点和未作用域) 枚举)和空指针和空指针到成员 价值变得虚假。所有其他值都成为现实。
对于您的代码,""
可能会衰减为非空的指针(即const char*
),因此结果将为true
。对于指针,它只是检查它是否为空并返回bool
true
或false
,它会很好(没有"破碎的记忆" :))。
答案 3 :(得分:1)
没有负面影响,只是糟糕(太难以取消)编码风格。 我在多年的工作项目中看到了这样的代码
assert(somethingIsRight && "Something is wrong!");
答案 4 :(得分:1)
""被C ++编译器视为char [1]又名char *
非常不精确的说,是的。更确切地说,""
是const char[1]
,而const char数组可以衰减到const char*
,它指向第一个(仅在这种情况下)字符。
然后转换为bool
总是!= 0 =>永远是真的
对两者都是肯定的。
问题:当程序继续时,是否会对程序状态产生负面影响(内存损坏?)。
没有破纪录,或任何其他负面影响。行为定义明确。这个功能实际上是一样的:
bool test() {
"";
return true;
}
此设置非常危险
我不同意。它最多毫无意义。
问题是关于一个函数返回总是正确的,没有编译器的任何警告或错误,这只是简洁的例子。
我认为这不是一个警告,而是一个错误。
考虑一个接口,它是对不同类型进程的抽象,在成功时返回true。现在考虑实现该接口,知道您的简单过程永远不会失败,因此总是返回true。编译器是否应该阻止您编写此类实现?它甚至会警告你吗?不在我看来。
您认为gdb可能会受到影响吗?
没有