Använd inte funktionsnamn med "tom"

Använd inte funktionsnamn med "tom"

Fragmentet är hämtat från WinMerge projekt. Koden innehåller ett fel som analysatorn diagnostiserar på följande sätt:V530 Returvärdet för funktionen 'empty' måste användas.

void CDirView::GetItemFileNames(
  int sel, String& strLeft, String& strRight) const
{
  UINT_PTR diffpos = GetItemKey(sel);
  if (diffpos == (UINT_PTR)SPECIAL_ITEM_POS)
  {
    strLeft.empty();
    strRight.empty();
  }
  ....
}

Förklaring

En programmerare ville rensa strLeft och strRight strängar. De har String typ, som inte är något annat än std::wstring .

För detta ändamål kallade han empty() fungera. Och detta är inte korrekt. empty() funktion ändrar inte objektet, men returnerar informationen om strängen är tom eller inte.

Rätt kod

För att rätta till detta fel bör du ersätta empty() funktion med clear() eller radera () . WinMerge-utvecklare föredrog erase() och nu ser koden ut så här:

if (diffpos == (UINT_PTR)SPECIAL_ITEM_POS)
{
  strLeft.erase();
  strRight.erase();
}

Rekommendation

I det här fallet är namnet "empty()" verkligen olämpligt. Saken är den att i olika bibliotek kan den här funktionen betyda två olika åtgärder.

I vissa bibliotek används emply() funktionen rensar objektet. I andra returnerar den informationen om objektet är tomt eller inte.

Vi skulle säga att ordet "tom" är halt i allmänhet, eftersom alla förstår det olika. Vissa tror att det är en "åtgärd", andra att det är "informationsförfrågan". Det är anledningen till röran vi kan se.

Det finns bara en väg ut. Använd inte "tom" i klassnamnen.

  • Ge funktionen för rengöring namnet "radera" eller "rensa". Vi skulle hellre använda "radera", eftersom "rensa" kan vara ganska tvetydigt.
  • Välj ett annat namn för funktionen som får information, till exempel "isEmpty".

Om du av någon anledning tycker att det inte är en stor sak, ta en titt här. Det är ett ganska utbrett felmönster. Naturligtvis är det lite sent att ändra sådana klasser som std::string , men låt oss åtminstone försöka att inte sprida ondskan längre.

Skrivet av Andrey Karpov. Det här felet hittades med PVS-Studio statiskt analysverktyg.