Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Ce parere aveti de viteza/ modul ...

Love Lies Bleeding - 2024

Cum sterg mails din Promotions

Vanzare cumparare fara transfer b...
 Receptie ciudata, in functie de t...

Donez medicamente renale ptr pisica

Ce componenta e asta si ce ziceti...

Dupa 20 ani de facultate, am uita...
 Mobile.de ofera imprumut de bani ...

problema test grila

Digi24 a disparut de pe TV Lg

Drept de proprietate intelectuala...
 Jante noi shitbox

Trinitas TV 4K

Dacia 1316 cu 6 usi ...

Frecventa modificata radio
 

[CONCURS] Hunt down the bug :-)

- - - - -
  • Please log in to reply
31 replies to this topic

#1
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
Pe langa "better code practices" si "worst code practices", in urma acestui thread mi-a venit in minte inca un exercitiu bun pentru incepatori: Gaseste bugurile!

Aceste thread-uri apar si in sectiunea "thread-uri utile despre probleme comune" din Sfaturi de programare în PHP

Acum codul:
	 1	<?php
	 2	function get_fstree_recursive($target) {
	 3		$cwd = opendir($target);
	 4		$r = array();
	 5		if($cwd) {
	 6			while($rel_path = readdir($cwd)) {
	 7				if('.' == $rel_path || '..' == $rel_path) {
	 8					continue;
	 9				}
	10				if(is_dir($rel_path)) {
	11					$r[$rel_path] = get_fstree_recursive($target.DIRECTORY_SEPARATOR.$rel_path);
	12				}
	13				elseif(is_file($rel_path)) {
	14					$r[] = $rel_path;
	15				}
	16			}
	17		}
	18		return $r;
	19	}
	20	
	21	var_dump(get_fstree_recursive('.'));
	22	
	23	?>
	24
Hunt 'em down! :lol:

Codul are un mic bug care e usor de reparat de indata ce intelegi ce se intampla, plus inca un bug in care e vorba mai mult de "nuanta" :)

Rog avansatii sa le lase placerea incepatorilor

:cheers:

Edited by OriginalCopy, 09 September 2008 - 11:54.


#2
vali38

vali38

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 16.10.2005
ne dai un mic ajutor ? ma chinui de ceva timp si nu stiu cu certitudine la ce vrei sa ajungi dar banuiesc ca vrei sa apara ceva in genul asta

Quote

<?php
$a = array(1, 2, array("a", "b", "c"));
var_dump($a);
?>

array(3) {
  [0]=>int(1)
  [1]=>int(2)
  [2]=>array(3) {
    [0]=>
    string(1) "a"
    [1]=>
    string(1) "b"
    [2]=>
    string(1) "c"
  }
}

LE: am vazut ce te-ai folosit de DIRECTORY_SEPARATOR ... care e avantajul pentru care ai ales varianta asta ?

Edited by vali38, 09 September 2008 - 14:15.


#3
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

 vali38, on Sep 9 2008, 14:05, said:

ne dai un mic ajutor ? ma chinui de ceva timp si nu stiu cu certitudine la ce vrei sa ajungi dar banuiesc ca vrei sa apara ceva in genul asta

Nu vreau sa ajung la ceva anume. Functia trebuie sa returneze intreg arborele de fisiere si directoare de sub directorul curent ('.') intr-un array. Insa e un bug mic (usor de gasit) si unul mare (greu de gasit). Testeaza cu diferite date de intrare si-ti vei da seama, apoi repara-le. Poate gasesti doar un bug si doar o solutie, ceea ce e bine oricum :)

Mai important e sa documentezi bug-ul decat doar sa corectezi codul. Wikipedia: http://en.wikipedia....ki/Software_bug

PS: Ca sa testezi rapid foloseste PHP din CLI:

Quote

msdos> C:\php\php.exe -f ../buggytree.php
sau ma rog, din shell-ul *NIX daca ai.

LE

 vali38, on Sep 9 2008, 14:05, said:

LE: am vazut ce te-ai folosit de DIRECTORY_SEPARATOR ... care e avantajul pentru care ai ales varianta asta ?
Nu trebuie sa-mi fac griji daca e windows sau linux, unde separatoarele difera ('\' vs '/'). Sfatul se afla in "sfaturi de programare in php".

#4
vali38

vali38

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 16.10.2005
prima problema si cea mai evidenta fara de care nu puteai face nimic era legata de elseif...daca un if are cel putin un elseif,trebuie sa aiba obligatoriu un else
<?php

function get_fstree_recursive($target) {
	$cwd = opendir($target);
	$r = array();
	if($cwd) {
		while($rel_path = readdir($cwd)) {
			if('.' == $rel_path || '..' == $rel_path) {
				continue;
			}
			if(is_dir($rel_path)) {
				$r[$rel_path] = get_fstree_recursive($target.DIRECTORY_SEPARATOR.$rel_path);
			}
			else {
				$r[] = $rel_path;
			}
		}
	}
	return $r;
}
	  
var_dump(get_fstree_recursive('.'));

?>

acum imi prajesc neuronii la cea de-a doua problema...directoarele din directoarele directorului :)) dat nu sunt afisate...

#5
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

 vali38, on Sep 9 2008, 16:23, said:

prima problema si cea mai evidenta fara de care nu puteai face nimic era legata de elseif...daca un if are cel putin un elseif,trebuie sa aiba obligatoriu un else
A? Imi pare rau sa te dezamagesc, dar la faza asta ai umblat dupa cai verzi pe pereti, Don Quijote :P
Nu, nu trebuie.
LE: este recomandat incepatorilor sa trateze fiecare caz posibil cu scopul de a le dezvolta simtul pentru "toate felurile posibile de input sau error handling/reporting", dar nu e obligatoriu (daca stii ce faci, si acum stii ce faci ;)  )

LE 2: la sfarsit vom discuta si despre asta. Pe scurt: pe lumea asta exista si alte lucruri pe un filesystem pe langa fisiere si directoare, care pe noi nu ne intereseaza; ne concentram pe algoritmica)

 vali38, on Sep 9 2008, 16:23, said:

acum imi prajesc neuronii la cea de-a doua problema...directoarele din directoarele directorului :) ) dat nu sunt afisate...
Ai rezumat bine bugul mic, acum ramane intrebarea cauzalitatii ;)
PS: vezi ca nu e vorba numai de directoare, ci si de fisiere, ie: "arborele de fisiere si directoare". Ce se intampla cu ele? Un mic detaliu, dar important ;)




LE 3: ok, rewind "LE 1", ca sa nu te derutez mai mult. Ceea ce stii e un sfat bun, mereu trebuie sa fie un "else" intr-o conditie. In practica, mereu va fi un else pentru cazurile neasteptate care pot aparea pe parcursul dezvoltarii aplicatiei. De exemplu, dezvolti aplicatia si ajungi sa pasezi un tip de argument unei alte functii pe care ai uitat sa o modifici in asa fel incat sa proceseze acel tip de input. In acest caz ramura else isi face treaba.

Insa acum in PoC-ul de mai sus incercam sa izolam problema, algoritmica, de factori externi (cum ar fi un alt fs pe care nu-l tratam). Acum tratam exclusiv fisierele si directoarele si ne concentram pe algoritmica,nu pe prelucrarea de input cat mai larg, si nici nu incercam sa facem functia cat mai reutilizabila. Sper ca ai inteles...



LE: defapt, felul in care ai modificat acum functia nu ruleaza asa cum ar trebui pe sistemul meu linux. Adica ruleaza, insa nu e scrisa pana la capat asa incat sa trateze si celelalte tipuri de fisiere, deci are si mai multe "pseudo-buguri".

Edited by OriginalCopy, 09 September 2008 - 16:57.


#6
vali38

vali38

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 16.10.2005

Quote

LE: defapt, felul in care ai modificat acum functia nu ruleaza asa cum ar trebui pe sistemul meu linux. Adica ruleaza, insa nu e scrisa pana la capat asa incat sa trateze si celelalte tipuri de fisiere, deci are si mai multe "pseudo-buguri".

sa inteleg ca pe linux nu iti afisaza toate tipurile de fisiere ? am si eu o distributie linux bazate pe rpm (opensuse) instalata dar am ramas la windows pentru ca nu pot folosi soft-urile adobe si lucrul cu fisierele intre win si linux e destul de greoi

------------------------------------

de cand ai postat topicul tot caut acele buguri si crede-ma ca imi fug ochii...nu mai stiu unde si la ce sa ma uit
TEORETIC ar trebui sa mearga (una din replicile programatorilor :P)
aseara am iesit afara cu functia pe o foaie si am dat peste un prieten ca e la politehnica si se pricepe destul de bine la programare...i-am aratat codul si a zis ca sunt nebun (nu stie care e problema) :P
pentru a mai descoperi cate ceva,ori nu gandesc indeajuns de profund ori nu stiu la ce sa ma uit...ai incercat mai sus sa izolezi cazul dar tot nu stiu unde sa-mi arunc ochii

#7
florindinu

florindinu

    Junior Member

  • Grup: Members
  • Posts: 177
  • Înscris: 22.03.2008
Pe linux tipurile de fisiere sunt: fifo, char, dir, block, link, file, socket. Functia lui OriginalCopy ia in calcul doar dir si file, restul le ignora (nu asta e important, ci greselile.Un bug e evident, celalalt e mai subtil si nu se manifesta decat in anumite conditii).

Offtopic 1: Din cate am vazut is_link() e true doar pentru soft links. Cum facem cu hard link-urile?
Offtopic 2: Iti recomand o distributie bazata pe .deb, e mult mai simplu la Debian. Incearca (k|x)ubuntu.

#8
doriaal

doriaal

    Junior Member

  • Grup: Members
  • Posts: 198
  • Înscris: 21.06.2007
Sunt mai incepator in php asa ca o sa explic mai pe limbajul meu :))
Problema cu directoarele si fisierele este ca dupa ce listeaza ce se in afla directorul radacina ,  cand verifica  daca este un  subdirector sau un fisier nu i se da pathu complet
de ex
.
  - folder
     fiser.txt

$rel_path va contine doar "folder" sau "fisier.txt" calea corecta este .\folder sau .\folder/fisier.txt deci in cele 2 if-uri  trebuie sa avem  ($target."/".$rel_path)

Edited by doriaal, 10 September 2008 - 12:40.


#9
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

 doriaal, on Sep 10 2008, 12:14, said:

Sunt mai incepator in php asa ca o sa explic mai pe limbajul meu :) )
Problema cu directoarele si fisierele este ca dupa ce listeaza ce se in afla directorul radacina , cand incearca sa intre intr-un subdirector nu va putea pentru ca i se da un path imcomplet
de ex avem :
.
  - folder
     fiser.txt

$rel_path va contine doar "folder" sau "fisier.txt" calea corecta este .\folder sau .\folder/fisier.txt deci in cele 2 if-uri  trebuie sa avem  ($target."/".$rel_path)
dezvolta :-)

--
Off-topic: (joke), cand cineva iti face un compliment asta e o replica posibila, "continua", "da, dezvolta te rog" :lol:

Edited by OriginalCopy, 10 September 2008 - 12:29.


#10
vali38

vali38

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 16.10.2005
mai are careva puzzleuri ?

#11
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
LE: dar da, acela este bugul evident. Incearca si sa-l corectezi. +1 doriaal :-)

#12
doriaal

doriaal

    Junior Member

  • Grup: Members
  • Posts: 198
  • Înscris: 21.06.2007
Ok , de al doilea nu stiu ce sa zic , desi nu e bug poate e legat de modul de a scrie codul
-pentru  readdir()  e mai corect sau utilizezi operatorul === sau !== cand parcurgi directoarele
- sau ceva legat de permisiuni

#13
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

 vali38, on Sep 10 2008, 12:51, said:

mai are careva puzzleuri ?

Al doilea bug e inca in picioare ... :-)

 doriaal, on Sep 10 2008, 12:52, said:

Ok , de al doilea nu stiu ce sa zic , desi nu e bug poate e legat de modul de a scrie codul
-pentru  readdir()  e mai corect sau utilizezi operatorul === sau !== cand parcurgi directoarele
- sau ceva legat de permisiuni

Nu. Bineinteles sunt si acestea buguri, dar aici nu e vorba de modul tehnic de programare, ci de algoritmica. Se considera ca folosim un fs care cunoaste doar fisiere si directoare (cum e FAT), fara drepturi de acces sau alte lucruri.

Oricum, cineva scrie si codul pt bug? Ar fi o surpriza, dar e posibil sa ai impresia ca e usor de reparat un bug de indata ce gasesti cauza si totusi sa nu-l repari complet :-)

#14
doriaal

doriaal

    Junior Member

  • Grup: Members
  • Posts: 198
  • Înscris: 21.06.2007
<?php
		 function get_fstree_recursive($target) {
			 $cwd = opendir($target);
			 $r = array();
			 if($cwd) {
				 while(false !== ($rel_path = readdir($cwd))) {
					 if('.' == $rel_path || '..' == $rel_path) {
						 continue;
					 }
					if(is_dir($target.DIRECTORY_SEPARATOR.$rel_path)) {
						$r[$rel_path] = get_fstree_recursive($target.DIRECTORY_SEPARATOR.$rel_path);
					}
					elseif(is_file($target.DIRECTORY_SEPARATOR.$rel_path)) {
					$r[] = $rel_path;
					}
				}
			}
						closedir($cwd);
			return $r;
		}

		var_dump(get_fstree_recursive('.'));

	   ?>

mai bine DIRECTORY_SEPARATOR nu doar "/" cum am zis la inceput . ( Unix / Windows separators )

Edited by doriaal, 10 September 2008 - 13:05.


#15
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
Pt al doilea bug indiciul lui florindinu:

 florindinu, on Sep 10 2008, 11:18, said:

Un bug e evident, celalalt e mai subtil si nu se manifesta decat in anumite conditii).

Offtopic 1: Din cate am vazut is_link() e true doar pentru soft links. Cum facem cu hard link-urile?
Offtopic 2: Iti recomand o distributie bazata pe .deb, e mult mai simplu la Debian. Incearca (k|x)ubuntu.
1. inode #:

Quote

[flav@evolution test]$ ls -li
total 0
2179098 -rw-r--r-- 2 flav users 0 2008-09-10 13:09 test
2179098 -rw-r--r-- 2 flav users 0 2008-09-10 13:09 test.hard
2179099 lrwxrwxrwx 1 flav users 4 2008-09-10 13:09 test.soft -> test
2. oh no, not another distro-war - stim cu totii ca nu iese nimic constructiv :-) Eu personal folosesc ArchLinux, INSA cel mai bine e sa incerci cele mai folosite distributii (google: distrowatch) si sa decizi pentru tine ce ti-e bun.

Congrats doriaal you've hunted down one bug :lol:

#16
florindinu

florindinu

    Junior Member

  • Grup: Members
  • Posts: 177
  • Înscris: 22.03.2008

 OriginalCopy, on Sep 10 2008, 14:15, said:

Pt al doilea bug indiciul lui florindinu:
1. inode #:
[flav@evolution test]$ ls -li
total 0
2179098 -rw-r--r-- 2 flav users 0 2008-09-10 13:09 test
2179098 -rw-r--r-- 2 flav users 0 2008-09-10 13:09 test.hard
2179099 lrwxrwxrwx 1 flav users 4 2008-09-10 13:09 test.soft -> test

Dap.. in consola e ok, dar in php e buba, poti avea.. [vroiam sa scriu ceva dar poate asta e al doilea bug]

 OriginalCopy, on Sep 10 2008, 14:15, said:

2. oh no, not another distro-war - stim cu totii ca nu iese nimic constructiv :-) Eu personal folosesc ArchLinux, INSA cel mai bine e sa incerci cele mai folosite distributii (google: distrowatch) si sa decizi pentru tine ce ti-e bun.

Nope, fara distro/os wars, sunt ok toate, e doar o parere personala si un sfat pe care l-am primit si eu de la altii la inceput :P

Edited by florindinu, 10 September 2008 - 13:34.


#17
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

 florindinu, on Sep 10 2008, 13:34, said:

Dap.. in consola e ok, dar in php e buba, poti avea.. [vroiam sa scriu ceva dar poate asta e al doilea bug]
Nu e asta, nu are legatura cu fs-ul.

Hint: fluxul de date

#18
florindinu

florindinu

    Junior Member

  • Grup: Members
  • Posts: 177
  • Înscris: 22.03.2008

 OriginalCopy, on Sep 10 2008, 14:36, said:

Nu e asta, nu are legatura cu fs-ul.

Hint: fluxul de date

Ma gandeam, dar "better safe..".
Eu am rearanjat putin codul si am facut 3 modificari, 2 le-am vazut si la doriaal. Astept si eu raspunsul final, sunt curios daca le-am nimerit.

Mai sus vroiam sa zic chestia asta:
Problema cu functiile de genul asta si hard link-uri e ca poti avea link-uri recursive.. si atunci e nasol daca nu ai grija. Cred ca is_link() ar trebuii sa intoarca true si pentru hard link-uri (la mine nu face asta pentru un link cereat cu: ln test.txt link).

Anunturi

Second Opinion Second Opinion

Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale.

Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate