4

このコードは、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は不平を言い続けました。

ここで正確に何が間違っていますか?どうすれば修正できますか?

4

3 に答える 3

6
path[pathStringLength+1] = '\0';

間違っている。それは最後から1バイトです。もしかして:

path[pathStringLength] = '\0';

入力文字列にスペースが含まれていない場合も、バッファ オーバーランが発生します。ループ内のヌル ターミネータを確認し、ヌル ターミネータが見つかったら終了します。私は次のように書きます:

while (*buf != ' ' && *buf != '\0')
{
    pathStringLength++;
    buff++;
}

memcpyそれだけの価値があるので、ここではおそらくより良い選択肢だと思います。コピーする必要があるテキストの量を正確に計算したら、それを単にブリットすることもできます。null ターミネータを探す文字列関数は必要ありません。コードを修正したら、すでにそれらをチェックしています。

そして、 の戻り値を確認する必要がありmallocます。

于 2012-12-16T16:35:29.390 に答える
2

You write to path[pathStringLength+1] instead of path[pathStringLength] - the index are 0-based.

于 2012-12-16T16:37:20.863 に答える
0

strncpyとして使用するより安全な方法ではありませんstrcpy男 strncpy言う,

The strncpy() function is similar, except that at most n bytes of src are copied. Warning: If there is no null byte among the first n bytes of src, the string placed in dest will not be null-terminated.

したがって、これを練習の下で終了しないように保護することNULLは役立ちます。

strncpy(des, src, len)
des[len -1] = '\0';
于 2012-12-16T16:39:17.013 に答える