[so] [Tema1][Linux][Windows] Comportament diferit la runtime
Mihai Barbulescu
b12mihai at gmail.com
Tue Mar 14 00:26:22 EET 2017
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
More information about the so
mailing list