gpt4 book ai didi

clang-分析 : how to avoid "garbage value" warning?

转载 作者:太空狗 更新时间:2023-10-29 17:13:31 25 4
gpt4 key购买 nike

检查时

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
char c[20];
size_t l;

l = fread(c, sizeof c, 1, stdin);
if (l != 1)
return 1;

return c[0] == 42;
}

有了 clang,我得到了

$ clang  --analyze -Xclang -analyzer-checker=alpha x.c
x.c:13:14: warning: The left operand of '==' is a garbage value
return c[0] == 42;
~~~~ ^

$ clang -v
clang version 7.0.1 (Fedora 7.0.1-4.fc29)

此时 c 真的有可能包含垃圾吗?如果不是,我怎样才能避免警告(没有明显的 c 初始化)?

更新

因为这似乎是一个误报,所以我想重点讨论如何避免警告。

fread() 确实是一个标准函数,分析器应该知道它们的语义,例如对于 memset() 已经。但是我对可以使用的更通用的方式感兴趣,例如关于库函数。

我会以类似的方式调用一些特殊函数(我们称它为 assert_defined())

    l = fread(c, sizeof c, 1, stdin);
assert_defined(c, l * sizeof c);

这是

  • 打个盹
  • 但让编译器/分析器认为 c 处的 l * sizeof c 字节已初始化

clang 知道这样的注解吗

inline static void assert_defined(void const *p, size_t cnt) 
__attribute__((__dear_compiler_this_memory_is_not_garbage__(1,2)))
{
}

或者有没有相关的技巧

int i = i;

这会阻止 gcc 发出“未初始化的警告”?

最佳答案

是的,它可能包含垃圾 - 如果 fread() 失败。

为了让分析器理解如果 fread 失败,检查保证 c[0] 不被读取,需要分析器理解 fread 的语义() 函数。对于任何重要代码来说,这都是计算量大的任务,并且需要查看库源代码或对标准库语义进行编码——这是可能的,但只会发现涉及“已知函数”的一小部分问题。

初始化数组将避免这个特定问题:

char c[20] = {0} ;

关于clang-分析 : how to avoid "garbage value" warning?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55049717/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com