C代码似乎可以工作,但valgrind说数组没有初始化
我目前正在做一个项目,在这个项目中我制作了自己的标记器。我的代码编译良好,但valgrind给出了错误:C代码似乎可以工作,但valgrind说数组没有初始化,c,token,valgrind,C,Token,Valgrind,我目前正在做一个项目,在这个项目中我制作了自己的标记器。我的代码编译良好,但valgrind给出了错误: ==2572== Conditional jump or move depends on uninitialised value(s) ==2572== at 0x4C2B308: strlen (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) ==2572== by 0x400FCB: strdup (Lex1
==2572== Conditional jump or move depends on uninitialised value(s)
==2572== at 0x4C2B308: strlen (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==2572== by 0x400FCB: strdup (Lex1.c:173)
==2572== by 0x400EBA: lex (Lex1.c:140)
==2572== by 0x400A3B: main (mainLex.c:34)
==2572==
==2572== Conditional jump or move depends on uninitialised value(s)
==2572== at 0x4C2B35B: strcpy (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==2572== by 0x400FFC: strdup (Lex1.c:177)
==2572== by 0x400EBA: lex (Lex1.c:140)
lex中的第140行是以下代码中的“temp->text”行:
token *head, *temp, *right, *temp1;
char *line1 = strdup(line);
char *curr = separatebetter(line1);
temp = (token *)malloc(sizeof(token));
temp->text=strdup(curr);
奇怪的是,我可以打印curr的值,但是根据我的假设,valgrind说curr在任何时候都没有初始化,尽管我清楚地初始化了它
valgrind在strdup中引用的两行是:
int n = strlen(str) + 1;
strcpy(dup, str);
分离器的相关代码为:
char *separatebetter (char *arr)
{
int status=0;
static char* perm;
if (arr!=NULL)
{
perm=arr;
}
if((perm[0]=='\0')||(perm[0]=='\n'))
{
return NULL;
}
if (strcspn(perm, "<|>&")==0)
{
status=1;
}
if (strcspn(perm, ";()")==0)
{
status=2;
}
char *toke = perm;
char *temp;
//Status is set to 1 or 2
if (status==1)
{
printf("here\n");
temp=toke;
char *temp1=malloc(strlen(temp)*sizeof(char));
temp1=temp;
char *final = malloc(3*sizeof(char));
temp1++;
if(temp[0]==temp1[0])
{
final[0]=temp[0];
final[1]=temp[0];
*temp='\0';
temp++;
*temp='\0';
perm=temp+1;
return final;
}
else
{
final[0]=temp[0];
final[1]='\0';
*temp='\0';
perm=temp+1;
return final;
}
}
else if (status==2)
{
temp=toke;
char *final = malloc(2*sizeof(char));
final[0]=temp[0];
final[1]='\0';
*temp='\0';
perm=temp+1;
return final;
}
perm[0]='\0';
return toke;
}
我认为curr的初始化是问题所在,这是错误的吗?这段代码显然是错误的:
char *curr = malloc(100*sizeof(char));
curr = separatebetter(line1);
分配内存,然后用separatebetter()
中的值覆盖指向它的唯一指针。这是一个即时泄漏。也许您打算使用strcpy()
我需要看看separatebetter()
做了什么-但这不是您正在运行的代码,因为它不会编译:
if (strcspn(perm, ";()")==0)
{
status=2;
}
char *toke = perm;
char *temp;
//Status is set to 1 or 2
else if (status==1)
else
无法在那里编译;前面的语句是一个变量声明。这使得我们很难知道到底出了什么问题。给不可编译的代码声称正在运行是非常烦人的。这使得人们很难知道什么是可信的
但是,您的函数可以在此代码之前返回NULL
,strdup(NULL)
的行为是未定义的,strcpy()的行为也是未定义的,当被告知从NULL
指针复制(或复制到NULL
指针时。在确保separatebetter()
的返回值不为null之前,您无法使用它
以下代码还会重复内存泄漏问题:
{
printf("here\n");
temp=toke;
char *temp1=malloc(strlen(temp)*sizeof(char));
temp1=temp;
同样,您可能打算使用strcpy()
:
在
separatebetter()
的顶部,您有:
static char* perm;
if (arr!=NULL)
{
perm=arr;
}
if((perm[0]=='\0')||(perm[0]=='\n'))
{
return NULL;
}
if (strcspn(perm, "<|>&")==0)
{
status=1;
}
if (strcspn(perm, ";()")==0)
{
status=2;
}
char *toke = perm;
静态字符*perm;
如果(arr!=NULL)
{
perm=arr;
}
如果((perm[0]='\0')| |(perm[0]='\n'))
{
返回NULL;
}
如果(strcspn(perm,“&”)==0)
{
状态=1;
}
if(strcspn(perm,;()”==0)
{
状态=2;
}
char*toke=perm;
静态字符*perm
令人费解。将arr
分配给它有时令人费解。使用char*toke=perm代码>确实令人费解。先前的代码并不总是设置perm
,因此有时它会从先前对分配给它的函数的调用中得到一个指针。该指针可能有效,也可能无效。我认为您需要重新思考整个separatebetter()
相信你的工具!(尤其是相信瓦尔格林)这是错误的:char*curr=malloc(100*sizeof(char));curr=分隔符(第1行)代码>。您立即泄漏分配的内存,并将curr
设置为指向其他位置。在temp1
中也会发生同样的情况。显示实际测试的代码。为了获得更好的帮助,发布了一个MCVE。我编辑了上面的curr初始化,然后尝试打印f curr,valgrind告诉我curr没有初始化。我认为curr中的初始化是问题所在,这是不是错了?您需要修复代码,以便显示一个可编译的separatebetter()
函数。很抱歉,为了简洁起见,我省略了很多separatebetter代码(例如,在else-if之前有一个if)。我感谢你的帮助。
{
printf("here\n");
temp=toke;
char *temp1=malloc(strlen(temp)*sizeof(char));
temp1=temp;
strcpy(temp1, temp);
static char* perm;
if (arr!=NULL)
{
perm=arr;
}
if((perm[0]=='\0')||(perm[0]=='\n'))
{
return NULL;
}
if (strcspn(perm, "<|>&")==0)
{
status=1;
}
if (strcspn(perm, ";()")==0)
{
status=2;
}
char *toke = perm;