Articles of indefinido comportamento

Comportamento definido para expressões

O C99 Standard diz em $ 6.5.2. Entre o ponto de seqüência anterior e o seguinte, um object deve ter seu valor armazenado modificado no máximo uma vez pela avaliação de uma expressão. Além disso, o valor anterior deve ser lido apenas para determinar o valor a ser armazenado . (ênfase de mim) Em seguida, […]

Diferença entre comportamento indefinido e malformado, nenhuma mensagem de diagnóstico necessária

O padrão C ++ vem com um número impressionante de definições para um comportamento pouco claro que significa mais ou menos o mesmo com diferenças sutis. Lendo essa resposta , notei o texto “o programa está mal formado; não é necessário diagnóstico” . Implementação definida difere do comportamento não especificado em que a implementação no […]

Em C ++ 11, o `i + = ++ i + 1` exibe um comportamento indefinido?

Esta questão surgiu enquanto eu estava lendo (as respostas para) Então por que i = ++ i + 1 é bem definido em C ++ 11? Eu entendo que a explicação sutil é que (1) a expressão ++i retorna um lvalue, mas + assume prvalues ​​como operandos, então uma conversão de lvalue para prvalue deve […]

Está passando um object C ++ para seu próprio construtor legal?

Estou surpreso ao descobrir acidentalmente que os seguintes trabalhos: #include int main(int argc, char** argv) { struct Foo { Foo(Foo& bar) { std::cout << &bar << std::endl; } }; Foo foo(foo); // I can't believe this works… std::cout << &foo << std::endl; // but it does… } Eu estou passando o endereço do object construído […]

As ramificações com comportamento indefinido podem ser consideradas inalcançáveis ​​e otimizadas como código morto?

Considere a seguinte declaração: *((char*)NULL) = 0; //undefined behavior Ele claramente invoca um comportamento indefinido. A existência de tal declaração em um determinado programa significa que o programa inteiro é indefinido ou que o comportamento só se torna indefinido quando o stream de controle atinge essa instrução? O programa a seguir seria bem definido caso […]

A macro ‘offsetof’ de invoca o comportamento indefinido?

Exemplo da implementação do MSVC: #define offsetof(s,m) \ (size_t)&reinterpret_cast((((s *)0)->m)) // ^^^^^^^^^^^ Como pode ser visto, ele desreferencia um ponteiro nulo, que normalmente invoca o comportamento indefinido. Isso é uma exceção à regra ou o que está acontecendo?

Onde exatamente o padrão C ++ diz que desreferenciar um ponteiro não inicializado é um comportamento indefinido?

Até agora não consigo descobrir como deduzir que o seguinte: int* ptr; *ptr = 0; é um comportamento indefinido. Primeiro de tudo, há 5.3.1 / 1 que afirma que * significa indireção que converte T* em T Mas isso não diz nada sobre a UB. Em seguida, há muitas vezes citado 3.7.3.2/4 dizendo que usando […]

A variável local não inicializada é o gerador de número random mais rápido?

Eu sei que a variável local não inicializada é o comportamento indefinido ( UB ), e também o valor pode ter representações de armadilha que podem afetar outras operações, mas às vezes eu quero usar o número random somente para representação visual e não as utilizarei em outra parte programa, por exemplo, definir algo com […]

O comportamento do “struct hack” é tecnicamente indefinido?

O que eu estou perguntando é o bem conhecido truque “último membro de uma estrutura tem comprimento variável”. É algo assim: struct T { int len; char s[1]; }; struct T *p = malloc(sizeof(struct T) + 100); p->len = 100; strcpy(p->s, “hello world”); Devido à forma como a estrutura é disposta na memory, podemos sobrepor […]

O “Comportamento Indefinido” realmente permite que * qualquer coisa * aconteça?

EDIT: Esta questão não foi concebida como um fórum para discussão sobre o (des) mérito do comportamento indefinido, mas isso é uma espécie de o que se tornou. Em qualquer caso, este tópico sobre um compilador C hipotético sem comportamento indefinido pode ser de interesse adicional para aqueles que acham que este é um tópico […]