Ошибка в CF9: значения уникальных структурных ключей, на которые ссылаются и перезаписывают другие ключи - PullRequest
5 голосов
/ 29 января 2010

Мы столкнулись с серьезной проблемой с CF9, когда на значения для определенных ключей структуры могут ссылаться другие ключи, несмотря на то, что эти другие ключи никогда не устанавливаются.Смотрите следующие примеры:

Редактировать: Похоже, что это не просто то, что съели наши серверы.Это билет Adobe для отслеживания ошибок 81884: http://cfbugs.adobe.com/cfbugreport/flexbugui/cfbugtracker/main.html#bugId=81884.

Редактировать: Как уже отмечалось, Adobe выпустила исправление: http://kb2.adobe.com/cps/825/cpsid_82547.html

Сводка исправлений, в которых они сравнивалихеш-значения имен переменных вместо литерального значения для скорости.Я не знаю, как это могло бы что-то ускорить, но вероятность столкновения имен (особенно на более коротких именах) должна была быть очевидной.По крайней мере, их было достаточно быстро исправить.

<cfset a = { AO = "foo" } />
<cfset b = { AO = "foo", B0 = "bar" } />

<cfoutput>
The following should throw an error. Instead both keys refer to the same value.
<br />Struct a: <cfdump var="#a#" />
<br />a.AO: #a.AO#
<br />a.B0: #a.B0#
<hr />
The following should show a struct with 2 distinct keys and values. Instead it contains a single key, "AO", with a value of "bar".
<br />Struct b: <cfdump var="#b#" />

Это, очевидно, полная остановка для нас.Мне было бы интересно узнать, сталкивался ли кто-нибудь с этим или может воспроизвести это в своей среде.Для нас это происходит в 100% случаев на Apache / CF9, работающем в Linux, как RH4, так и RH5.Мы используем стандартную установку JRun на Java 1.6.0_14.

Чтобы увидеть масштаб проблемы, мы запустили быстрый цикл, чтобы найти другие последовательности именования, на которые влияют, и нашли сотни совпадений для двухбуквенного ключа.имена.Аналогичный цикл обнаружил больше конфликтов в трехбуквенных именах.

<cfoutput>Testing a range of affected key combinations. This found hundreds of cases on our platform. Aborting after 50 here.</cfoutput>
<cfscript>
teststring = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
stringlen = len(teststring);
matchesfound = 0;
matches = "";

for (i1 = 1; i1 <= stringlen; i1++) {
    symbol1 = mid(teststring, i1, 1);
    for (i2 = 1; i2 <= stringlen; i2++) {
        teststruct = structnew();
        symbol2 = mid(teststring, i2, 1);
        symbolwhole = symbol1 & symbol2;
        teststruct[ symbolwhole ] = "a string";

        for (q1 = 1; q1 <= stringlen; q1++) {
            innersymbol1 = mid(teststring, q1, 1);
            for (q2 = 1; q2 <= stringlen; q2++) {
                innersymbol2 = mid(teststring, q2, 1);
                innersymbolwhole = innersymbol1 & innersymbol2;
                if ((i1 != q1 || i2 != q2) && structkeyexists(teststruct, innersymbolwhole)) {
                    // another affected pair of keys!
                    writeoutput ("<br />#symbolwhole# = #innersymbolwhole#");
                    if (matchesfound++ > 50) {
                        // we've seen enough
                        abort;
                    }
                }
            }
        }
    }
}
</cfscript>

И снова отредактируйте: это влияет не только на структурные ключи, но и на имена в области видимости переменных.По крайней мере, у области видимости переменных есть разум, чтобы выдать ошибку, "не может загрузить ноль":

<cfset test_b0 = "foo" />
<cfset test_ao = "bar" />
<cfoutput>
test_b0: #test_b0#
<br />test_ao: #test_ao#
</cfoutput>

Ответы [ 2 ]

6 голосов
/ 29 января 2010

ОБНОВЛЕНИЕ: ВЫПУСК HOTFIX: http://kb2.adobe.com/cps/825/cpsid_82547.html

Я думаю, да, это ошибка, но вот аварийный обходной путь:

<cfset a = createObject("java", "java.util.HashMap").init()>
<cfset structInsert(a, "AO", "foo") />

<cfset b = createObject("java", "java.util.HashMap").init()>
<cfset structInsert(b,"AO", "foo") />
<cfset structInsert(b,"B0", "bar") />

<cfoutput>
The following should throw an error. Instead both keys refer to the same value.
<br />Struct a: <cfdump var="#a#" />
<br />a.AO: #a.AO#
<br />a.B0: #a.B0#
<hr />

The following should show a struct with 2 distinct keys and values. Instead it contains a single key, "AO", with a value of "bar".
<br />Struct b: <cfdump var="#b#" />
</cfoutput>

Поскольку структура является HashMap, вы все равно можете использовать все функции структуры в CF.

Тем временем, пожалуйста, сообщите об ошибке по адресу: http://cfbugs.adobe.com/cfbugreport/flexbugui/cfbugtracker/main.html

0 голосов
/ 29 января 2010

Что я нашел еще более странным, так это то, что это работает:

<cfset b = { AO = "foo", BO = "bar"} />
...