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';

是错的。那是最后一个字节。你的意思是:

path[pathStringLength] = '\0';

如果输入字符串没有空格,您也会遇到缓冲区溢出。检查循环中的空终止符,并在遇到空终止符时终止。我会这样写:

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

对于它的价值,我认为memcpy这里可能是一个更好的选择。一旦你确定了需要复制多少文本,你也可以直接复制它。不需要寻找空终止符的字符串函数。一旦你修复了代码,你就已经检查了它们。

你应该检查malloc.

于 2012-12-16T16:35:29.390 回答
2

您写入path[pathStringLength+1]而不是path[pathStringLength]- 索引是基于 0 的。

于 2012-12-16T16:37:20.863 回答
0

strncpy使用 as 不是更安全的方法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 回答