我们开始在 Windows 上使用 Coverity 扫描跨平台代码库。在 Windows 上,我们收集了五个Missing move assignment operator (MISSING_MOVE_ASSIGNMENT)
发现。这些发现在 Unix、Linux 或 OS X 上不存在。
我们是一个与 C++03 - C++17 兼容的 C++ 库。迄今为止,由于 Jonathan Wakely 建议我们这样做(来自如何确定何时合成 C++11 移动?在 GCC 邮件列表上),我们已经单独留下了移动分配:
所以你不应该关心[关于提供移动]。如果搬家可能不安全,那就不会发生。如果移动是安全的,那么它可能会发生,但在这些情况下,您最好让编译器生成正确的移动而不是干涉。
我想知道 Coverity 使用什么标准进行调查。Coverity 如何确定我们有机会改进编译器生成的?
(我不是在质疑这一发现。我是在努力更好地理解它,理解为什么扫描服务认为我们可以做得更好,并理解机会在哪里。而“更好的工作”可能只适用于 Windows)。
这是其中一项发现。其他可在 Coverity Scan 站点上找到。
CID undefined (#1 of 1): Missing move assignment operator (MISSING_MOVE_ASSIGNMENT)
missing_move_assignment: Class CryptoPP::EC2NPoint may benefit from adding a move assignment
operator. See other events which show the copy assignment operator being applied to rvalue(s),
where a move assignment may be faster.
22 struct CRYPTOPP_DLL EC2NPoint
23 {
24 virtual ~EC2NPoint() {}
25
26 EC2NPoint() : identity(true) {}
27 EC2NPoint(const PolynomialMod2 &x, const PolynomialMod2 &y)
28 : identity(false), x(x), y(y) {}
30
31 bool operator==(const EC2NPoint &t) const
31 {return (identity && t.identity) || (!identity && !t.identity && x==t.x && y==t.y);}
32 bool operator< (const EC2NPoint &t) const
33 {return identity ? !t.identity : (!t.identity && (x<t.x || (x==t.x && y<t.y)));}
34
35 bool identity;
36 PolynomialMod2 x, y;
37 };