我不确定我是否完全理解未定义行为可能危及程序的程度.
假设我有这段代码:
#include <stdio.h>
int main()
{
int v = 0;
scanf("%d", &v);
if (v != 0)
{
int *p;
*p = v; // Oops
}
return v;
}
Run Code Online (Sandbox Code Playgroud)
这个程序的行为是否仅针对v非零的情况而定义,或者即使v为零也未定义?
我继承了一个相当大的代码库,不知怎的,有人编写了几个这样的条件:
enum
{
FOO_TYPE_A,
FOO_TYPE_B,
FOO_TYPE_C,
FOO_TYPE_D
};
void bar(int fooType)
{
if (fooType == FOO_TYPE_A || FOO_TYPE_B) // <-- This will always be true, since FOO_TYPE_B is nonzero!
{
// Do something intended for only type A or B
}
// Do things general to A,B,C,D
}
Run Code Online (Sandbox Code Playgroud)
条件检查应该明确是:
if (fooType == FOO_TYPE_A || fooType == FOO_TYPE_B)
Run Code Online (Sandbox Code Playgroud)
在gcc中是否有警告我可以打开以找到它们,类似于MSDN的C4127?
具体来说,我使用的是Android NDK r9d.
如果没有,为什么不呢?对于无意识的赋值,无符号> 0以及上述愚蠢似乎都是有用的.
编辑:使代码更详细,以说明问题.