Articles of comportamento indefinido

Por que o otimizador aprimorado do GCC 6 quebra o código C ++ prático?

O GCC 6 tem um novo recurso de otimizador : ele pressupõe que this não é sempre nulo e otimiza com base nisso. Propagação de intervalo de valor agora assume que o ponteiro this de funções de membro do C ++ é não-nulo. Isso elimina checagens de pointers nulos comuns, mas também quebra algumas bases […]

Destruidor virtual e comportamento indefinido

Esta questão é diferente de ‘ Quando / por que devo usar um destruidor virtual ? ‘. struct B { virtual void foo (); ~B() {} // <— not virtual }; struct D : B { virtual void foo (); ~D() {} }; B *p = new D; delete p; // D::~D() is not called […]

Perto do tempo constante de rotação que não viola os padrões

Eu estou tendo um longo tempo tentando chegar a uma rotação constante de tempo que não viola os padrões C / C ++. O problema são os casos de borda / canto, onde as operações são chamadas em algoritmos e esses algoritmos não podem ser alterados. Por exemplo, o seguinte é do Crypto ++ e […]

Posso pegar o endereço do elemento one-last-the-end de uma matriz?

Duplicar Possível: Pegue o endereço de um elemento de array passado-a-fim via subscrito: legal pelo padrão C ++ ou não? int array[10]; int* a = array + 10; // well-defined int* b = &array[10]; // not sure… A última linha é válida ou não?

Usando a variável recém-declarada na boot (int x = x + 1)?

Eu acabei de me deparar com um comportamento que me surpreendeu: Ao escrever: int x = x+1; em um programa C / C ++ – (ou até mesmo uma expressão mais complexa envolvendo a recém criada variável x) meu gcc / g ++ compila sem erros. No caso acima, X é 1 depois. Observe que […]

Múltiplas mutações dentro de listas de inicializadores são comportamentos indefinidos?

Estou curioso sobre listas de inicializadores e pontos de sequência. Eu li há algum tempo que a ordem de avaliação nas listas de inicializadores é da esquerda para a direita. Se é assim, então deve haver algum tipo de ponto de seqüência entre os pontos de avaliação, estou errado? Então, com isso dito é o […]

Esta recursion infinita é UB?

Em C ++ 11, como um loop infinito sem efeitos colaterais, o programa a seguir é UB: int main() { while (true) {} } O seguinte também é UB? void foo() { foo(); } int main() { foo(); } Citações do padrão para ambos os programas seriam ideais.

Por que desreferenciando um ponteiro nulo é um comportamento indefinido?

De acordo com o ISO C ++, desreferenciando um ponteiro nulo é um comportamento indefinido. Minha curiosidade é por quê? Por padrão decidiu declarar comportamento indefinido? Qual é a razão por trás dessa decisão? Dependência do compilador? Não parece, porque de acordo com o padrão C99, tanto quanto eu sei, é bem definido. Dependência de […]

Por que está fora de limites a aritmética do ponteiro de comportamento indefinido?

O exemplo a seguir é da Wikipedia . int arr[4] = {0, 1, 2, 3}; int* p = arr + 5; // undefined behavior Se eu nunca desreferencia p, então por que arr + 5 é um comportamento indefinido? Espero que os pointers se comportem como inteiros – com a exceção de que, quando não […]

Bug de compilation C ++?

Eu tenho o seguinte código: #include #include using namespace std; int main() { complex delta; complex mc[4] = {0}; for(int di = 0; di < 4; di++, delta = mc[di]) { cout << di << endl; } return 0; } Espero que ele produza “0, 1, 2, 3” e pare, mas gera uma série interminável […]