Mineguru

Dupa cum remarcam intr-un comentariu anterior, minerul si-a luat putin din pila articolul ala copiat de pe codeguru si l-a pus pe codeguru. Citind el ce i-am zis despre functia imaginara snwprintf() si alte aberatii, a schimbat placa si n-a mai incercat sa fie cross-platform, ci a incercat sa fie cross-character set. Problema de pornire s-a schimbat peste noapte si a devenit:

The writing of this buffer was done using: vswprintf(). As we know, this function is unsafe and is not recommended.

Iar solutia ar fi:

#if defined(UNICODE) || defined(_UNICODE)  
#define usprintf(x, ...) \
   _snwprintf(x, _countof(x)-1, ##__VA_ARGS__); \
   x[_countof(x)-1] = 0
#else
#define usprintf(x, ...) \
   _snprintf(x, _countof(x)-1, ##__VA_ARGS__); \
   x[_countof(x)-1] = 0
#endif

Lasind la o parte faptul ca n-a inteles cind i-am zis ca macro-urile cu mai multe statement-uri nu se scriu asa, trebuie sa ne intrebam totusi urmatoarele:

  • de ce e vswprintf() “unsafe”, si de ce e _snwprintf() mai “safe”?
  • cum inlocuiesti un apel la vswprintf(), care doreste un va_list, cu macro-ul ala imbecil?

Si daca trebuie sa ne intrebam, ne-am intrebat. Ortacul a facut greseala fatala de a posta pe un site unde nu poate sterge comentariile incomide. Veni si raspunsul:

Sorry, I’m not talking about vswprintf() versus _snwprintf(). I just decided to use one of these.

Ok, n-a inteles intrebarea, deoarece era pusa in limba lui Shakespeares si se referea la articolul lui, pe care doar l-a scris, nu l-a si citit. Am incercat o reformulare, pe care a inteles-o si a raspuns cu un copy/paste din MSDN urmat de propria concluzie:

“Using vsprintf, here is no way to limit the number of characters written, which means that code using this function is susceptible to buffer overruns. Use _vsnprintf instead, or call _vscprintf to determine how large a buffer is needed. Also, ensure that format is not a user-defined string. For more information, see Avoiding Buffer Overruns.” Same story with vswprintf().
http://msdn.microsoft.com/en-us/library/28d5ce15(v=VS.80).aspx

Priviti-l, stimati concetateni, in toata splendoarea lui. Acest cercopitec e atit de sigur pe el incit imi da condescendent si un link la MSDN pe care el nu l-a citit. I-am indicat gratios faptul ca o pula “same story”, asa ca a editat articolul, a pus swprintf() in loc de vswprintf() si a declarat:

The functions used in the macro (_snwprintf/_snprintf()) are not proper to replace functions like vswprintf() – this function has different count of mandatory parameters and uses a list of arguments parameter. Sorry, in article I mean swprintf() witch is unsafe. Thanks for observation.

Aha, doar ca nici vrajitoarea swprintf() nu e “unsafe”, dupa cum i-am explicat deja, dar a uitat; si dupa cum scrie in link-ul la care ma trimitea pe mine, pe care tot nu l-a citit. Silviu nu are nevoie de documentatie sau de realitate, el are 11 ani de experienta.

Va tin la curent pe masura ce-si editeaza articolul si-si fabrica noi justificari, ca in vremurile bune. Sper ca se va incheia triumfal cu Bancila sau Cucu (care sint moderatori pe site-ul ala de tutorialisti indieni) operind “small cosmetics” asupra comentariilor mele.

 

Tags: , , , , , , , , , , ,

20 Responses to “Mineguru”

  1. Pintea Says:

    In sfarsit un articol la care nu poate sterge comentariile. Absolut epic ! sa aiba si posteritatea de ce se bucura.

    Urmarind articolele patologice ale lui Silviu, mi-am dat seama de o chestie…e dislexic ma !
    Nu e frumos sa radem de un om bolnav, dar daca prin manifestarea bolii el nu poate vorbi, citi sau scrie romaneste sau englezeste, ce pretentii sa mai avem de la un limbaj de programare.

    Nume de reality show: Un dislexic invata C++, cred ca ati strans material de 3-4 sezoane pana acum.

  2. Pacificator Says:

    Tutorialism lvl 85.
    Faci un cacat dupa care scrii un articol despre cum te-ai scremut ca sa scoti abominatia aia.

  3. jos8cal Says:

    E mai tare decit atit, trust me.

    Ai de facut un cicat, habar n-ai cum sa faci, vin altii si-ti explica dupa care tu te duci pe net si cauti sa intelegi ce ti-au explicat aia, iar la sfirsit faci un articol despre ce ai inteles tu din rezolvarea data de altii si-ti asumi solutia.

  4. Pacificator Says:

    Da…E mult mai buna descrierea ta :).
    Ce mi se pare mie super epic este ca Silviu nu intelege frate. Nu pricepe.
    Incearca Mihnea sa ii explice logic ca este un bou si greseste, dar oricat de simple si clare sunt argumentele Silviu da cu repel si nu il atinge nimic.
    Pai in dumnezeii lui de swprintf care il corectezi cu un macro usprintf ca sa nu treci prin toata solutia sa pui de mana countof. Pai plm….acum nu trebuie sa te duci prin toata solutia sa pui usprintf in loc de swprintf…Cum cacat ma?

  5. Pacificator Says:

    OMG acum realizez…probabil a luat tarnacopul “Find&Replace” si a dat cu el in solutie, iar unde nu a compilat a scos count-ul din apelul functiei…

  6. Mihnea Says:

    S-ar putea scoate count-ul cu un regexp la find&replace, da’ iti dai seama ca nu stie el sa faca asa ceva. De fapt e mult mai simplu: apelul original nu era cu swprintf() cum poveste el acolo, era un sprintf() sau ceva care chiar nu ia count. Nu a schimbat in 500 de locuri prin solutie, a schimbat doar unde ii crapa. Aia cu macro-ul “safe” in general si care merge si pe ansi si pe unicode e o fantasma ce s-a intimplat seara dupa munca in intimitatea dormitorului personal cind se visa programator, arhitect si ctitor de articole. Doar nu era sa scrie un articol despre cum i-au aratat altii de ce ii crapa codul in _chkstk() si cum a schimbat o linie ca sa nu mai crape, trebuia sa propuna o solutie in general.

  7. Mihnea Says:

    Oricum, mi-a inchis gura: “you don’t know me in person but you dare to qualify me in different ways”. Cum mi-am permis sa-i spun ca codul lui suge fara sa-l cunosc personal?

  8. crip Says:

    Vindeti tricouri? :)

  9. Catalin++ Says:

    Ma gandesc acum ca am intalnit oameni ca el. Oameni care cred ca stiu programare si ca au raspunsul la orice. Oameni care daca nu stiu raspunsul la o problema reala, matematica, exacta incep sa-si imagineze lucruri, sa treaca totul printr-un filtru filosofic si sa genereze aberatii. Imi aduc aminte ca am auzit niste lucruri fantastice despre heap, despre pointeri si despre threaduri. Am vazut cod scris de incompetenti care credeau ca stiu programare paralele si umpleau thread-ul cu switch si case-uri cand aveau o singura optiune in acel thread. Aceste specimene exista si codeaza, sperie juniorii si sadesc dobitocii mai mari ca ei in mintea colegilor creduli. Este un lant evolutiv prin care prostia se perpetueaza si trimumfa. Pe langa asta, ingrozitorul situatiei devine si mai bestial cand observi liceeni si studenti care habar n-au in ce limbaj codeaza, care nu stiu cu ce se mananca un pointer, care cred ca bubble-sort e miezul algoritmilor de sortare nu doar un cacat injectat in mintea lor pentru a-i invata un for si un while :) Prostia pleaca de la mentori, de la profesorii frustrati, care, in incercarea lor de a sadi prostie genereaza generatii de alti frustrati si incompetenti.

  10. Silviu Ardelean Says:

    Mihnea, mai bine ai renunta la etnobotanice ca de aia visezi variadic macros in C++11.
    Citez: “require a compiler with support for C++11-style variadic macros”.
    Mai citeste, Dom’Profesor, mai citeste!
    De aia nu iau bacu plozii pe care te dai mare ca-i inveti programare! :)

  11. Mihnea Says:

    Sa-mi bag pula, ce emotie trebuie sa te fi trecut cind ti s-a parut ca m-ai prins in sfirsit cu o greseala. Cred ca ai avut orgasm pe cur, se intreaba colegii de la Saguaro de ce de vreo ora-doua te uiti in gol zimbind timp. Ai infrint!

    Sau nu. Ia zi mai Silviule, cind s-au bagat macro-urile astea variadice in C++? Nu in C, unde sint din C99; de cind sint in standardul de C++? Da fuga si intreaba-l pe muistul care ti-a soptit ca am gresit.

    PS: ce nu pricepi tu si sleahta ta de cretini e ca eu nu incerc sa invat pe nimeni programare, desi stiu mai multa decit voi la un loc (si si mai multa decit voi fara tine, ca tu esti pe minus si tragi grupul in jos). Eu nu scriu articole. Voi aveti nesimtirea sa faceti pe profesorii, desi nu sinteti in stare sa indexati un array sau sa incrementati un pointer.

    PPSLEMUIEOVIDIU: sper ca nu te superi ca ti-am pus numele real.

  12. Tudor Says:

    E misto and all tot conflictul asta dramatic si imi dau seama ca acest site s-a modelat in jurul lui SA dar serios acum: aia au timp sa-si faca un site “serios” de programare si voi nu. Dar in fine, daca ati ramas tot la nivel de injuraturi reciproce (voi declarat, ei anonim) banuiesc ca asta va intereseaza de fapt. In mod cert nu ardeti voi de nerabdare sa invatati tinereii cu ce se mananca programarea. Oh well, castigati bine banuiesc si nu credeti ca e wasted talent ce faceti pe aici… :)

  13. Mihnea Says:

    Nu inteleg de unde a venit asta cu timpul sau de ce e relevant. Din injuraturile de aici nu rezulta ca n-avem timp de facut site serios de programare. Rezulta doar ca ei au timp si dorinta, dar le lipseste creierul (sau e trecut pe locul doi de catre pulan, ca la Ovidiu). Mai rezulta si ca incearca sa faca un site prea serios, deoarece se iau foarte in serios, ceea ce e o ofensa majora in ochii mei.

    Blog-ul asta nu e doar despre codexperti si mascota lor, e de ris despre prostia in programare in general. Silviu apare asa de des aici pur si simplu pentru ca este un prost foarte mare si foarte prolific. Practic sintem obligati sa ridem de el. Cind reuseste sa-si tina gura 5 minute, cautam alte subiecte, dar cum incepem sa credem ca am scapat de el, revine cu o forta si o incapatinare ce puteau fi faurite doar in adincul pamintului, la lumina lampasului.

    Oricum, nu vad cum e o investitie asa de mare de timp sa pui un phpbb. De altfel, am facut-o si noi. Sper ca nu voiai sa zici ca ei investesc timp in scris articole si FAQ-uri.

  14. mishu Says:

    #include
    #define OVM(x, …) x(__VA_ARGS__)
    void f() { OVM(printf, “%s %d\n”, “Three args for “, 1); }

    int main()
    {
    f();
    return 0;
    }

    Nu e asta un variadic macro ? La cat le folosesc nici nu stiu cum arata.
    L-am luat de aici: http://www.edg.com/docs/edg_cpp.pdf
    1.9.1 C99 Features Available in Other Modes

    Merge in C cu VS2005. N-am inteles ce zice Silviu.
    Gia.

  15. Mihnea Says:

    Merge si in C++ cu VS 2005 pentru ca foloseste acelasi preprocesor pentru C si in C++ (merge si in GCC de pe la 3, parca). Totusi, oficial (adica in standard), C++ nu are asa ceva decit de la C++11. Minerul nu stie asta si crede ca m-a prins cu greseala.

  16. Gogu Says:

    Eu ce as vrea sa stiu e cum de mai aveti timp sa va raciti gura de pomana de fiecare data cand Silviu ‘produce’ cate ceva..
    Incompetenti sunt in toate profesiile, dar chiar nu ma deranjeaza cat timp nu trebuie sa lucrez impreuna cu ei – dimpotriva, cu atat mai bine pentru cel ce e in tabara cealalta.

  17. Mihnea Says:

    Asta nu e un incompetent oarecare, e unul foarte prost care se crede foarte bun si pe deasupra incearca sa faca si pe profesorul. Prostia lui e foarte amuzanta pentru noi, iar faptul ca ne citeste constiincios si roade tastatura de nervi ne umple sufletele de bucurie.

    Nu ne racim gura de pomana. Ridem. Uneori rid si altii cu noi.

    De ce n-am avea timp? Ce-i cu grija asta pentru timpul nostru?

  18. Catalin++ Says:

    @Cogu

    Ti-ai cumpara o masina stiind ca un asemenea specimen a dezvoltat un modul din ea? Dar despre integritatea unui antivirus ? Incompetentii trebuie localizati si inoculati pentru ca, direct sau indirect, toata lumea are de suferit. Acum nu e dracu asa negru incat sa ne gandim ca o sa murim pentru ca unul ca el nu stie nxn * 1xn dar… e bine sa ne ferim!

  19. Gogu Says:

    @Catalin: am renuntat de mult sa sper ca pot scapa lumea de incompetenti – daca pe cei din imediata apropiere ii vad, multi mai multi sunt prin alte firme a caror produse vrand-nevrand trebuie sa le folosesc.. (gen MS)

  20. a Says:

    “Uneori rid si altii cu noi.”

    Ce să facem și noi?! Am plâns până a devenit hiihiilar.

    “Dar despre integritatea unui antivirus ?”

    Lasă că nu o lucrat efectiv la antivirus…. din fericire.

Leave a Reply

Optionally add an image (JPEG only)