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

#c #coverity #move-assignment-operator

#c #скрытность #оператор перемещения-присваивания

Вопрос:

Мы начали сканирование кросс-платформенной базы кода с помощью Coverity в Windows. В 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 amp;x, const PolynomialMod2 amp;y)
 28                : identity(false), x(x), y(y) {}
 30
 31        bool operator==(const EC2NPoint amp;t) const
 31                {return (identity amp;amp; t.identity) || (!identity amp;amp; !t.identity amp;amp; x==t.x amp;amp; y==t.y);}
 32        bool operator< (const EC2NPoint amp;t) const
 33                {return identity ? !t.identity : (!t.identity amp;amp; (x<t.x || (x==t.x amp;amp; y<t.y)));}
 34
 35        bool identity;
 36        PolynomialMod2 x, y;
 37 };
  

Комментарии:

1. Было бы улучшить ваш вопрос, если бы опубликовать MCVE, показывающий случай, когда Coverity дает эту рекомендацию

2. @M.M — Спасибо. MCVE будет сложным. У нас есть 1400 классов, но только пять получают результаты. На данный момент я не знаю, с чего начать поиск при создании MCVE. Это одна из причин, по которой я пытаюсь определить критерии для поиска.