¿Cuál es el código C ++ más corto y bien formado que exhibe un comportamiento indefinido?
¿Cuál es el código C ++ más corto y bien formado que exhibe un comportamiento indefinido?
Respuestas:
int main(){main;}
3.6.1 Función principal [basic.start.main]
3 - [...] La función main no se utilizará dentro de un programa.
Editar: esto es diagnosticable, así que no UB.
int main(){for(;;);}
1.10 Ejecuciones multiproceso y carreras de datos [intro.multithread]
24 - La implementación puede suponer que cualquier subproceso finalmente realizará una de las siguientes acciones: - finalizar, - realizar una llamada a una función de E / S de la biblioteca, - acceder o modificar un objeto volátil, o - realizar una operación de sincronización o una operación atómica .
int main(){int i=i;}
4.1 Conversión Lvalue-to-rvalue [conv.lval]
1 - [...] Si el objeto al que se refiere el valor gl no está [...] inicializado, un programa que necesita esta conversión tiene un comportamiento indefinido.
//^L.
Aquí ^L
está el carácter de fuente de formulario, que es parte del conjunto de caracteres básico. 4 caracteres (no se requiere una nueva línea por 2.2: 2). El comportamiento indefinido es por
2.8 Comentarios [lex.comment]
1 - Si hay un formulario de alimentación o un carácter de tabulación vertical en el
//
comentario [a- style], solo aparecerán caracteres de espacio en blanco entre este y la nueva línea que termina el comentario; No se requiere diagnóstico.
\u\
0000
Tiene ocho caracteres y tiene un comportamiento indefinido, según §2.2 / 1.
Cada instancia de un carácter de barra diagonal inversa (
\
) seguida inmediatamente por un carácter de nueva línea se elimina, uniendo líneas de origen físicas para formar líneas de origen lógicas. Solo la última barra diagonal inversa en cualquier línea de fuente física será elegible para formar parte de dicho empalme. Si, como resultado, se produce una secuencia de caracteres que coincide con la sintaxis de un nombre de carácter universal, el comportamiento es indefinido.
main
.
main
. Es difícil hacer cumplir las reglas cuando solicitas un programa que no tiene reglas que seguir (¡eso es lo que significa UB!).
main
lo que tienes está mal formado.
#include. /*Imagine a new-line right after the dot*/
§16.2 / 4:
Una directiva de preprocesamiento del formulario
#include
pp-tokens nueva línea(que no coincide con una de las dos formas anteriores) está permitido. [..] Si la directiva resultante después de todos los reemplazos no coincide con una de las dos formas anteriores, el comportamiento es indefinido.
int main(){int i=1>>-1;}
Explicación:
C ++ 98 y C ++ 11 §5.8 / 1 afirman que
El comportamiento es indefinido si el operando derecho es negativo, o mayor o igual que la longitud en bits del operando izquierdo promovido.
int
típicamente de 32? cambiar el RHS del cambio a -1
es el mismo número de caracteres y no dependerá de los tamaños de los números enteros
Si uno debe creer en Wikipedia, aquí hay algunos:
Se dice que modificar cadenas provoca un comportamiento indefinido. Siempre me ha funcionado.
int main(int c,char*v){v[0]='.';}
Una función no nula sin retorno produce valores de retorno indefinidos.
int a(){}
int main(){return a();}
La división (de int?) Por cero está supuestamente indefinida. Todo lo que sé es que se bloquea.
int main(int c){c/0;}
int main(){}
mínimo.
char **
no char *
. Simplemente está modificando parte de un valor de puntero. De hecho, argv
se garantiza que se puede modificar de forma segura.
char *argv[]
no tener ningún const
calificador. Podría bloquearse escribiendo en un literal de cadena conint main(){char *v="";*v=1;}