gpt4 book ai didi

c - 为什么编译器报告 'may be used uninitialised in this function' ?

转载 作者:太空宇宙 更新时间:2023-11-04 06:25:05 25 4
gpt4 key购买 nike

我正在写一个 linux 模块,这里是代码片段。它提示变量的统一化使用,但我想我已经检查过了在使用它之前有足够的检查。我认为这可能是相关的ERR_PTR 和 PTR_ERR 宏,但我不知道为什么。有人可以帮忙解释一下吗?提前谢谢你。

static inline void * __must_check ERR_PTR(long error)
{
return (void *) error;
}

static inline long __must_check PTR_ERR(__force const void *ptr)
{
return (long) ptr;
}

#define MAX_ERRNO 4095
#define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO)


static inline bool __must_check IS_ERR(__force const void *ptr)
{
return IS_ERR_VALUE((unsigned long)ptr);
}

void* test_alloc_value(void)
{
char* p = kmalloc(100,GFP_KERNEL);
if(!p)
return ERR_PTR(-ENOMEM);
memset(p,100,0);
return p;
}

int test_value_get(int *value)
{
int err = 0;
char *p;

p = test_alloc_value();

if (IS_ERR(p))
return PTR_ERR(p);

*value = *p;
return err;
}

void my_test(void)
{
int test_value;
int err = test_value_get(&test_value);
if(err)
return err;
if(test_value) //warnings,see below
return 0;

}

错误信息是:

warning: ‘test_value’ may be used uninitialized in this function [-Wmaybe-uninitialized]
if(test_value)
^

更新:2015 年 1 月 30 日:

我认为根本原因是 longint 的转换。 PTR_ERR() 函数会将指针转换为 long,但在上面的代码,test_value_get() 会将一个long 转换成int,并返回它到 my_test() 。因为我使用的是 64 位机器,long 可能被截断到低32位,比如0xfffffffe00000000,返回值将被削减为 0,然后 if(err) 将不满足,这导致 test_value 以错误的方式使用。(虽然 errno 不会大于 4095,但编译器似乎没有意识到它,最接近的溢出值将是 0xfffffffe00000000)有什么意见吗?

最佳答案

检查下面的执行链

  1. my_test() 中,调用了 test_value_get()
  2. test_alloc_value(); 失败,if (IS_ERR(p)) 为 TRUE。
  3. *value = *p; 没有执行。
  4. my_test() 中,if(test_value) 展示了 read-before-write 场景。

这意味着,无论可能性如何,仍然有一种方法,test_value 可以在未初始化的情况下使用。那么,你的编译器不对吗?

为了避免这种情况,在错误情况下 [if (IS_ERR(p)) is TRUE.] 同时,将 *value 初始化为某个默认值,例如 0

if (IS_ERR(p))
{
if (value) //NULL pointer safe
*value = 0; // set *value in error case also
return PTR_ERR(p);
}

关于c - 为什么编译器报告 'may be used uninitialised in this function' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28213952/

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