这段代码的作用是从用户输入的以 null 结尾的字符串中提取路径。
根据valgrind的报告,这段代码存在错误:
在stackoverflow上搜索类似的问题时,有些人谈到了添加空终止符,而其他人则提到使用
我到底做错了什么?如何解决?
/* begin createPath */
static inline char* createPath(char * userInput)
{/* This function retuns the path from the userInput */
int pathStringLength = 0;
char *buf = userInput;
while(*(buf++) != ' ')
pathStringLength++;
char *path = malloc(pathStringLength+1);
strncpy(path, userInput, pathStringLength);
// memcpy(path, userInput, pathStringLength);
path[pathStringLength+1] = '\0';
return path;
}
/* end createPath */
根据valgrind的报告,这段代码存在错误:
> ==2919== Conditional jump or move depends on uninitialised value(s)
> ==2919== at 0x400A87: createPath (in /home/aral/learn/myShell/myShell)
> ==2919== by 0x400A4C: parseInput (in /home/aral/learn/myShell/myShell)
> ==2919== by 0x4009C3: main (in /home/aral/learn/myShell/myShell)
> ==2919==
> ==2919== Invalid write of size 1
> ==2919== at 0x400AC3: createPath (in /home/aral/learn/myShell/myShell)
> ==2919== by 0x400A4C: parseInput (in /home/aral/learn/myShell/myShell)
> ==2919== by 0x4009C3: main (in /home/aral/learn/myShell/myShell)
在stackoverflow上搜索类似的问题时,有些人谈到了添加空终止符,而其他人则提到使用
memcpy
代替strcpy
; 我已经添加了一个空终止符,尝试使用memcpy
,但是没有改进,valgrind仍然在抱怨。我到底做错了什么?如何解决?
memcpy
更好,因为它只会复制所请求的字节数。使用strcpy
或strncpy
会在每个复制的字节上包含一个空值检查。既然您已经确定了要复制多少字节,就没有必要在复制过程中再包含另一个空值检查。 - tomlogic