[so] [Tema1][Linux][Windows] Comportament diferit la runtime

Adriana Dinca dinca.adriana2 at gmail.com
Wed Mar 15 14:57:48 EET 2017


Buna tuturor,

Am reusit sa gasesc care erau problemele care imi cauzau acel comportament
ciudat.
Am reimplementat unele dintre functiile hashtable-ului care imi creau
probleme.

Multumesc mult pentru feedback, Mihai.
M-a ajutat sa fac debugging si sa imi rezolv din probleme.

Numai bine,
Adriana




Pe 14 martie 2017, 00:26, Mihai Barbulescu <b12mihai at gmail.com> a scris:

> Mai incerc sa inteleg de ce _doar_ pt 8 caractere ai problema asta
> insa pana la aia ai unele mai mari:
>
> 1. aloci pt buffs si params 100000 si 50000 -> e cam mult la alocarea
> asta statica si imi zic astea ca poate d-aia pica testele de pe Linux.
> 2. hash.c -> nu trebuia sa regenerezi libhash.so. libhash.so SE DA in
> tema si tre` doar sa te linkezi cu el. Sursa hash.c am dat-o pt cei
> care dezvolta pe masini cu alta arhitectura decat vm-ul de SO. Sa
> corectezi acest aspect te rog.
> 3. Formularea strcpy( cmd, strtok( buff, " " ) ); nu prea imi place.
> strcpy oricum e known to offer buffer overflows. Incearca folosirea
> strncpy si salveaza ce genereaza strtok intr-o variabila, poate
> de-acolo vin probleme
>
> Pe langa ele adaug:
>
> 4. Intr-adevar: pe o masina cu ubuntu 14.04 cu 64 bit tema ta trece
> toate testele, dar pe cea de SO nu trece (cea de SO fiind si cea de pe
> vmchecker!). Verifica daca si initializezi memoria folosita/alocata.
> 5. Vad ca bagi extra lines/whitespaces - nu ca ar fi neaparat asta o
> problema, dar ne-am mai fript, vezi atat precizarea din enunt cat si
> discutia de aici:
> https://www.mail-archive.com/so@cursuri.cs.pub.ro/msg03743.html
> 6. Apropo de cifra magica 8, valgrind imi da cu virgula pe testul 2,
> verifica outputul de mai jos (si ti-am zis sa rulezi cu valgrind) si
> uita-te ce-ai prin functiile add si print ale hashtable-ului. Si n-am
> inteles ce vrei sa faci in jur de linia 169 p-acolo cu if-ul ala fara
> nimic.
>
> ==8507== Invalid write of size 1
> ==8507==    at 0x4C2E1F3: strcpy (in
> /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==8507==    by 0x402406: createntry (util.c:144)
> ==8507==    by 0x402571: add (util.c:175)
> ==8507==    by 0x400E51: readFromStdin (tema1.c:22)
> ==8507==    by 0x401E73: main (tema1.c:214)
> ==8507==  Address 0x53fe928 is 0 bytes after a block of size 8 alloc'd
> ==8507==    at 0x4C2AB80: malloc (in
> /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==8507==    by 0x4023E6: createntry (util.c:142)
> ==8507==    by 0x402571: add (util.c:175)
> ==8507==    by 0x400E51: readFromStdin (tema1.c:22)
> ==8507==    by 0x401E73: main (tema1.c:214)
> ==8507==
> ==8507== Invalid read of size 1
> ==8507==    at 0x5084943: vfprintf (vfprintf.c:1661)
> ==8507==    by 0x508D3D8: printf (printf.c:33)
> ==8507==    by 0x402A65: print (util.c:312)
> ==8507==    by 0x401184: readFromStdin (tema1.c:59)
> ==8507==    by 0x401E73: main (tema1.c:214)
> ==8507==  Address 0x53fe928 is 0 bytes after a block of size 8 alloc'd
> ==8507==    at 0x4C2AB80: malloc (in
> /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==8507==    by 0x4023E6: createntry (util.c:142)
> ==8507==    by 0x402571: add (util.c:175)
> ==8507==    by 0x400E51: readFromStdin (tema1.c:22)
> ==8507==    by 0x401E73: main (tema1.c:214)
>
> NOTE TIP pentru : verificati memory leak-urile si accesele nevalide la
> memorie (buffer overflows, acces memorie nealocata etc) folosind
> tutorialul de valgrind de aici [1] si gdb [1']. Debugati tema in
> masina virtuala de SO si nu altundeva [2]
>
> [1]: https://ocw.cs.pub.ro/courses/so/laboratoare/laborator-05#
> exercitiul_5_-_lucru_cu_memoria_-_valgrind_1p
> [1']: https://ocw.cs.pub.ro/courses/so/laboratoare/resurse/gdb
> [2]: https://ocw.cs.pub.ro/courses/so/info/mv
>
>
> 2017-03-13 19:28 GMT+02:00 Adriana Dinca <dinca.adriana2 at gmail.com>:
> > Buna din nou,
> >
> > Am reusit sa reproduc problema descrisa initial.
> >
> > Codul sursa este cel de pe vmchecker.
> >
> > Continutul fisierului _test/inputs/test2.in:
> > add vilfredo
> > print
> >
> > Rulez urm. comand in Cygwin:
> >      $./tema1.exe 1 _test/inputs/test2.in
> >
> > Nu obtin niciun rezultat.
> >
> > Modific continutul fisiserului _test/inputs/test2.:
> > add vilfredo1
> > print
> >
> > Rulez urm. comand in Cygwin:
> >      $ ./tema1.exe 1 _test/inputs/test2.in
> >      vilfredo1
> >
> > Am observat ca am aceasta problema daca cuvatul adaugat are 8 caractere.
> >
> > Eu nu reusesc sa gasesc o explicatie a acestui comportament.
> >
> > Mihai, daca ai timp si poti sa iti arunci un ochi peste tema mea, as
> > aprecia.
> > Eu pot sa o urc si pe bitbucket daca iti e mai comod.
> >
> > Username-ul meu de cs este adriana.dinca.
> > Folosesc pentru rularea testelor masina virtuala de SO.
> >
> >
> > Numai bine,
> > Adriana
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> > Pe 13 martie 2017, 14:57, Mihai Barbulescu <b12mihai at gmail.com> a scris:
> >>
> >> Buna,
> >>
> >> M-am uitat pe noua submisie a ta de pe vmchecker, vad niste buffer
> >> overflow-uri (nu m-am uitat in cod, doar pe rularile Linux/Windows),
> >> da-i si cu un valgrind inainte sa vezi pe unde dai p-afara cu memoria.
> >> Nu alocarea e problema ci faptul ca undeva dai peste.
> >>
> >> Atat la rularea cu GDB (apropo, baga cu cgdb e mai draguta interfata)
> >> cat si la cea cu VALGRIND ai grija sa compilezi cu -g si sa stergi
> >> orice alta -O optiune de optimizare pentru a prinde mai usor problema.
> >> Si dai cu valgrind peste unul din testele care pica in Linux.
> >>
> >> Alt hint pe care il vad e la 24) Test double... -> pare ca outputul
> >> tau e bun dar ai bagat un funny character in forma de triunghi
> >> p-acolo, nu stiu cum reusesti sa il bagi, poate nu pui \0 cand prntezi
> >> stringu`, nu imi dau seama.
> >>
> >> -marci nona megen jerry rachmaninoff  frederique vanny alyss carlee
> >> betsey winona daphna cindie wynn jeanie
> >> +marci nona megen jerry rachmaninoff frederique vanny alyss carlee
> >> betsey winona daphna cindie wynn jeanie
> >>
> >> Momentan astea sunt singurele idei acum.
> >>
> >> 2017-03-13 14:11 GMT+02:00 Adriana Dinca <dinca.adriana2 at gmail.com>:
> >> > Buna Mihai,
> >> >
> >> > Pe vmchecker e urcata ultima arhiva care care la rulare din Cygwin imi
> >> > genereaza outputuri diferite pt testul 2.
> >> > Username-ul meu de cs este adriana.dinca.
> >> >
> >> > Cred ca acest comportament se datoreaza modului in care programul meu
> >> > aloca
> >> > memoria.
> >> >
> >> > Am incercat astazi sa reproduc problema si nu am mai reusit.
> >> >
> >> > In schimb obtin outputuri diferite la rularea aceluiasi executabil cu
> >> > aceleasi argumente pentru un alt test.
> >> >
> >> > O sa rulez cu gdb sa vad daca gasesc problema.
> >> >
> >> > Multumesc pt raspuns.
> >> >
> >> > O zi faina,
> >> > Adriana
> >> >
> >> >
> >> >
> >> >
> >> >
> >> >
> >> > On 13 Mar 2017 7:59 a.m., "Mihai Barbulescu" <b12mihai at gmail.com>
> wrote:
> >> >
> >> > 2017-03-12 20:05 GMT+02:00 Adriana Dinca via so <so at cursuri.cs.pub.ro
> >:
> >> >> Buna tuturor,
> >> >>
> >> >> Am urmatoarea problema atunci cand rulez test2.in.
> >> >>
> >> >> Pe Linux testul imi trece fara probleme.
> >> >>
> >> >> Pe Windows are urmatorul comportament:
> >> >> - daca rulez executabilul din Cygwin si dau comenzile de la stdin
> obtin
> >> >> outputul corect
> >> >> - daca rulez executabilul din Cygwin si dau ca parametru fisier-ul cu
> >> >> aceleasi comenzi nu imi afisaza nimic. (nici macar printf de pe
> primul
> >> >> rand
> >> >> al main-ului)
> >> >> - daca rulez executabilul din Visual Studio Power Shell imi afisaza
> >> >> printf
> >> >> de pe primul rand din main, insa crapa si cand citesc de la stdin sau
> >> >> din
> >> >> fisier.
> >> >>
> >> >> Mentionez ca folosesc doar functii ANSI C si ca lucrez pe masina
> >> >> virtuala
> >> >> pusa la dispozitie de catre echipa de SO.
> >> >>
> >> >> Daca modific continutul fisierului test2.in prin modificarea
> lungimii
> >> >> cuvantului adaugat (fie < 8 caractere / > 8 caractere)  nu apar
> >> >> problemele
> >> >> descrise mai sus.
> >> >>
> >> >> Am observat ca testul imi crapa daca adaug cuvinte care au lungimea
> >> >> egala
> >> >> cu
> >> >> 8 caractere.
> >> >> Daca inlocuiesc "vilfredo" cu "aaaaaaaa" obtin acelasi comportament.
> >> >> In schimb daca inlocuiesc cu "aaa" sau "aaaaaaaaaaaaa" merge fara
> >> >> probleme.
> >> >>
> >> >> Daca ati mai intalnit aceasta problema sau aveti vreo idee din ce
> cauza
> >> >> obtin acest comportament ciudat, v-as ruga sa imi dati de stire.
> >> >>
> >> >> Multumesc!
> >> >>
> >> >
> >> > Buna,
> >> >
> >> > Nu am reusit inca sa ma prind de acest comportament ciudat al tau. Pe
> >> > vmchecker e ultima versiune a codului care reproduce acest
> >> > comportament?
> >> > Eventual poti rula test2.in pas cu pas si sa ne dai aici pe lista tot
> >> > output-ul + descrierea comportamentului? E OK, ca nu dai cod sursa.
> >> > Asta ca sa stiu ce fac cand reproduc cu tema ta.
> >> >
> >> > De asemenea, pe Windows singurul scenariu valid este rularea din
> >> > Cygwin, nu va stresati cu rulat din visual studio debug shell sau
> >> > power shell sau windows cmd. Atat vmchecker cat si testele presupun
> >> > rularea din cygwin.
> >> >
> >> > --
> >> > Cu stimă,
> >> > Mihai Bărbulescu
> >> >
> >> >
> >>
> >>
> >>
> >> --
> >> Cu stimă,
> >> Mihai Bărbulescu
> >
> >
>
>
>
> --
> Cu stimă,
> Mihai Bărbulescu
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/so/attachments/20170315/db75a3bb/attachment-0001.html>


More information about the so mailing list