FireFox и наркотики
От: мыщъх США http://nezumi-lab.org
Дата: 14.12.10 20:12
Оценка: :)
...что они там курят?! и главное в каких количествах? только что столкнулся с очередной странностью горящего лиса, заставившей меня ругаться матом. а все начиналось так спокойно. зима, солнышко светит, тучки передвигаются как рыбки в аквариуме, сижу, никого не трогаю, пью чай и пишу распаковщик жаба-скриптов.

распаковываю очередной скрипт, а он не распаковывается ни фига совершенно. начинаю разбираться и минут через полчаса понимаю, что весь затык происходит из-за того, что следующий цикл не исполняется (а должен!): for(a=0;a<s[~[]];a++), где s — расшифровываемая строка. под Google v8 цикл исполняется 0 итераций.

включаю мозги. ~[] равно -1 (мину одному), следовательно, хакерский код пытается сделать следующее: for(a=0;a<"hello"[-1];a++). очевидно (по виду цикла), что "hello"[-1] предполагает возвратить длину строки. мелькает догадка, что длина строки хранится в a-ля Pascal формате и перед строкой идет ее размер, находящийся по смещению -1. но это же маразм!!!

а вот и не маразм. пишу print("hello"[-1]), запускаю под SpiderMonkey (фоксовый скриптовый движок) и вижу, что он мне выводит 5. то есть длину. а вот движок от гугла такого не выводит, ибо не должен (по стандарту).

разбираю скрипт дальше. вижу клевую конструкцию. /[\/]/[~[]][~[]]; слегка офигеваю и с пришибленным видом ввожу ее в SpiderMonkey. получаю 4. как четыре, почему четыре? приводу конструкцию к виду /[\/]/[~[]][~[]] --> /[\/]/[-1][-1] --> /[\/]/[-1]. теперь получаю строку '[\/]'. ага, понятно, раз /[\/]/[-1] это строка, то следующий [-1] это ее длина.

оказывается, что /.../[-1] у фокса тоже самое, что и /.../.source, т.е. исходная строка регулярного выражения.

экспериментирую дальше. print(function (){}[-1]) под лисом говорит null, и undefined под гуглом.


var x = new Object; x[-1] = "hello"; print(x[-1]); работает под обоими движками (x[-1] возвращает строку), а вот следующий код уже ни хвоста не работает: x = "1-2-3"; x[-1]=0; print(x[-1]). в том смысле, что под гуглом x[-1] возвращает undefined, а под лисом — 5, т.е. длину строки поменять не удалось.

интересно, что же они все-таки курят?
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.