このコードは、userInput の null で終わる文字列からパスを抽出することになっています。
/* 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
とにかくnullを追加していますが、使用しようとしましmemcpy
たが、何も改善されず、valgrindは不平を言い続けました。
ここで正確に何が間違っていますか?どうすれば修正できますか?