Fortify 中用于函数调用的误报“Null Dereference”错误[关闭]

Posted

技术标签:

【中文标题】Fortify 中用于函数调用的误报“Null Dereference”错误[关闭]【英文标题】:False positive "Null Dereference" error in Fortify for function call [closed] 【发布时间】:2022-01-09 05:48:57 【问题描述】:

我在 C 项目上运行 Fortify SCA 和 Applications 21.1.1,我在以下行中收到“空指针取消引用”错误:

int parameter1 = 1;
char *parameter2;
int foo = 1;

sprintf(parameter2, "%d", foo); 

pFunction(parameter1, parameter2, NULL);

在头文件中,pFunction 被声明为:

typedef int(*Function)(int a, char* b, char* c);

extern Function pFunction;

pFunction 定义位于我无权访问的外部文件中。

我很确定这是 Fortify 中的误报错误。有没有合适的解决方法?

【问题讨论】:

所提供的代码片段没有让我有任何理由断定 Fortify 是错误的。如果您提交 minimal reproducible example,情况可能会改变。 信息不足。请发帖minimal reproducible example。 很抱歉,但我不接受您有足够的时间关注其中一个超链接并阅读和消化链接页面上的材料。去做。如果你不明白那里的解释——而且你现在肯定不明白——那么你可以问一些具体的问题。 可能不相关,但这行memset(b, "*", strlen(b)); 没有意义。如果你想用* 字符填充缓冲区,它应该是'*',而不是"*"。如果b 之前未初始化为有效字符串,strlen 将不起作用。 问题中现在显示的代码不是 MRE,因为它不一致:pFunction 的两个声明声明了不同的、不兼容的类型。它们不相互配合,不清楚哪个应该与第一个片段中的函数调用配合使用。 【参考方案1】:

变量parameter2 声明为

char *parameter2;

要么是未初始化的,并且如果在块范围内声明则具有不确定的值,如果在文件范围内声明则表示空指针。

在这两种情况下,如果函数调用的第一个参数等于 1,那么这个语句

memset(b, '*', strlen(b));

调用未定义的行为。

注意函数指针类型的typedef声明

typedef int(*Function)(int a, char* b, char* c);

不对应函数声明

void pFunction(int a, char *b, char *c)

它们的返回类型不同。

【讨论】:

你似乎漏掉了pFunction 的两个声明的一个更根本的问题:一个声明它是一个函数,另一个声明它是一个指针(指向一个函数)。这些不兼容。 @JohnBollinger 我看到了。但是在这个问题的上下文中,它没有多大意义,因为我确信代码输入有很多错别字,:) 字符串在代码中初始化,函数在我无权访问的外部文件上定义。该函数的唯一引用是头文件。 @LeonardoAraujo 当你需要提供一个没有错别字的相关代码时,至少在指针名称和函数名称不同的地方。

以上是关于Fortify 中用于函数调用的误报“Null Dereference”错误[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

fast-rcnn 对象检测中的误报

如何避免 SQL 查询检查 IS NULL 的误报?

Java Veracode 扫描 - SQL 注入的误报

如何修复线性 SVM 的误报率?

Swift5.4 中可选的误报

测试中的误报和漏报同样的值得反复修正