【发布时间】:2023-03-20 12:55:02
【问题描述】:
我有以下代码:
int s[4096];
unsigned char o = 0;
int main(void) {
int *n;
return ((char *) (s + o)) == 0 ? *n : 0;
}
当我在该代码上运行 Clang 静态分析器时,它警告我正在取消引用 n,因为 (char *) (s + o) 是一个空指针,它不是(我什至可以打印它并获得一个绝对不是的地址零)。
我错过了什么?
我注意到删除 (char *) 演员表会使警告消失。
【问题讨论】:
-
它会警告你,因为条件可以在技术上评估为真,在这种情况下你取消引用一个未初始化的指针。
-
@tkausl,这是有道理的,但我不知道在什么情况下这可能是真的。无论
o有什么价值,这仍然不是真的。这是整个程序中唯一的代码路径,所以s和o都不能有除程序中的值之外的任何其他值。我还注意到删除(char *)演员会使警告消失。 -
如果o大于4096,则为UB,则可能为真
-
@OznOg,但
o是一个unsigned char,所以它的值只能在0和255之间。 -
好的,:) 我猜你对编译器的期望很高:)
标签: c clang static-analysis clang-static-analyzer