为什么getxattr会填充额外的元素?

时间:2019-02-06 17:04:18

标签: c++ c

我有下面的代码,我无法弄清楚为什么在缓冲区末尾出现一些奇怪的符号。

char value[100];
    if(getxattr(filename, "user.permission", value, sizeof(value))!=-1){
        //strncpy(val, value, strlen(value));
        printf("value is %s\n", value);
    }

对于长度大于4的元素,它可以正确打印,但是如果值少于四个元素,它将在末尾附加一些随机字符。

当我打印值的大小时,对于1-4之间的任何值长度,它将显示6。 拜托,请有人解释为什么会这样。

2 个答案:

答案 0 :(得分:4)

您必须遵守属性的 real 大小。

调用getxattr()返回值的大小。因此,以下内容将是正确的:

ssize_t sz = getxattr(filename, "user.permission", value, sizeof(value)-1);
if (sz != -1) {
    value[sz] = '\0';
    printf("value is %s\n", value);
}

看起来,好像您的值是一个字符串,但它不是以null终止的,因此您必须自己进行操作。因此,getxattr()不会追加随机字节,char数组只是未初始化,并且也没有完全覆盖,因此一些未初始化的字节保留在那里。

答案 1 :(得分:3)

来自documentation(强调我的):

  

getxattr()检索标识的扩展属性的值          名称,并与文件系统中的给定路径关联。的          属性值放置在值所指向的缓冲区中;尺寸          指定该缓冲区的大小。 该呼叫的返回值为          值中放置的字节数。

我没有发现有关getxattr()放置\0的任何信息,所以我希望您必须使用函数返回的大小来了解字符串的大小。