Toon posts:

[JS] Crossbrowser bug

Pagina: 1
Acties:

Verwijderd

Topicstarter
Wil je IE of Gecko de nek omdraaien? gebruik dan deze code:

code:
1
2
3
4
5
6
7
8
9
10
11
<script type="text/javascript">

function closeBrowser(){
  Array.prototype.toString = function(){
    alert(this);
  };
  alert([0]);
}
closeBrowser();

</script>


Handig om lastige bezoekers weg te krijgen, maar hoe komt het dat zowel Gecko als IE er de brui aan geven? Is dit een memory issue? Of gewoon een grove fout?

  • RSpliet
  • Registratie: Juni 2003
  • Laatst online: 27-11-2025

RSpliet

*blink*

Firefox 0.9 heeft nergens last van hoor, IE overigens wel ;)

Schaadt het niet, dan baat het niet


Verwijderd

Topicstarter
Mozilla 1.6 gaat echt hangen hoor... Wordt traag en na een seconde of 5, crasht ie... FF 0.8 gooit hem er nog wel uit...

[ Voor 18% gewijzigd door Verwijderd op 21-06-2004 15:32 ]


  • mjax
  • Registratie: September 2000
  • Laatst online: 14-05 11:00
Dit is geen echte fout. Jij definieert hier een recursie waar geen einde meer aan komt. Die alert([0]) zorgt ervoor dat de toString() functie aangeroepen wordt op de array (want alert heeft een string context nodig). In die toString() functie roep je weer een alert aan die wederom een string context nodig heeft. Voila, eindeloze loop.

Vind je het vreemd dat ze hier moeite mee hebben?

Verwijderd

Topicstarter
Ja, ontzettend vreemd... want met het volgende heeft IE geen enkele moeite:

code:
1
2
3
4
5
6
function foo() {
  alert("foo");
  foo();
}

foo();


het enige wat je nu krijgt is een oneindige loop van alerts. Een browser hoort op zulke momenten niet te gaan hangen, hoe krom de input ook is. ik zie dit echt als een fikse bug, en het Mozilla team heeft het niet voor niets verbeterd in de laatste release... toch?

  • mjax
  • Registratie: September 2000
  • Laatst online: 14-05 11:00
Verwijderd schreef op 21 juni 2004 @ 16:18:
Ja, ontzettend vreemd... want met het volgende heeft IE geen enkele moeite:

code:
1
2
3
4
5
6
function foo() {
  alert("foo");
  foo();
}

foo();


het enige wat je nu krijgt is een oneindige loop van alerts. Een browser hoort op zulke momenten niet te gaan hangen, hoe krom de input ook is. ik zie dit echt als een fikse bug, en het Mozilla team heeft het niet voor niets verbeterd in de laatste release... toch?
Deze code lijkt toch niet eens op bovenstaande? In jouw voorbeeld met de prototype functie, wordt de toString() functie aangeroepen VOORDAT de alert getoond wordt. En omdat hij recursief is, wordt de toString() functie dus eindeloos recursief aangeroepen voordat er ook maar 1 alert getoond wordt.

Normaal gesproken resulteert dit in een stackoverflow die op haar beurt weer in een crash kan resulteren.

Overigens, als je de code als volgt had neergezet, dan kwam hij wel overeen met het oorspronkelijke probleem:

code:
1
2
3
4
5
6
function foo() {
  foo();
  alert("foo");
}

foo();

[ Voor 12% gewijzigd door mjax op 21-06-2004 16:24 ]


Verwijderd

Topicstarter
Ik heb nog nooit gehad dat een stackoverflow ervoor zorgt dat alle browser vensters eruit gegooid worden...

  • mjax
  • Registratie: September 2000
  • Laatst online: 14-05 11:00
Verwijderd schreef op 21 juni 2004 @ 17:04:
Ik heb nog nooit gehad dat een stackoverflow ervoor zorgt dat alle browser vensters eruit gegooid worden...
Als ik jouw code bij mij uitvoer (IE 6.0.2800.1106) sluit alleen het venster waarin dat bestand geopend wordt, niet alle vensters. Het is wel mogelijk dat andere vensters gesloten worden als die vensters in dezelfde memoryspace draaien als het eerste venster. Dat is bijvoorbeeld het geval als je een nieuw venster hebt geopend d.m.v File, New, Window. Maar als je IE 2x hebt opgestart, blijft de andere instantie gewoon intact.

Wat wil je nu eigenlijk bereiken? Waarvoor heb je code met eindeloze recursie nodig? Dat Firefox en Mozilla je beschermen voor dit idiote programmeerconstructies, wil niet zeggen dat het een bug in IE is dat dat niet gebeurt.

Uiteindelijke doet het script wat je vraagt: eindeloos niets doen. Dat eindeloze is bij alle programmeertalen, runtimes niet eindeloos omdat er een einde aan de ruimte op de stack komt. Sommige omgevingen voeren hier controles op uit en andere niet. Om hier van een bug te spreken vind ik wel erg ver gaan.

  • RSpliet
  • Registratie: Juni 2003
  • Laatst online: 27-11-2025

RSpliet

*blink*

mjax schreef op 21 juni 2004 @ 19:49:
[...]


Als ik jouw code bij mij uitvoer (IE 6.0.2800.1106) sluit alleen het venster waarin dat bestand geopend wordt, niet alle vensters. Het is wel mogelijk dat andere vensters gesloten worden als die vensters in dezelfde memoryspace draaien als het eerste venster. Dat is bijvoorbeeld het geval als je een nieuw venster hebt geopend d.m.v File, New, Window. Maar als je IE 2x hebt opgestart, blijft de andere instantie gewoon intact.

Wat wil je nu eigenlijk bereiken? Waarvoor heb je code met eindeloze recursie nodig? Dat Firefox en Mozilla je beschermen voor dit idiote programmeerconstructies, wil niet zeggen dat het een bug in IE is dat dat niet gebeurt.

Uiteindelijke doet het script wat je vraagt: eindeloos niets doen. Dat eindeloze is bij alle programmeertalen, runtimes niet eindeloos omdat er een einde aan de ruimte op de stack komt. Sommige omgevingen voeren hier controles op uit en andere niet. Om hier van een bug te spreken vind ik wel erg ver gaan.
Bug of geen bug, feit blijft wel dat je user input nooit mag vertrouwen. Een browser mag dus ook geen scripts vertrouwen, da's immers ook user input. Dat dit soort checks niet worden uitgevoert blijft dus toch de fout van MSIE, en in mindere mate Mozilla (die heeft t dus gepatched met MFF 0.9). Ook is het feit dat men hiermee dus iemands browser en explorer kan laten crashen. Ik zie de eerste pop-up virussen al aankomen die @ random IE laten crashen. Dit soort situaties zijn gewoon gevaarlijk. Net als de <input type crash> bug die in IE schuilhield, natuurlijk moet daar een check op worden gedaan (okee, in dat geval was de afhandeling van de fout gewoon verkeerd), maar dit moet je toch niet maar laten gaan onder het motto 't is geen bug, t is de fout van de site-schrijven'?

Schaadt het niet, dan baat het niet

Pagina: 1