Coverity问题:显式Null解除引用

时间:2015-02-16 05:40:54

标签: c

我有以下代码部分,它提供了明确的null dereferenced。

uint64_t *var1 = NULL;

char *var2 = NULL;


//Alias transfer

var1 = (uint64_t *) var2;

//Dereferencing Null Pointer

*var1 = 0;

如果我再次将* var1重新分配给NULL,可以解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

  

如果我再次将* var1重新分配为NULL

,是否可以修复此问题

在向其写入内容之前,应使指针指向某个有效的内存位置。在你的情况下,你没有这样做,所以你有一个分段错误(或崩溃)。 因此,在向内存位置写入任何内容之前,必须将内存分配给指针。

uint64_t *var1 = malloc(sizeof(uint64_t));

答案 1 :(得分:1)

你可能不明白指针声明中的*和指针算术表达式中的*意味着相反的事情。

uint64_t *var1 = NULL;这声明了uint64_t指针(类型uint64_t*

*var1 = 0;取消引用指针,即访问存储在其地址内存。它给指针一个新值。它修改了指向的数据。在这种情况下,没有指向数据。 NULL无法指向数据。因此错误。

如果您想更改指针的值,只需执行

var1 = 0;

如果我误解了你问题的意图,我很抱歉。在这种情况下,如果你想改变指向数据的值,那么首先让指针指向一些可写内存!

uint64_t var = 100;
/* ... */
var1 = &var; /* Get a pointer to the memory that is the variable var */

uint64_t *var1 = malloc(sizeof(uint64_t)); /* Allocate memory for one uint64_t on the heap and set var1 to point at it */

答案 2 :(得分:1)

uint64_t *var1 = NULL;
char *var2 = NULL;

您已经定义了分别为uint64_t和char类型的指针var1和var2,它们指向NULL。 并在此步骤

var1 = (uint64_t *) var2;

你试图使你的var1指向与var2相同的位置并将其从上面的两个部分转换为uint64_t.So。var1和var2指向NULL指针,即简单来说就没有了。

*var1 = 0;

在此行中,您尝试将值0分配给var1指向的位置,即NUll位置,即无效地址,并且取消引用无效/空地址将导致崩溃。

在分配值之前,您需要分配一个内存并使指针指向该内存位置,然后分配一个值。

var1 = malloc(sizeof(uint64_t));
*var1 = 0;

这应该可以使您的代码正常工作。