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>
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 ... –
¿Has archivado el error en adobe? http://cfbugs.adobe.com/cfbugreport/flexbugui/cfbugtracker/main.html – Henry
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? –