Pergunta

Pode isso nunca acontecer? 3 afirma, onde se deve ativar.

int nr = perform_calc();
assert( nr == 0);
assert( nr > 0);
assert( nr < 0);

Pode haver um caso em que o programa não ativar o afirma em g ++ 3.4.4.

E não, eu não tenho a possibilidade de alterar o código para imprimir o número para fora no caso do afirma não ativar.

Todas as idéias?

Edit: Depois de ler vários comentários I foi forçado a edição. Mostrar o código? por que você está fazendo essa coisa estúpida? Eu não acredito! Onde é usado? De minha pergunta que deveria ter sido óbvio que não vou postar / alterar o código por causa de várias razões possíveis:

  • Eu sou um iniciante e tem vergonha do código (nenhum crime lá, com certeza ele faz respondendo à pergunta mais fácil se eu queria publicá-la)
  • me pediram para ajudar um amigo com apenas pouca informação (e não, eu não lhe perguntei por que você não pode verificar o número retornado, ou por que ele não pode simplesmente adicionar um ponto de interrupção).
  • Eu estou escrevendo meu código no emacs sem qualquer compilador e é enviá-lo para um servidor remoto que compila, executa-lo e só pode retornar falharam afirma se algo der errado.

Se você acreditava que eu estava fazendo uma brincadeira ou uma farsa você deve ter votado para um fechamento da rosca vez. I teria sido perfeitamente bem com isso. Mas a adição de comentários desnecessários como esta só me fez querer uma bandeira "atitude" para ser implementado.

Eu quero agradecer os outros pelos seus comentários e respostas que realmente tentaram explicar e respondeu à minha pergunta.

Foi útil?

Solução

Como eu vi coisas tão feias em minha vida, isso poderia ser explicado se perform_calc () tem um buffer de superação que substitui o endereço de retorno na pilha. Quando as extremidades de função, o endereço substituído é recuperado da pilha e definido para o PC atual, levando a um salto talvez em outra área do programa, aparentemente após as chamadas afirmação.

Embora esta é uma possibilidade muito remota, por isso é o que você está mostrando.

Outra possibilidade é que alguém fez um truque macro feio. verifique se você tem coisas como

#define assert 

ou algum colega colocar algo como isso em um cabeçalho, enquanto você estava no banheiro

#define < ==
#define > ==

Como sugerido em outra resposta, verifique com -E gcc para ver o código é realmente compilado.

Outras dicas

assert é desmarcada se o NDEBUG macro está definida. Certifique-se de #undef NDEBUG ao compilar essa unidade de tradução.

Você pode chamar gcc com o interruptor -E para verificar se as instruções Assert ainda estão no código.

Ele não se parece com que o código está correto em primeiro lugar. Se a depuração está ligado (DEBUG e / ou _DEBUG são definidos e NDEBUG é desactivado):

assert( nr == 0);

A linha acima irá chamar exit () se nr = 0. Portanto, se esta linha passa, o segundo assert irá executar:

assert( nr > 0);

... E saída chamada () porque nr == 0 e! (Nr> 0).

assert( nr < 0);

E esta terceira linha nunca funcionará em todos.

O que, precisamente, é o ponto deste código? E por que, se estes afirma poderia ser adicionado, você não poderia, em vez adicionar um printf ()?

É este código multithread? Talvez você tem um condição de corrida .

E não, eu não tenho a possibilidade de alterar o código para imprimir o número fora ..

Strange. Você obviamente tem a capacidade de inserir as declarações assert (), porque se eles estavam realmente em código real, você não podia tocar, o código não poderia funcionar. Então, por que você não pode imprimir o valor do assert () chama teste?

Eu suspeito que você eliminou acidentalmente o problema, enquanto saneantes o fragmento de código. Há tanto mais código (e nr está sendo alterado entre afirma) ou ele realmente não parecer que (ou, por rlbond, você não tem assert ligado).

Tente colocar um segmento de código menos higienizado, e vamos ver se não podemos trabalhar com isso.

Poderia ser um NaN ? Nesse caso, a seguinte assert iria falhar:

assert( nr == nr );
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top