Boa noite pessoal. Então estou fazendo um montador de dois passos, então eu tenho que carregar um arquivo no formato .a e montar um arquivo no formato .mif, só quando eu faço o primeiro passo pra salvar os endereços das “sub-rotinas” o arquivo abre, copia os labels, endereça de acordo com a arquitetura e o arquivo passado, porem quando chega no final do arquivo ele não sai do while e no terminal me aparece o seguinte erro: *** stack smashing detected ***: terminated. O estranho é que eu testei com um arquivo .txt e esse erro não acontece. Se alguém puder ajudar agradeço. Segue o código abaixo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Endereco{
char endereco[100];
char binario[10];
} Endereco;
//Subrotinas
void PrimeiroPasso(char arquivo[], Endereco enderecos[]);
void ConvertDecimalToBinario(int num, char endereco[10]);
void ConvertDecimalToHexadecimal(int num, char endereco[2]);
//Função Principal
int main(int argc, char const *argv[]) {
FILE *pFile;
char arquivo[100];
Endereco enderecos[64];
printf("%ld\n", sizeof(enderecos)/sizeof(enderecos[0]));
printf("Informe o arquivo que desejar traduzir: ");
scanf(" %[^\n]s", arquivo);
while(1){
pFile = fopen(arquivo, "r");
if(pFile != NULL){
fclose(pFile);
break;
}
printf("Arquivo invalido desejar informa outro arquivo? Digite s para sim e n para sair da aplicação");
while(1){
char confirmaSair;
scanf(" %c", &confirmaSair);
if((confirmaSair == 'n') || (confirmaSair == 'N')){
return 0;
}
else if((confirmaSair == 's') || (confirmaSair == 'S')){
break;
}
else{
printf("Opcao invalida\n");
}
printf("desejar informa outro arquivo? Digite s para sim e n para sair da aplicação\n");
}
printf("Informe o arquivo que desejar traduzir: ");
scanf(" %[^\n]s", arquivo);
}
PrimeiroPasso(arquivo, enderecos);
//Para teste
printf("%s: %s\n", enderecos[0].endereco, enderecos[0].binario);
printf("%s: %s\n", enderecos[1].endereco, enderecos[1].binario);
printf("%s: %s\n", enderecos[2].endereco, enderecos[2].binario);
return 0;
}
//Subrotina para executar o primeiro passo do montador
void PrimeiroPasso(char arquivo[], Endereco enderecos[]){
FILE *pFile = fopen(arquivo, "r+");
int linhaDoc = 0;
int ctrlVetorStruct = 0;
while(!feof(pFile)){
char bufferAux = fgetc(pFile);
printf("%c\n", bufferAux);
if(bufferAux == '_'){
int n = 1;
char enderecoAux2[100];
enderecoAux2[0] = '_';
while(1){
char buffer;
buffer = fgetc(pFile);
if(buffer == ':'){
char enderecoAux[10];
int aux = linhaDoc*2;
enderecoAux2[n] = '\0';
strcpy(enderecos[ctrlVetorStruct].endereco, enderecoAux2);
ConvertDecimalToBinario(aux,enderecoAux);
strcpy(enderecos[ctrlVetorStruct].binario, enderecoAux);
printf("%s: %s\n", enderecos[ctrlVetorStruct].endereco, enderecos[ctrlVetorStruct].binario);
ctrlVetorStruct++;
break;
}
else if(buffer == '\n'){
linhaDoc++;
break;
}
else{
enderecoAux2[n] = buffer;
n++;
}
}
}
else if(bufferAux == '\n'){
linhaDoc++;
}
}
fclose(pFile);
return;
}
//Função de conversão de decimal para binário, necessária para converter e construir um os instruções
void ConvertDecimalToBinario(int num, char endereco[10]){
int n = 8;
int resto;
while(1){
endereco[n] = '0' + num%2;
num = num/2;
n--;
if((num == 1) || (num == 0)){
endereco[n] = '0'+ num;
n--;
if(n >= 0){
int i = 0;
while(i <= n){
endereco[i] = '0';
i++;
}
}
endereco[9] = '\0';
return;
}
}
}
Obrigado [ ]s