Chyták pro C++ programátora

ondra.novacisko.cz

Chyták pro C++ programátora
« kdy: 30. 10. 2010, 22:41:04 »
Schválně, zda přijdete na to, co je na tomhle kódu špatně a proč si dotyčný programátor zaslouží vytahat za uši.

Kód: [Vybrat]
if (&(builder.getUnMarshaledData()) == 0)
        throw  Fault_t(builder.getUnMarshaledErrorNumber(),
                       builder.getUnMarshaledErrorMessage());


Všechny informace tam jsou, netřeba se ptát na obsah jednotlivých funkcí.  ;D


JS

Re: Chyták pro C++ programátora
« Odpověď #1 kdy: 30. 10. 2010, 22:52:37 »
C++ moc neznam, ale hadam, ze to bude memory leak po vytvoreni te vyjimky? Nejspis zlozvyk z Javy.

ondra.novacisko.cz

Re: Chyták pro C++ programátora
« Odpověď #2 kdy: 30. 10. 2010, 23:11:38 »
Dáme prostor ještě dalším čtenářům. Pokud někdo víte a nechcete to prozradit, tak mi aspoň napište, co byste s takovým kolegou, nebo podřízeným udělali a jak moc velký problém to podle vás je

hs

Re: Chyták pro C++ programátora
« Odpověď #3 kdy: 31. 10. 2010, 00:00:32 »
Ukazatel na vysledek funkce? Programator nechape vnitrni procesy C/C++, obrovsky problem/dopad v komercnim prostredi.

JS

Re: Chyták pro C++ programátora
« Odpověď #4 kdy: 31. 10. 2010, 02:41:17 »
hs ma pravdu. Taky mi to bylo divne, ta adresa. To co jsem rikal by platilo jen kdyz by tam bylo new, takhle se to zrejme alokuje na stacku.


anonym

Re: Chyták pro C++ programátora
« Odpověď #5 kdy: 31. 10. 2010, 03:45:45 »
Kdyby getUnMarshaledData() bylo makro, nemuselo by se jednat o adresu na lvalue  :D

Za prasárnu považuji "== 0"; mělo by být "== NULL".

nou

Re: Chyták pro C++ programátora
« Odpověď #6 kdy: 31. 10. 2010, 08:35:34 »
NULL je C prasarna. v C++ by sa malo pisat 0.

Jan

Re: Chyták pro C++ programátora
« Odpověď #7 kdy: 31. 10. 2010, 10:30:12 »
1) když chce programátor používat exception.. proč tam píše podmínku... zvlášť když...
2) ..ta metoda zřejmě vrací referenci, takže z ní dělat ošklivý pointer je nesmysl..
3) tu exception by měla vyhodit už ta metoda

Logik

  • *****
  • 1 022
    • Zobrazit profil
    • E-mail
Re: Chyták pro C++ programátora
« Odpověď #8 kdy: 31. 10. 2010, 11:25:25 »
1) když chce programátor používat exception.. proč tam píše podmínku... zvlášť když...
3) tu exception by měla vyhodit už ta metoda
Nemusí to být jeho metoda, popř. ta metoda se může chtít používat jinde bez výjimky, popř.
se typ výjimky může lišit dle použití - sice ne úplně standardní techniky, ale za určitých podmínek by mohli být opodstatněné. Ale máš pravdu, že spíš je to prasečina.


2) ..ta metoda zřejmě vrací referenci, takže z ní dělat ošklivý pointer je nesmysl..
No jsou dvě možnosti - buďto metoda může vrátit "neplatnej objekt" (NULL) - pak je ale totální prasárna (že to musim napsat takhle) aby vracela referenci. Nebo nemůže vrátit NULL (ať už nevrací referenci nebo vrací ale nevrátí nikdy NULL) a pak nemá podmínka smysl.

Poslední možnost, která mě napadá, je nějaké obskurní přetížení operátoru &, ale to je nejmíň taková prasečina, jako předchozí případy.


Jinak co se týče sporu NULL a 0, imho je jedno co se používá - evidentně lze odůvodnit obé, mělo by to být ale používané konzistentně. Osobně mám radši ==0, je to kratší :-).
A to tu ještě nezazněla možnost !a :-)
« Poslední změna: 31. 10. 2010, 11:28:51 od Matyáš Novák »

nevim

Re: Chyták pro C++ programátora
« Odpověď #9 kdy: 31. 10. 2010, 11:31:10 »
Onda.Novacisko:
Co bych mu udelal? To zavisi od toho jaky ma plat. Pokud je to nejaky "pocitacovy delnik" a ma mene nez ~40-45tis./mesicne, tak bych ho jen upozornil a problem mu vysvetlil. Pokud ma vice, asi bych mu strhnul nejake premie nebo neco v tomto smyslu a samozrejme ho upozornil a problem vysvetlil.

Petr B.

Re: Chyták pro C++ programátora
« Odpověď #10 kdy: 31. 10. 2010, 11:42:29 »
Především bych řekl, že adresa v paměti nemůže být nikdy 0, takže ta podmínka bude vždycky FALSE.

Je otázka, jestli to bylo od programátora přehlédnutí, nebo je to "systémová chyba". Chyby děláme všichni, že .. :)

D.A. Tiger

  • ****
  • 486
  • Tygr, který žere tučňáka ;-)
    • Zobrazit profil
    • E-mail
Re: Chyták pro C++ programátora
« Odpověď #11 kdy: 31. 10. 2010, 12:43:44 »
Neni nahodou ten test na adresu navratove hodnoty (vychazim predpokladu, ze funkce vraci hodnotu ve stacku, jinak nechapu proc by musel autor ziskavat adresu navratove hodnoty) absolutne zbytecny a nikdy neselze? Mam takovy dojem, ze statickym hodnotam se prizuje adresa vzdy a kdyz dojde pamet ... to uz v takovem pripade resi rovnou mechanizmy v systemu. Pokud se tedy nepletu, k vyjimce nikdy nedojde....
« Poslední změna: 31. 10. 2010, 12:47:48 od D.A. Tiger »

XYCZ

Re: Chyták pro C++ programátora
« Odpověď #12 kdy: 31. 10. 2010, 12:45:55 »
Především bych řekl, že adresa v paměti nemůže být nikdy 0
Zjevně offtopic k daném příkladu, ale kde si myslíš, že je po startu x86 uložená adresa handleru dělení nulou?  ;)

ondra.novacisko.cz

Re: Chyták pro C++ programátora
« Odpověď #13 kdy: 31. 10. 2010, 12:46:57 »
Správně odpověděli ti, co poznali, že funkce getUnMarshaledData() vrací referenci ale za určitých okolností může vrátit referenci na adresu 0. V tom je ta prasárna. Nejhorší je, že tohle pochází od lidí (konkrétního autora neznám), kteří nepatří mezi nováčky a rozhodně znají jak se které konstrukce v C++ překládají. A v tom je asi ten největší průser, protože to napíšou tak, jak je to v danou chvíli nejjednodušší, dyť, stejně to bude fungovat, reference je přece pointer.

Uvedený příklad samozřejmě funguje jak má, tedy funkce opravdu může vrátit NULL-referenci a podmínka zafunguje a vyhodí výjimku

Správně by byly dvě možnosti. První možnost předpokládá, že upravíme rozhraní tak, aby funkce vracela, místo reference, ukazatel. Vůbec sám zastávám pravidlo, že pokud nějaká funkce vrací ukazatel, nebo předává parametry jako ukazatel, musí vždycky druhá strana provést test na NULL (0 - v C++ sice oficiálně NULL není, přesto ho používám kvůli čitelnosti). Pokud se něco předává nebo vrací jako reference, nesmí se předat NULL, tedy vždy musí referencovat platný objekt. Zodpovědnost za správnost dat nese strana, která parametry nebo výsledek poskytuje.

Pokud by nebyla možná změna v rozhraní (například proto, že rozhraní je poděděné), druhým řešením je výjimka uvnitř funkce getUnmarshaledData().

Toho člověka samozřejmě potrestat nemohu, ale zajímal mě jen názor :-)

ondra.novacisko.cz

Re: Chyták pro C++ programátora
« Odpověď #14 kdy: 31. 10. 2010, 12:50:55 »
A ještě pro zajímavost, jak vypadá funkce getUnMarshaledData()

Kód: [Vybrat]
Value &Builder::getUnMarshaledData() {
   return *value; //value je member promenna objektu typu Value *
         //vsimnete si dereference NULL pointeru
}