Dad*_*m42 3 c unsigned compiler-warnings
这是我正在尝试编译的函数:
static ssize_t output(t_out_buffer *buf, char const *src, size_t size)
{
size_t osize;
osize = size;
while ((size > 0)
&& (size -= write(buf->fd, src, size) < osize))
{
src += osize - size;
buf->count += osize - size;
osize = size;
}
if (osize < size)
return (T_OUT_BUFFER_ERROR);
else
return (buf->count);
}
Run Code Online (Sandbox Code Playgroud)
和 gcc 的抱怨:
t_out_buffer.c:11:42: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
&& (size -= write(buf->fd, src, size) < osize))
^
Run Code Online (Sandbox Code Playgroud)
我认为 as sizeis unsigned,size -= whateverintiwant也将是 unsigned as osizeis unsigned。我现在假设我错了,但我真的不明白为什么。此外,你能给我一些提示让我保持沉默吗?
这个表达并没有像你想象的那样:
(size -= write(buf->fd, src, size) < osize)
Run Code Online (Sandbox Code Playgroud)
小于运算符的<优先级高于复合赋值运算符-=。所以上面的解析为:
(size -= (write(buf->fd, src, size) < osize))
Run Code Online (Sandbox Code Playgroud)
所以这比较了writewhich is of typessize_t和osizewhich is of type 的输出size_t。这是有符号/无符号比较发生的地方。然后从 中减去此比较的结果size,因此它一次只会减少 1。
在作业周围添加括号:
((size -= write(buf->fd, src, size)) < osize)
Run Code Online (Sandbox Code Playgroud)
当您现在将 asize_t与 a进行比较时,警告将消失size_t。
然而,还有另一个问题。如果write返回 -1,则您将减去该值,即如果失败则加 1。
您应该重构,以便在循环内进行读取,并且仅在成功时才添加结果。
while (size > 0) {
{
ssize_t rval = write(buf->fd, src, size);
if (rval == -1) {
return T_OUT_BUFFER_ERROR;
}
size -= rval;
src += rval;
buf->count += rval;
}
Run Code Online (Sandbox Code Playgroud)