me gustaría distinguir tres tipos diferentes de conflicto desde un sistema de control de versiones (VCS):Mejor y más simple ejemplo de 'conflicto semántico'?
- Pruebas
- sintáctica
- semántica
Un Pruebas conflicto es uno que es detectado por el proceso de fusión o actualización. Esto es marcado por el sistema. Un compromiso del resultado no está permitido por el VCS hasta que se resuelva el conflicto.
A syntactic conflicto no está marcado por el VCS, pero el resultado no se compilará. Por lo tanto, esto también debería ser recogido incluso por un programador ligeramente cuidadoso. (Un ejemplo sencillo podría ser una variable de cambiar el nombre por izquierda y algunas líneas añadidas utilizando esa variable por derecho. La fusión tendrá probablemente un símbolo sin resolver. Por otra parte, esto podría introducir un semántica conflicto al escondite variable.)
Finalmente, el conflicto semántico no está marcado por el VCS, el resultado se compila, pero el código puede tener problemas al ejecutarse. En casos leves, se producen resultados incorrectos. En casos severos, un choque podría ser introducido. Incluso estos deben ser detectados antes de la confirmación por un programador muy cuidadoso, a través de la revisión del código o la prueba unitaria.
Mi ejemplo de un conflicto semántico utiliza SVN (Subversion) y C++, pero esas elecciones no son realmente relevantes para la esencia de la pregunta.
El código base es:
int i = 0;
int odds = 0;
while (i < 10)
{
if ((i & 1) != 0)
{
odds *= 10;
odds += i;
}
// next
++ i;
}
assert (odds == 13579)
La Izquierda (L
) y derecho (R
) cambios son los siguientes.
izquierda 's 'optimización'(cambiando los valores de la variable de bucle de toma):
int i = 1; // L
int odds = 0;
while (i < 10)
{
if ((i & 1) != 0)
{
odds *= 10;
odds += i;
}
// next
i += 2; // L
}
assert (odds == 13579)
derecho' s 'optimización' (cambio de cómo se utiliza la variable de bucle):
int i = 0;
int odds = 0;
while (i < 5) // R
{
odds *= 10;
odds += 2 * i + 1; // R
// next
++ i;
}
assert (odds == 13579)
Esto es el resultado de una fusión o actualización, y no es detectado por SVN (que es el comportamiento correcto para el VCS), por lo que no es un conflicto de texto. Tenga en cuenta que se compila, por lo que no es un conflicto sintáctico.
int i = 1; // L
int odds = 0;
while (i < 5) // R
{
odds *= 10;
odds += 2 * i + 1; // R
// next
i += 2; // L
}
assert (odds == 13579)
El assert
falla porque es odds
37.
Así que mi pregunta es la siguiente. ¿Hay un ejemplo más simple que esto? ¿Hay un ejemplo simple donde el ejecutable compilado tiene un nuevo bloqueo?
Como una pregunta secundaria, ¿hay casos de esto que haya encontrado en el código real? De nuevo, ejemplos simples son especialmente bienvenidos.
Esto no es particularmente relevante para C++, por lo que han eliminado esa etiqueta. Y para ser sincero, no entiendo la pregunta y no veo qué tiene que ver con el control de versiones. –
rhubbarb probablemente quiere escuchar las experiencias de otras personas con respecto a estos cambios inadvertidos en la semántica, por lo que podría crear algún tipo de lista de verificación de cosas a tener en cuenta al fusionar el código. Podría llegar a ser un tema interesante si ese es, de hecho, lo que es el punto. –
@Tomislav: sí, esa es una de las razones. @Neil: acepto la eliminación de la etiqueta C++; mi error. Por otro lado, esto tiene * todo * que ver con el control de versiones. Las operaciones de fusión son fundamentales para VCS, y también es importante conocer las formas en que estos sistemas tan útiles pueden ocasionalmente tener resultados inesperados. – Rhubbarb