以下错误代码:
#include <stdio.h>
#include <string.h>
void isEven (int *isFlag, int num) {
if (num % 2 == 0) {
*isFlag = 1;
} else {
*isFlag = 0;
}
}
int main() {
int num = 4;
int *isFlag = 0;
isEven(isFlag, num);
printf("%d", isFlag);
}
最近在一个问题中发布了这篇文章。问题本身并不重要,重要的是,尽管gcc和clang警告使用isFlag
作为printf()
的参数,但它们两者都没有警告写入地址0或空指针。即使使用了-O3
确保isEven()
函数被内联,并且我还指定了-Wall -Wextra
。
在这种情况下,难道不应该有一个警告吗?
NULL
(即(void *)0
)可能不是0
的确切int
表示形式。 - Govind ParmarisFlag
值的测试。并且假设该函数在另一个编译单元中,因此逻辑不能轻松地进行检查。 - Weather Vane0
是有效的。 - Fiddling Bits