Каковы критерии для поиска MISSING_MOVE_ASSIGNMENT?

Мы начали сканирование кроссплатформенной кодовой базы с помощью Coverity в Windows. На винде мы подобрали пять Missing move assignment operator (MISSING_MOVE_ASSIGNMENT) Выводы. Выводы отсутствуют в Unix, Linux или OS X.

Мы библиотека C ++, совместимая с C ++ 03 — C ++ 17. На сегодняшний день мы оставили одни только задания на переезд, потому что Джонатан Уэйкли посоветовал нам сделать это (из Как определить, когда ход C ++ 11 синтезируется? в списке рассылки GCC):

Так что вам не нужно заботиться [о предоставлении переезда]. Если перемещение может быть небезопасным, этого не произойдет. Если перемещение будет безопасным, тогда это может произойти, но в этих случаях вам, вероятно, лучше позволить компилятору генерировать правильный ход, а не мешать.

Я хотел бы знать, какие критерии использует Coverity для нахождения. Как Coverity определяет, есть ли у нас возможность улучшить сгенерированный компилятором?

(Я не оспариваю этот вывод. Я пытаюсь лучше понять его, понять, почему Служба сканирования считает, что мы можем сделать лучше, и понять, в чем заключается возможность. И «работа получше» может применяться только к Windows).


Вот один из выводов. Другие доступны на сайте сканирования Coverity.

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

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …