Montag, 22. Juni 2009

PHP

SimpleXML-Bug in Verbindung mit Foreach

Ich denke ich habe einen Bug in PHP gefunden. Betroffen ist das SimpleXML-Modul in Verbindung mit foreach. Betroffen sind alle PHP-Version bis einschliesslich 5.2.10.

Der Bug schlägt zu, wenn man schreibend (Zeile 37) auf ein SimpleXML-Objekt in einer Foreach-Schleife zugreift. In dem Moment scheint es den internen Zähler des Iterators zu verstellen. Das Resultat ist eine Endlosschleife. Das Foreach-Konstrukt kann nicht mehr verlassen werden.

Das Problem tritt nicht auf, wenn man dies in einer For-Schleife macht.

Update: Ich habe ein Bug-Report verfasst.

Der PHP-Code, welcher den Fehler reproduziert, sieht folgendermaßen aus und wurde mit den PHP-Version: 5.2.6 (win), 5.2.9 (win) und 5.2.9-0.dotdeb.2 (lin) getestet:

Download Code!

  1. <?php
  2. error_reporting(E_ALL);
  3. $xmlData = <<<HERE
  4. <root>
  5.   <child>
  6.     <name>A child</name>
  7.     <info>
  8.       <version>1</version>
  9.     </info>
  10.   </child>
  11.   <child>
  12.     <name>B child</name>
  13.     <info>
  14.       <version>2</version>
  15.     </info>
  16.   </child>
  17.   <child>
  18.     <name>C child</name>
  19.     <info>
  20.       <version>2</version>
  21.     </info>
  22.   </child>
  23.   <child>
  24.     <name>D child</name>
  25.     <info>
  26.       <version>3</version>
  27.     </info>
  28.   </child>
  29. </root>
  30. HERE;
  31.  
  32. $xml = simplexml_load_string($xmlData);
  33. $i = -1;
  34. foreach ($xml as $xi => $child) {
  35.     ++$i;
  36.     echo 'I: '.$i.' Xi: '.$xi.' Count : '.count($xml).' '.$xml->child[$i]->name.' => '.$child->name.' v:'.$child->info->version."\n";
  37.     $xml->child[$i]->info->version = rand(1,9);
  38.     if($i > 10) {
  39.         echo "Too many iterations";
  40.         break;
  41.     }
  42. }
  43.  
  44. $xml = simplexml_load_string($xmlData);
  45. for($i = 0, $size = count($xml); $i < $size; ++$i) {
  46.     echo 'I: '.$i.' Count : '.count($xml).' '.$xml->child[$i]->name."\n";
  47.     $xml->child[$i]->info->version = rand(1,9);
  48.     if($i > 10) {
  49.         echo "Too many iterations";
  50.         break;
  51.     }
  52. }
  53. ?>

Ausgabe:

I: 0 Xi: child Count : 4 A child => A child v:1
I: 1 Xi: child Count : 4 B child => B child v:2
I: 2 Xi: child Count : 4 C child => B child v:6
I: 3 Xi: child Count : 4 D child => B child v:6
Notice:  Trying to get property of non-object in simplexmlbug.php on line 36
I: 4 Xi: child Count : 4 => B child v:6 Notice: Trying to get property of non-object in simplexmlbug.php on line 36
I: 5 Xi: child Count : 5 => B child v:6 Notice: Trying to get property of non-object in simplexmlbug.php on line 36
I: 6 Xi: child Count : 6 => B child v:6 Notice: Trying to get property of non-object in simplexmlbug.php on line 36
I: 7 Xi: child Count : 7 => B child v:6 Notice: Trying to get property of non-object in simplexmlbug.php on line 36
I: 8 Xi: child Count : 8 => B child v:6 Notice: Trying to get property of non-object in simplexmlbug.php on line 36
I: 9 Xi: child Count : 9 => B child v:6 Notice: Trying to get property of non-object in simplexmlbug.php on line 36
I: 10 Xi: child Count : 10 => B child v:6 Notice: Trying to get property of non-object in simplexmlbug.php on line 36
I: 11 Xi: child Count : 11 => B child v:6 Too many iterationsI: 0 Count : 4 A child I: 1 Count : 4 B child I: 2 Count : 4 C child I: 3 Count : 4 D child
Bewertung: keine, 0 Stimme(n) 368 Klicks
Bug, PHP
Von Mr.Foo in PHP am 22.06.09@16:36 Uhr

Trackbacks
Trackback für spezifische URI dieses Eintrags

Keine Trackbacks

0 Kommentare
Ansicht der Kommentare: (Linear | Verschachtelt)

Noch keine Kommentare


Kommentar schreiben

Umschließende Sterne heben ein Wort hervor (*wort*), per _wort_ kann ein Wort unterstrichen werden.
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
Die angegebene E-Mail-Adresse wird nicht dargestellt, sondern nur für eventuelle Benachrichtigungen verwendet.
Sie können [geshi lang=LANG][/lang] Tags verwenden um Quellcode abhängig von der gewählten Programmiersprache einzubinden
 
 

Mr. Foo

SimpleXML-Bug in Verbindung mit Foreach

  • Homepage

Suche

Kategorien

  • C-Sharp (4)
  • Datenbank (28)
  • Delphi (2)
  • Entwicklung (36)
  • Flash (5)
  • Games (10)
  • Gutscheine (4)
  • Hardware (14)
  • HTML CSS (15)
  • Internet (87)
  • Java (32)
  • Javascript (24)
  • Linkdump (9)
  • Linux (96)
  • Low-Level (10)
  • Lua (8)
  • Musik (9)
  • Netzwerk (25)
  • New World Order (109)
  • Perl (3)
  • PHP (123)
  • Magento (5)
  • Symfony (3)
  • Zend Framework (7)
  • Probleme und Lösungen (26)
  • Python (22)
  • Ressourcen (23)
  • Sicherheit (91)
  • Software (58)
  • Sonstiges (45)
  • Own Stuff (46)
  • Spass (45)
  • Technik / Wissenschaft (4)
  • Tips (15)
  • Weisheiten (16)
  • Windows (23)
  • Wort des Tages (15)


Alle Kategorien

Archive

  • Februar 2012
  • Januar 2012
  • Dezember 2011
  • Das Neueste ...
  • Älteres ...

Abonnieren lohnt sich!

  • XML RSS 2.0 feed
  • ATOM/XML ATOM 1.0 feed
  • XML RSS 2.0 Kommentare

Tagcloud

Datenbank Entwicklung Internet Java Javascript Linux Lösung Netzwerk News New World Order PHP Problem Probleme und Lösungen Python Sicherheit Software Sonstiges Spass Tipp Update

Beliebte Einträge

  • Magento ist scheisse (188)
  • Plugin-container.exe deaktivieren (101)
  • C compiler cannot create executables unter Debian (53)
  • BWin Betrug und Abzocke bei Minigames? (49)
  • Scheiss Linux - USB-Platte viel zu langsam (wenns mal funktioniert) (41)
  • Sicheres Kontaktformular mit PHP - Spam verhindern (37)
  • Es konnte keine TCP/IP-Verbindung mit dem Host hergestellt werden (26)
  • UML-Diagramme aus Java-Klassen generieren – Java2UML (25)
  • Option Bug im Internet Explorer bei Nutzung von innerHTML und Javascript (24)
  • Zend Studio - Javaw.exe lastet die CPU aus (24)

Kommentare

sandi zu Plugin-container.exe deaktivieren
Mo, 06.02.2012 11:10
Leider hat es nicht geklappt. Jetz [...]
Frank zu Magento ist scheisse
So, 05.02.2012 21:58
Seit etwa 6 Monaten bin ich auf de [...]
hansie zu Canon Blink Codes
Sa, 04.02.2012 19:49
Hallo, mein Canon Drucker MP 630 [...]
Bachsau zu Scheiss Linux - USB-Platte viel zu langsam (wenns mal funktioniert)
Mi, 01.02.2012 22:54
Bei Linux machen die Kernel-Entwic [...]
Mr. Foo zu Scheiss Linux - USB-Platte viel zu langsam (wenns mal funktioniert)
Mi, 01.02.2012 21:47
Also so kurz mal probiert hab ich [...]
 

Kontakt/Informationen