我有一个socket通信程序。协议规定,任何写入错误都是致命的,因此应该关闭连接。我的I/O代码如下所示:
auto const toWrite = buf.size() * sizeof(buf[0]);
auto nWritten = ::write(fd, buf.data, toWrite);
if (toWrite != nWritten)
{
closeTheSocket();
}
这段代码在布尔测试中给出了warning: comparison between signed and unsigned integer expressions
。
我理解对有符号和无符号进行更多/更少比较的坏处,但这在这里是不可避免的。::write
系统调用的签名为
# ssize_t write(int fd,const void *buf,size_t count);
换句话说,我的toWrite
变量是无符号的,返回的nWritten
是有符号的(-1表示错误)。我不关心;除了完全传输以外的任何事情都会对连接造成致命的影响。另外,我不明白带符号/未带符号的(In)相等测试怎么可能是危险的。
我看过here,here,here和here,但是所有的问题都是关于小于比较,答案都是“不要那样做”。
This question要求将警告静音,但大锤“静默所有已签名/未签名”比较是不可取的。
我应该如何以尽可能少的干扰来使这个警告静默?
发布于 2019-06-04 01:41:49
将错误条件的检测与错误长度的检测分开,并使用显式强制转换
if ( nWritten < 0 ||
static_cast<decltype(toWrite)>(nWritten) != toWrite )
{
// handle problems
}
小编辑:捕获所有负值作为未来验证的错误。
发布于 2019-06-04 02:19:12
如果您可以使用一些模板样板,另一种可能解决方案是编写一个函数,以不同的方式处理每种类型:
#include <type_traits>
template <class A, class B>
constexpr bool are_different(A a, B b)
{
if constexpr (std::is_signed_v<A> and std::is_unsigned_v<B>)
{
if ( a < 0 )
return true;
else
return std::make_unsigned_t<A>(a) != b;
}
else if constexpr (std::is_unsigned_v<A> and std::is_signed_v<B>)
{
if ( b < 0 )
return true;
else
return a != std::make_unsigned_t<B>(b);
}
else
{
return a != b;
}
}
int main()
{
static_assert(are_different(1, 2));
static_assert(!are_different(1ull, 1));
static_assert(are_different(1, 2));
static_assert(are_different(1u, 2));
static_assert(are_different(1, 2u));
static_assert(are_different(-1, -1u));
static_assert(!are_different((long long)-1u, -1u));
}
https://stackoverflow.com/questions/56432029
复制相似问题