cppcheck null指针取消引用,但它实际上可以变为null
我有一个函数,它可以返回指向结构或NULL的指针(示例解释从函数get_my_struct_返回的可能性): CppCheck告诉我if语句是冗余的,或者可能存在空指针解引用 问题:cppcheck null指针取消引用,但它实际上可以变为null,c,null-pointer,cppcheck,C,Null Pointer,Cppcheck,我有一个函数,它可以返回指向结构或NULL的指针(示例解释从函数get_my_struct_返回的可能性): CppCheck告诉我if语句是冗余的,或者可能存在空指针解引用 问题: 为什么CppCheck会给我这些信息 如何正确检查函数的返回值,使我不会收到此消息 编辑: 忘了提到my_函数是两个get函数的行为示例 从_A获取_my_struct_和从_B获取_my_struct_具有不同的内部逻辑,但输出数据类型与在my_函数中显示的相同。我有很多从我调用的函数中获取我的结构并检查返回值。
写入
q==null
或!q
从cppcheck返回相同的消息,我认为这是正常的。您的函数应该返回struct my_struct*
当I.value
小于5时,您返回了什么<代码>结构我的结构
另外,如果您像这样声明函数,您应该传递一个您没有传递的参数
struct my_struct *my_function(struct my_struct* i) {
if (i->value < 5) return i;
else return NULL;
}
如果你所展示的是你所做的,那么下面总结了一些问题/建议
- p从方法返回错误的类型
- p如果
与原始代码中的get_my_struct_from_A
相同,则您没有传递您应该传递的参数my_function
- 通过使用基于传递的结构返回true或false的函数,可以更轻松地完成此类小检查
bool my_函数(struct my_struct ms)代码>
struct my\u struct*my\u函数(my\u struct i){
如果(i.value<5)返回i;
这不是有效的C(或C++)代码。您的编译器已损坏或配置不正确
返回一个整数,但函数返回一个指针。C标准是明确的,C116.8.6.4:
如果表达式具有
类型与它出现的函数的返回类型不同,该值为
通过赋值转换为具有函数返回类型的对象
这意味着代码等价于struct my_struct*tmp=i;
。这可以被视为C语言所称的“简单赋值”。简单赋值规则C116.5.16.1规定,如果赋值的左操作数是指针,则右操作数不能是整数
因此,编译器必须生成此代码的诊断消息。如果没有,则表明它有问题。my_函数中存在问题。返回类型为
struct my_struct*
(指针),但返回的是int
(i
)。在使用CPP之前,请检查您的代码商店可以在没有警告的情况下编译。如果您没有收到警告,那么使用-Wall
编译是my\u函数
还是get\u my\u struct\u from\u a
?这里的主要问题是,在静态分析之前,该代码如何在第一时间干净地编译。@Lundin.:是的,我猜OP没有发布act code或OP在此处发布时对其进行了更改。否则会引发错误。这就是为什么我明确提到了使OP编写可编译代码的要点。@coderredoc我没有发布确切的代码,我不需要代码响应我需要解释我为什么会遇到此问题。为问题添加了更多解释。
struct my_struct *q;
q = get_my_struct_from_A();
if (q == NULL) {
// display an error message and exit
}
q = get_my_struct_from_B();
if (q == NULL) {
// display an error message and exit
}
struct my_struct *my_function(struct my_struct* i) {
if (i->value < 5) return i;
else return NULL;
}
struct my_struct a;
...
struct my_struct *q = my_function(&a);
if( !q ){
// it returned NULL
}
struct my_struct *my_function(my_struct i) {
if (i.value < 5) return i;