Olá a todos,
estava escrevendo um programa em C para realizar algumas operações bitwise e obtive o seguinte erro:
Run-Time Check Failure #2 - Stack around the variable ‘bit’ was corrupted.
Sempre obtenho esse tipo de erro no VC++ quando escrevo funções que manipulam dados a nível de bit, e tentando compilar o mesmo programa no Dev-C++ não causou o problema.
Para maiores esclarecimentos, informo que a variável em questão não é um vetor/string.
Alguém sabe o que fazer para sanar o problema?
Desde já agradeço a atenção.
Isso é porque você está com um bug no seu programa que o Dev-C++ não conseguiu detectar em tempo de execução.
Provavelmente você está fazendo alguma coisa errada, mas não está sabendo onde.
Por exemplo, você tentar fazer isto aqui:
char ch [24];
ch [24] = '\0';
deve provocar esse problema no Visual C++, porque isso está claramente errado, embora não aparente estar.
thingol,
destaco novamente que a variável em questão não é um vetor ou string, mas sim um inteiro.
O erro ocorre sempre que realizo operações bitwise em que um inteiro recebe o resultado.
Por exemplo,
retorna esse erro.
Você consegue postar o menor programa possível que caiba em um .cpp e que dê esse tal erro, assim como as opções de compilação?
O programa em C é o seguinte:
[code]#include <stdio.h>
char rodabits(char valor, char bits)
{
char bit;
for(;bits>0;bits--)
{
bit = (valor & 128) < 0;
valor <<= 1;
valor |= bit;
}
return valor;
}
void main()
{
char numero, bits;
printf("Entre com o numero que deseja rotacionar e com o numero de bits que deseja deslocar:\n");
scanf("%i%i", &numero, &bits);
printf("%i", rodabits(numero, bits));
}[/code]
Usei Debug mode para a compilação, já que em Release ele só abre, ao ler as variáveis dá erro de acesso ilegal à memória.
Ah, mas o problema não é com a manipulação de bits.
O problema foi provocado por scanf, que insiste em receber um ponteiro para um int (4 bytes), não para um char (1 byte).
Isso não pode ser detectado pelo compilador, porque ele é estúpido e não checa os argumentos do scanf ou do printf. Se você usasse uma ferramenta como o FlexeLint ( http://www.gimpel.com/html/flex.htm ) isso seria rapidamente verificado. )
No Dev-C++ esse problema realmente vai passar batido.
O que ocorreu foi o seguinte:
- O compilador gera código que checa se você escreveu algo fora dos limites do char (1 byte). Esse código consiste em inicializar a pilha com um valor conhecido e fixo.
Como variáveis locais são armazenadas na pilha do processador, então, mesmo que a variável deva ocupar apenas 1 byte, o compilador reserva 8 bytes para ela, porque a pilha é melhor acessada de 8 em 8 bytes (o processador, internamente, mesmo em x86, trabalha em 64 bits, daí preferir essa divisão artificial de 8 bytes).
- Você chamou scanf com o endereço da variável char, e então você preencheu não só a variável char (1 byte), mas também 3 bytes que vêm depois dessa variável, porque na verdade o scanf espera um ponteiro para int, não char.
- Quando o programa saiu, ele chamou código que checa se a pilha está comprometida. Como foi visto que os 3 bytes na pilha foram modificados indevidamente, então ele provocou o tal erro.
Para consertar esse problema:
- Passe o endereço de uma variável int para o scanf.
ou
- Em vez de usar scanf (argh - ugh - uff - bleargh) leia as linhas com gets mesmo, e use atol ou atoi para efetuar as conversões.
E de qualquer maneira, não economize memória desse jeito (usando variáveis char), a menos que você saiba o que está fazendo. Usar o padrão - int - usa até menos memória porque as instruções do processador que lidam com os registradores completos (em 32 bits, EAX, EBX, ECX etc. e em 64 bits, RAX, RBX, etc.) são menores que as instruções que lidam com pedaços de um registrador, ou bytes.
Ah! Certo, vou tentar fazer com int.
Se o problema permanecer volto a incomodar o fórum.
Muito obrigada pela ajuda! 