- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
void f1(char *s)
{
s[20] = 0;
}
void f2()
{
char a[10];
if (x + y == 2) {
f1(a);
}
}
Cppcheck 将报告此消息:数组 'a[10]' 索引 20 越界
Cppcheck 如何获得 f2 中的“a”和 f1 中的“s”之间的联系?
我构建了AST树,但是它只提供了每个符号的信息,并没有给我关于符号逻辑关系的信息。计算机怎么知道 f2 中的“a”和 f1 中的“s”是同一个东西?据我所知,我们必须考虑很多情况,例如:
void f1(char *s)
{
char str_arry[30];
s= str_arry;
s[20] = 0;
}
在这种情况下,“s”和“a”不是一回事。
最佳答案
我不知道 Cppcheck 究竟是如何工作的,但我会告诉您如何解决这个问题。相关函数的分析主要有两种方法。
在第一种情况下,当分析器遇到函数调用时,它开始分析其主体,考虑通过函数传输的事实参数的值。只有知道哪些值被传输到函数时,这种情况才会自然发生。这指的是:一个精确值、一个范围、一组值、空/非空指针等。传输信息的复杂性取决于分析仪的复杂程度。例如,它可以开始分析函数体,知道两个传输的指针指向同一个数组。
这是一种非常准确的方法。但是有一个严重的问题。基于这个概念的分析器非常慢。他们必须一遍又一遍地分析具有不同输入数据集的函数体。这些函数依次调用其他函数,依此类推。并且在某些时候必须停止“内部”分析,这在实践中使这种方法不像理论上看起来那么准确和出色。
还有第二种方法。它基于自动功能注释。问题是,在分析函数时,会关注有关如何使用其参数以及它们不能采用哪些值的信息。让我们考虑一下我在名为“Technologies used in the PVS-Studio code analyzer for finding bugs and potential vulnerabilities”的文章中给出的简单示例'.
int Div(int X)
{
return 10 / X;
}
void Foo()
{
for (int i = 0; i < 5; ++i)
Div(i);
}
分析器识别出 X
变量在 Div
函数中用作分隔符。以此为基础,自动创建了一个特殊的Div
函数注解。然后它考虑到 [0..4] 值范围作为 X
参数传输到函数这一事实。分析器得出结论,应该出现被零除。
这种方法更粗糙,不如第一种方法准确。但它速度非常快,可以在不影响生产力的情况下在大量功能之间建立强关联。
在实践中可能要复杂得多。例如,PVS-Studio 分析器使用第二种方法作为主要方法,但并非总是如此。有时在处理模板函数时,我们会再次分析它们(第一种方法)。换句话说,我们使用组合方法来保持分析深度和速度之间的平衡。
关于c - 如何用AST树或其他工具做静态代码逻辑分析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57067538/
我是一名优秀的程序员,十分优秀!