2010-01-29 16 views
5

Nos hemos encontrado con un problema grave con CF9 donde los valores de ciertas claves struct pueden ser referenciados por otras teclas, a pesar de que esas otras claves nunca se establezcan. Vea los siguientes ejemplos:Error en CF9: valores para las claves struct únicas referenciadas y sobreescritas por otras claves

Editar: Parece que no es solo algo que nuestros servidores comieron. Este es el ticket de bug de Adobe 81884: http://cfbugs.adobe.com/cfbugreport/flexbugui/cfbugtracker/main.html#bugId=81884.

Edit: Como se ha señalado, Adobe apagar la revisión: http://kb2.adobe.com/cps/825/cpsid_82547.html

El resumen de revisión observa que estaban comparando los valores hash de los nombres de variables en lugar del valor literal, para la velocidad. No sé cómo eso aceleraría algo, pero la posibilidad de colisiones de nombres (especialmente en nombres más cortos) debería haber sido obvia. Al menos fueron bastante rápidos de corregir.

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

Esto es obviamente un show-tapón completo para nosotros. Me gustaría saber si alguien ha encontrado esto o puede reproducir esto en su entorno. Para nosotros, ocurre el 100% del tiempo en Apache/CF9 corriendo en Linux, tanto RH4 como RH5. Estamos utilizando la instalación de JRun predeterminada en Java 1.6.0_14.

Para ver el alcance del problema, ejecutamos un bucle rápido para encontrar otras secuencias de nombres que se vean afectadas y encontramos cientos de coincidencias para los nombres de las teclas de 2 letras. Un bucle similar encontró más conflictos en nombres de 3 letras.

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

Y vuelva a editar: Esto no solo afecta a las claves de estructura, sino también a los nombres en el ámbito de las variables. Por lo menos el alcance variables que tiene la presencia de ánimo para lanzar un error, "no se puede cargar un nulo":

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

También debo señalar que este es también un problema para los nombres que contengan una subcadena que coincide con una secuencia incorrecta, por lo que "whatevernameAO" y "whatevernameB0" entran en conflicto de la misma manera. No puedo creer que hayamos comprado esto ... –

+0

¿Has archivado el error en adobe? http://cfbugs.adobe.com/cfbugreport/flexbugui/cfbugtracker/main.html – Henry

+0

Publiqué en alguna página de Adobe "error/lista de deseos", pero tenía una especie de aspecto de "nadie en casa". Uno de nosotros puede haber publicado en ese rastreador de fallas también, lo verificaré dos veces. ¿En qué entorno pudo reproducir esto? –

Respuesta

6

ACTUALIZACIÓN: revisión publicada:http://kb2.adobe.com/cps/825/cpsid_82547.html

Creo que sí, esto es una insecto, pero aquí es una solución de emergencia:

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

Dado que una estructura es un HashMap, todavía se puede utilizar todas las funciones de struct en la FQ

Mientras tanto, por favor presentar el fallo en: http://cfbugs.adobe.com/cfbugreport/flexbugui/cfbugtracker/main.html

+0

Gracias Henry. Sospeché que dejar caer a la capa Java podría funcionar, pero esperamos migrar algunos monstruos viejos de CF8 con una refactorización mínima. El informe de error es aquí: http://cfbugs.adobe.com/cfbugreport/flexbugui/cfbugtracker/main.html#bugId=81884 Cuando entré en que no me había dado cuenta de que alguien de Adobe recogió el informe que hice en algún otro formulario de ingreso y póngalo en el rastreador de errores. Entonces, en realidad hay 2 boletos que pueden fusionarse. –

+0

Confirmado. Esto funciona para mi. – johncblandii

+0

Simplemente curioso, ¿por qué Hashtable sobre Hashtable? – Leigh

0

Lo que encontré aún más peculiar es que esto funciona:

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

¿Qué tiene de peculiar? – Henry

+0

si las teclas son AO y B0, no funciona, pero AO & BO funcionan. Hubiera pensado que las claves que son más parecidas también causarían los problemas. –

Cuestiones relacionadas