c-条件跳转或移动取决于strcpy中未初始化的值



Valgrind在以下代码中检测到strcpy的问题:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main () {
char **array;
int mallocedLen = 15;
int arrLen = 10;
char tempArr[20][20] = {"abc", "123", "def", "456", "ghi", "789"};
int ii;

array = (char**)malloc(sizeof(char*) * arrLen);
for(ii = 0; ii < arrLen; ii++){
array[ii] = (char*)malloc(sizeof(char) * (strlen(tempArr[ii]) + 1));
strcpy(tempArr[ii], array[ii]);
array[ii][strlen(tempArr[ii])] = '';
mallocedLen++;
}

return 0;
}
==4360== Conditional jump or move depends on uninitialised value(s)
==4360== at 0x483F0A2: strcpy (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)

代码似乎编译得很好,所以我认为这不是mallocing的问题。

此处:

array[ii] = (char*)malloc(sizeof(char) * (strlen(tempArr[ii]) + 1));
strcpy(tempArr[ii], array[ii]);

您将空间分配给array[ii],然后当它还不包含有效字符串时,立即将其作为源字符串传递给strcpy()

似乎您打算将tempArr[ii]作为来源:

strcpy( array[ii], tempArr[ii] ) ;

并且nul终止是不必要的——strcpy()已经这样做了。

Conditional jump or move depends on uninitialised value(s)

意味着它所说的。例如,strcpy()可能具有:

while( *source != 0 )
{
...
}

但是*source还没有初始化,所以循环可能迭代,也可能不迭代。

还要注意,如果您将tempArr声明为:

const char* tempArr[] = {"abc", "123", "def", "456", "ghi", "789"}; 

编译器会发现你的错误。我假设tempArr是不可变的?在这种情况下,请声明为。最好在构建时捕获语义错误,而不是依赖运行时检测工具。在这种情况下,它的内存效率也更高。

另一个问题是:

for(ii = 0; ii < arrLen; ii++){

其中arrlen是10,但是CCD_。最好使用一个重要的值,如NULL或空字符串。或者,如果您使用上面的const char* tempArr[]声明,那么:

const char* tempArr[] = {"abc", "123", "def", "456", "ghi", "789"}; 
const int arrLen = sizeof(tempArr) / sizeof(*tempArr) ;

它是strcpy(destination, source)。另外,strcpy()0-终止复制。

所以更换

strcpy(tempArr[ii], array[ii]);
array[ii][strlen(tempArr[ii])] = '';

通过

strcpy(array[ii], tempArr[ii]);

相关内容

  • 没有找到相关文章

最新更新