#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. Это одна из причин, по которой я пытаюсь определить критерии для поиска.