Qual é o código C ++ mais curto e bem formado que exibe comportamento indefinido?
Qual é o código C ++ mais curto e bem formado que exibe comportamento indefinido?
Respostas:
int main(){main;}
3.6.1 Função principal [basic.start.main]
3 - [...] A função main não deve ser usada dentro de um programa.
Edit: isso é diagnosticável, então não UB.
int main(){for(;;);}
1.10 Execuções multithread e corridas de dados [intro.multithread]
24 - A implementação pode assumir que qualquer encadeamento acabará executando um dos seguintes procedimentos: - finalize, - faça uma chamada para uma função de E / S da biblioteca, - acesse ou modifique um objeto volátil, ou - execute uma operação de sincronização ou operação atômica .
int main(){int i=i;}
4.1 Conversão de valor em valor [conv.lval]
1 - [...] Se o objeto ao qual o glvalue se refere não for [...] inicializado, um programa que necessite dessa conversão terá um comportamento indefinido.
//^L.
Aqui ^L
está o caractere de feed de formulário, que faz parte do conjunto de caracteres básico. 4 caracteres (uma nova linha não é necessária por 2.2: 2). O comportamento indefinido é por
2.8 Comentários [lex.comment]
1 - Se houver um feed de formulário ou um caractere de tabulação vertical no comentário [a-
//
style], somente caracteres de espaço em branco aparecerão entre ele e a nova linha que termina o comentário; nenhum diagnóstico é necessário.
\u\
0000
Possui oito caracteres e comportamento indefinido, de acordo com o §2.2 / 1.
Cada instância de um caractere de barra invertida (
\
) imediatamente seguida por um caractere de nova linha é excluída, emendando as linhas de origem físicas para formar linhas de origem lógicas. Somente a última barra invertida em qualquer linha de origem física será elegível para fazer parte dessa emenda. Se, como resultado, uma sequência de caracteres que corresponde à sintaxe de um nome universal de caractere for produzida, o comportamento será indefinido.
main
.
main
. É difícil impor regras quando você solicita um programa que não tem nenhuma regra a seguir (é isso que UB significa!).
main
, o que você tem é mal formado.
#include. /*Imagine a new-line right after the dot*/
§16.2 / 4:
Uma diretiva de pré-processamento do formulário
#include
nova linha de tokens pp(que não corresponde a uma das duas formas anteriores) é permitido. [..] Se a diretiva resultante após todas as substituições não corresponder a uma das duas formas anteriores, o comportamento será indefinido.
int main(){int i=1>>-1;}
Explicação:
C ++ 98 e C ++ 11 §5.8 / 1 afirmam que
O comportamento é indefinido se o operando direito for negativo ou maior ou igual ao comprimento em bits do operando esquerdo promovido.
int
normalmente não é de 32? mudando o RHS da mudança para -1
o mesmo número de caracteres e não dependerá de tamanhos inteiros
Se alguém acreditar na wikipedia, aqui estão alguns:
Diz-se que modificar cadeias causa um comportamento indefinido. Sempre funcionou para mim.
int main(int c,char*v){v[0]='.';}
Uma função não nula sem retorno causa valores de retorno indefinidos.
int a(){}
int main(){return a();}
A divisão (de int?) Por zero é supostamente indefinida. Tudo o que sei é que ele trava.
int main(int c){c/0;}
int main(){}
no mínimo.
char **
não deve ser char *
. Você está apenas modificando parte de um valor de ponteiro. De fato, argv
é garantido que seja modificável com segurança.
char *argv[]
não ter const
qualificadores. Você pode falhar, escrevendo em um literal string comint main(){char *v="";*v=1;}