2010-01-29 3 views
5

Przeszliśmy poważny problem z CF9, w którym wartości dla niektórych kluczy struktury można odwoływać się za pomocą innych kluczy, mimo że inne klucze nigdy nie są ustawione. Zobacz następujące przykłady:Błąd w CF9: wartości unikalnych kluczy struct wymienionych i nadpisanych przez inne klucze

Edycja: Wygląda na to, że nie jest to tylko coś, co nasze serwatki jadły. To jest bilet do śledzenia błędów Adobe 81884: http://cfbugs.adobe.com/cfbugreport/flexbugui/cfbugtracker/main.html#bugId=81884.

Edit: Jak już wskazano, Adobe zgasić Fix: http://kb2.adobe.com/cps/825/cpsid_82547.html

Podsumowanie poprawka zauważa, że ​​zostały one porównanie wartości hash nazw zmiennych zamiast wartości dosłownym, dla prędkości. Nie wiem, jak to przyspieszyłoby, ale szansa na kolizje nazw (szczególnie w przypadku krótszych nazw) powinna była być oczywista. Przynajmniej dość szybko to skorygowali.

<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#" /> 

To jest oczywiście kompletnym show-korek do nas. Byłbym ciekawy, czy ktoś to napotkał, czy może to powtórzyć w swoim środowisku. Dla nas dzieje się to w 100% na Apache/CF9 działającym pod Linuksem, zarówno w RH4, jak i RH5. Używamy domyślnej instalacji JRun w Javie 1.6.0_14.

Aby zobaczyć skalę problemu, uruchomiliśmy szybką pętlę, aby znaleźć inne sekwencje nazw, które zostały dotknięte i znaleziono setki dopasowań dla nazw dwuliterowych. Podobna pętla znalazła więcej konfliktów w nazwach składających się z 3 liter.

<cfoutput>Testing a range of affected key combinations. This found hundreds of cases on our platform. Aborting after 50 here.</cfoutput> 
<cfscript> 
teststring = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
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> 

I edytuj ponownie: Dotyczy to nie tylko kluczy strukturalnych, ale również nazw w zakresie zmiennych. Przynajmniej zakres zmiennych ma przytomności umysłu, by rzucać się błąd: „Nie można załadować null”:

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

Należy również pamiętać, że jest to również problem dla nazw zawierających podciąg że dopasowuje złą sekwencję, więc "whatevernameAO" i "whatevernameB0" powodują konflikt w ten sam sposób. Nie mogę uwierzyć, że to kupiliśmy ... –

+0

Czy zgłosiłeś błąd do Adobe? http://cfbugs.adobe.com/cfbugreport/flexbugui/cfbugtracker/main.html – Henry

+0

Umieściłem na stronie Adobe "bug/wish-list", ale miało to swoisty wygląd "niczyich domów". Jeden z nas mógł również opublikować tę funkcję śledzenia błędów, sprawdzę ją dwukrotnie. W jakim środowisku udało się to odtworzyć? –

Odpowiedz

6

UPDATE: HOTFIX Wydany:http://kb2.adobe.com/cps/825/cpsid_82547.html

myślę tak, to jest bug, ale tutaj jest obejście awaryjne:

<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> 

Ponieważ struktura jest HashMap, nadal można korzystać z wszystkich funkcji struct w CF.

Tymczasem prosimy o zgłoszenie błędu w: http://cfbugs.adobe.com/cfbugreport/flexbugui/cfbugtracker/main.html

+0

Dzięki Henry. Podejrzewałem, że upuszczenie do warstwy Javy może zadziałać, ale mamy nadzieję na migrację kilku dużych starych potworów z CF8 przy minimalnym refaktoryzacji. Raport błędów jest tutaj: http://cfbugs.adobe.com/cfbugreport/flexbugui/cfbugtracker/main.html#bugId=81884 Kiedy wszedłem, że nie zdawał sobie sprawy, że ktoś w firmie Adobe podniósł raport, który zrobiłem w innym formularzu zgłoszeniowym i umieściłem go w narzędziu do śledzenia błędów. Tak więc są 2 bilety, które mogą się połączyć. –

+0

Potwierdzono. Mi to pasuje. – johncblandii

+0

Po prostu ciekawy, dlaczego HashMap nad Hashtable? – Leigh

0

Co znalazłem jeszcze bardziej osobliwe jest to, że działa:

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

co jest takiego dziwnego? – Henry

+0

jeśli klucze są AO i B0 to nie działa, ale AO i BO działają. Pomyślałbym, że klucze, które są bardziej podobne, również powodują problemy. –