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

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

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

Править: Как был указан, Adobe произвел фиксацию: http://kb2.adobe.com/cps/825/cpsid_82547.html

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





The following should throw an error. Instead both keys refer to the same value.

Struct a:
a.AO: #a.AO#
a.B0: #a.B0#
The following should show a struct with 2 distinct keys and values. Instead it contains a single key, "AO", with a value of "bar".
Struct b:

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

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

Testing a range of affected key combinations. This found hundreds of cases on our platform. Aborting after 50 here.

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 ("
#symbolwhole# = #innersymbolwhole#"); if (matchesfound++ > 50) { // we've seen enough abort; } } } } } }

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




test_b0: #test_b0#

test_ao: #test_ao#

5
задан Gin Doe 24 March 2010 в 01:23
поделиться

2 ответа

Обновление: Explate: http: // kb2. Adobe.com/cps/825/cpsid_82547.html

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

<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/follectbugui/cfbugtracker/main.html

6
ответ дан 14 December 2019 в 13:36
поделиться

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

<cfset b = { AO = "foo", BO = "bar"} />
0
ответ дан 14 December 2019 в 13:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: