• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

20_LESI

[C] *** stack smashing detected ***

8 mensagens neste tópico

Boas! Tou a fazer um programa em C que gera um Histórico de alunos.... Essa parte (supostamente a mais dificil) já está! Mas ao sair da função, o programa dá este erro: "*** stack smashing detected ***", que pelo que andei a ver, é uma espécie de "segmentation fault"++... Será que alguém me pode ajudar?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#include <time.h>
#include <unistd.h>

#define randomFloat  ( (float) (rand() ) / (float) (RAND_MAX) )  //gera reais entre 0 e 1
#define MAX_NOME 100



void gera_Historico(char **uces);
void gerar_numero_alunos(int numAlunos_UCE[]);
int somatorio(int numAlunos[]);
void gerar_medias(float *medias, int n);
void quicksort(float a[], int l, int r);
int partition(float a[], int l, int r);
int get_ind_uce(int numAlunos_UCE[]);
void uce2ident(char *str);
void gera_Lista_A(char **uces);
void inic_array(int *posNomes, int n);
void shuffle(int *array, int n);
void getName(int *posNomes, int i, char *nome);



int main(void)
{
   char *uces[]  = {"Sistemas de Suporte a Decisao",
	    "Criptografia e Seguranca de Sistemas de informacao",
	    "Engenharia de APlicacoes",
	    "Sistemas INteligentes",
	    "Engenharia de Redes e Servicos",
	    "Engenharia de LInguagens",
	    "Analise e Concepcao de Software",
	    "Metodos Formais em Engenharia de software",
	    "Sistemas DisTribuidos",
	    "Computacao Paralela Distribuida",
	    "Tecnologias e Protocolos de Infra-estrutura",
		    "BIOinformatica",
	    "Computacao Movel e Ubiqua",
	    "Computacao GRafica",
	    "Engenharia do COnhecimento",  // Estas duas últimas UCEs...
	    "Programacao CerTificada"};  // (...) são as menos requisitadas

   gera_Historico(uces);

   return 0;
}

void gera_Historico(char **uces)
{
   int i, ind, ano = 2007, total, tmp, faltas, j;
   int numAlunos_UCE[16];
   float *medias;
   char uce[40+1], nome[MAX_NOME+1];
   char *bool[]  = {"SIM","NAO"};
   FILE *fp, *f;

   srand(time(NULL));

   fp=fopen("Historico.txt","w");
   f=fopen("nomes.txt","r");

   /* Impressão do Histórico */

   while(ano<2009)
   {
      gerar_numero_alunos(numAlunos_UCE);  //gerar para cada índice (UCE), o número de alunos que a frequentará
      total=somatorio(numAlunos_UCE);  //numero total de alunos nas UCEs (repetem-se os que estão a frenquentar duas)

      medias = malloc(sizeof(float) * total);
      gerar_medias(medias, total);  //codigo no gerador da lista A
      quicksort(medias,0,total-1);  //codigo no gerador da lista A

      fprintf(fp,"	%d\n\n",ano);

      for (i=0 ; i<total ; i++)
      {
         fgets(nome,MAX_NOME+1,f);
         fprintf(fp,"nome: %s", nome);
         fprintf(fp,"media: %.3f\n", medias[i]);
         fprintf(fp,"numero de seriacao: %d\n",i+1);

         j=rand()%20; //indica o num. de UCEs que o aluno frequentou, e apenas 5% dos alunos frequentaram apenas uma

         if(!j)
       	    j=1;
         else
         {
            if(++i != total)  // Incrementa-se a variavel de controlo, pois o candidato estará matriculado em duas UCEs
               j=2;
            else
       j=1;
         }

         while(j--)
         {
            ind = get_ind_uce(numAlunos_UCE);
            strcpy(uce,uces[ind]);
            uce2ident(uce);

            tmp=rand()%3;

            if(tmp)  // 2/3 dos alunos de mestrado dão menos de 3 faltas a cada UCE
       faltas=rand()%4;
            else  // Dos restantes 1/3...
            {
               tmp=rand()%2;

               if(tmp)  //metade dão apenas 4 ou 5 faltas, ficando aprovados
          faltas=rand()%2 + 4;
       else  //para os outros...
          faltas=rand()%10 + 6; // (...) os resultados variam aleatoriamente entre 6 e 15 faltas
            }

            if(faltas>8)  // Se o aluno der mais de 8 faltas, tem 90% de probabilidade de reprovar à UCE
    {
               tmp=rand()%10;

               if(tmp)
          tmp=1;
            }
            else
            {
               if(faltas>5)  // Se o aluno der entre 6 e 8 faltas, tem 50% de probabilidade de reprovar à UCE
       {
          tmp=rand()%2;
               }
       else  // Caso contrário, terá 90% de probabilidade de passar à UCE
               {
	          tmp=rand()%10;

          if(tmp)
             tmp=0;
               }
            }

            fprintf(fp,"UCE: %s\nfaltas: %d\naprovacao: %s\n",uce,faltas,bool[tmp]);
         }

 fprintf(fp,"\n\n");
      }

      ano++;
      fprintf(fp,"\n\n\n\n");
   }

   fclose(fp);
   fclose(f);
}

void gerar_numero_alunos(int numAlunos_UCE[])
{
   int i;

   for (i=0 ; i<9 ; i++)
      numAlunos_UCE[i]=30;  //encher as primeiras 9 UCEs

   while(i<14)  //as seguintes UCEs terão entre 15 a 24 alunos
      numAlunos_UCE[i++]=rand()%10 + 15;

   while(i<16)  //as duas últimas UCEs terão entre 0 a 14 alunos
      numAlunos_UCE[i++]=rand()%15;
}

int somatorio(int numAlunos[])
{
   int i, total=0;

   for (i=0 ; i<16 ; i++)
      total+=numAlunos[i];

   return total;
}

void gerar_medias(float *medias, int n)
{
   int i;

   for (i=0 ; i<n ; i++)
      medias[i] = (float) ((rand()%10) + randomFloat + 9.500);
}


void quicksort(float a[], int l, int r)
{

   float j;



   if( l < r ) 
   {

      j = partition( a, l, r);
      quicksort( a, l, j-1);
      quicksort( a, j+1, r);

   }

}

int partition(float a[], int l, int r)  //rearranja os elementos de qualquer vector a[p..r] e devolve um índice i em
{  					   //p..r tal que:   a[p..i-1] < a[i] < a[i+1..r]

   float pivot, t;

   int i,j, flag=1;


   pivot = a[l];


   i = l; 
   j = r+1;



   while(flag)
   {

      do ++i; 
      while( a[i] >= pivot && i <= r );

      
      do --j; 
      while( a[j] < pivot );

   	
      if( i >= j )
         flag=0;
      else

      {
         t    = a[i]; 
         a[i] = a[j]; 
         a[j] = t;

      }	

   }

   t    = a[l];
   a[l] = a[j];
   a[j] = t;

      
   return j;

}


int get_ind_uce(int numAlunos_UCE[])  //melhorar bastante este algoritmo
{
   int ind_uce;

   ind_uce=rand()%16;
   
   if(numAlunos_UCE[ind_uce])
      numAlunos_UCE[ind_uce]--;
   else
   {
      while (numAlunos_UCE[ind_uce]==0)
 ind_uce = (ind_uce+1)%16;

      numAlunos_UCE[ind_uce]--;
   }

   return ind_uce;
}

void uce2ident(char *str)  // converte a UCE num identificador da mesma UCE
{
   char *aux;

   for ( aux=str ; *aux ; aux++ )
   {
      if (isupper((unsigned char)*aux))
      {
         *str++ = *aux;
      }
   }

   *str = '\0';
}

void getName(int *posNomes, int i, char *nome)
{
   char tmp[MAX_NOME+1];
   FILE *fp;

   sprintf(tmp,"sed -n '%dp' nomes.txt >tmp.txt",posNomes[i]);
   system(tmp);

   fp=fopen("tmp.txt","r");
   fgets(tmp,sizeof(tmp)+1,fp);
   fclose(fp);
   strcpy(nome,tmp);
}

O programa estoura ao sair da função "gera_Historico", e não estou mesmo a conseguir vislumbrar o problema... Deixo aqui o conteúdo do ficheiro nomes.txt, necessário para que o programa funcione:

Abecê Nogueira
Abrilina Décima Nona Caçapavana Piratininga de Almeida
Abxivispro Jacinto
Acheropita Papazone
Adalgamir Marge
Adegesto Pataca
Adolpho Hitler de Oliveira
Adoração Arabites
Aeronauta Barata
Agrícola Beterraba Areia Leão
Agrícola da Terra Fonseca
Alce Barbuda
Aldegunda Carames More
Aleluia Sarango
Além Mar Paranhos
Alfredo Prazeirozo Texugueiro
Alma de Vera
Amado Amoroso
Amável Pinto
Amazonas Rio do Brasil Pimpão
América do Sul Brasil de Santana
Amim Amou Amado
Amor de Deus Rosales Brasil
Analgesina Costa Pinto
Anatalino Reguete
Angústias Árias
Antenor da Cotinha
Antônio Americano do Brasil Mineiro
Antonio Buceta Agudim
Antonio Camisão
Antônio Dodói
Antônio Manso Pacífico de Oliveira Sossegado
Antonio Melhorança
Antônio Morrendo das Dores
Antonio Noites e Dias
Antônio P. Testa
Antonio Pechincha
Antônio Querido Fracasso
Antônio Treze de Junho de Mil Novecentos e Dezessete
Antônio Veado Prematuro
Antoniozin Fogaça
Apurinã da Floresta Brasileira
Araci do Precioso Sangue
Argentino Argenta
Argonauta Sucupira
Aricléia Café Chá
Armando Nascimento de Jesus
Arquibaldo Nana do Mercado
Arquiteclínio Petrocoquínio de Andrade
Asteróide Silvério
Audobrantina Moema Cearenciana
Ausêncio Nogueira
Bailão Fernandes da Silva
Bananéia Oliveira de Deus
Bandeirante Brasileiro Paulistano
Barrigudinha Seleida
Bende Sande Branquinho Maracajá
Benedito Autor da Purificação
Benedito Camurça Aveludado
Benedito Frôscolo Jovino de Almeida Aimbaré Militão de Souza Baruel de Itaparica Boré Fomi
de Tucunduvá
Benemérita do Rêgo Grande
Benigna Jarra
Benvindo Viola
Bispo de Paris
Bizarro Assada
Boaventura Torrada
Bom Filho Persegonha
Boré Fomi de Tucunduvá.
Brandamente Brasil
Brasil Paraná de Cristo
Brasil Valente
Brasil Washington C. A. Júnior
Brígida de Samora Mora Belderagas Piruégas
Brizabela Alves
Bronsibel Ribeiro de Sena
Cafiaspirina Cruz
Caius Marcius Africanus
Capote Valente e Marimbondo da Trindade
Carabino Tiro Certo
Carlos Alberto Santíssimo Sacramento Cantinho da Vila Alencar da Corte Real Sampaio
Carneiro de Souza e Faro
Caso Raro Yamada
Cavalo Antônio
Céu Azul do Sol Poente
Chananeco Vargas da Silva
Chevrolet da Silva Ford
Cincero do Nascimento
Cinconegue Washington Matos
Clarisbadeu Braz da Silva
Colapso Cardíaco da Silva
Cólica de Jesus
Comigo é Nove na Garrucha Trouxada
Confessoura Dornelles
Crisoprasso Compasso
Danúbio Tarada Duarte
Darcília Abraços de Carvalho Santinho
David Leão Pão Trigo
Delícia Costa Melo
Deus É Infinitamente Misericordioso
Deus Magda Silva
Deus Quer Magalhães Mota
Deusarina Venus de Milo
Devercilirio Silveira da Costa
Dezêncio Feverêncio de Oitenta e Cinco
Dignatario da Ordem Imperial do Cruzeiro
Dilke de La Roque Pinho
Dinossauro Carlos da Silva
Diva Gina Santos
Divina Anunciação
Dolores Fuertes de Barriga
Dosolina Piroca Tazinasso
Drágica Broko
Elacervandro Gomes
Ernesto Segundo da Família Lima
Esdras Esdron Eustaquio Obirapitanga
Esparadrapo Clemente de Sá
Espere em Deus Mateus
Estácio Ponta Fina Amolador
Éter Sulfúrico Amazonino Rios
Eva Gina Melo
Excelsa Teresinha do Menino Jesus da Costa e Silva
Faraó do Egito de Souza
Fé Esperança e Caridade
Fedir Lenho
Felicidade do Lar Brasileiro
Finólila Piaubilina
Flávio Cavalcante Rei da Televisão
Francisco Notório Milhão
Francisco Zebedeu Sanguessuga
Francisoreia Doroteia Dorida
Fridundino Eulâmpio
Galenogal de Silva
Gengis Khan Camargo
Gerunda Gerundina Pif Paf
Gigle Catabriga
Gilete Queiroga de Castro
Gol Santana Silva
Graciosa Rodela D'alho
Gravitolina Pereira
Heubler Janota
Hidráulico Oliveira
Himineu Casamenticio das Dores Conjugais
Hiprafodito da Silva
Holofontina Fufucas
Homem Bom da Cunha Souto Maior
Horinando Pedroso Ramos
Hugo Madeira de Lei Aroeiro
Hypotenusa Pereira
Ilegível Inilegível
Inocêncio Coitadinho Sossegado
Isabel Defensora de Jesus
Isabel Rainha da Hungria Portugal Silva
Jacinto Fadigas Arranhado
Jacinto Leite Aquino Rego
Janeiro Fevereiro de Março Abril
João Bebe Água
João Bispo de Roma
João Cara de José
João Coelhinho Paes
João Cólica
João da Mesma Data
João de Deus Fundador do Colto
João Meias de Golveias
João Pensa Bem
João Sem Sobrenome
João Suíno de Oliveira
Joaquim Pinto Molhadinho
José Amâncio e Seus Trinta e Nove
José Casou de Calças Curtas
José Catarrinho
José Machuca
José Marciano Verdinho das Antenas Longas
José Maria Guardanapo
José Padre Nosso
José Teodoro Pinto Tapado
José Xixi
Jotacá Dois Mil e Um
Jovelina Ó Rosa Cheirosa
Jovino de Almeida Aimbare Militão de Souza a Baruel de Itaparica
Juana Mula
Jubiratan Carneiro
Júlio Santos Pé-Curto
Justa Senhorinha de Jesus
Justiça Maria de Jesus
Kunigunda Grohmann
Lança Perfume Rodometálico de Andrade
Leão Rolando Pedreira
Leda Prazeres Amante
Legua e Meia
Letsgo
Liberdade Igualdade Fraternidade Nova York Rocha
Libertino Africano Nobre
Lindulfo Celidonio Calafange de Tefé
Lynildes Carapunfada Dores Fígado
Magnésia Bisurada do Patrocínio
Manganes Manganesfero Nacional
Manoel de Hora Pontual
Manoel Sovaco de Gambar
Manolo Porras Y Porras
Manuel Sola de Sá Pato
Manuelina Terebentina Capitulina de Jesus Amor Divino
Maria Constança Dores Pança
Maria Cristina do Pinto Magro
Maria da Cruz Rachadinho
Maria da Segunda Distração
Maria de Seu Pereira
Maria do Sô Anternor
Maria Esposa de Jesus
Maria Felicidade
Maria Humilde
Maria Máquina
Maria Panela
Maria Passa Cantando
Maria Privada de Jesus
Maria Tributina Prostituta Cataerva
Maria-você-me-mata
Mário de Seu Pereira
Meirelaz Assunção
Mijardina Pinto
Mimaré Indio Brasileiro de Campos
Ministéio Salgado
Miyatoyohiko Oku
Naida Navinda Navolta Pereira
Napoleão Bonaparte Sem Medo e Sem Mácula
Napoleão Estado do Pernambuco
Natal Carnaval
Necrotério Pereira da Silva
Novelo Fedelo
Oceano Atlântico Linhares
Oceano Pacífico
Olinda Barba de Jesus
Orlando Modesto Pinto
Orquerio Cassapietra
Otávio Bundasseca
Pacífico Armando Guerra
Pacífico Pinto Barra
Padre Filho do Espírito Santo Amém
Pália Pélia Pólia Púlia dos Guimarães Peixoto
Paranahyba Pirapitinga Santana
Passos Dias Aguiar
Pedra da Penha
Pedrinha Bonitinha da Silva
Pedro do Cacete da Silva
Pelumendia Loureiro
Percilina Pretextata Predileta Protestante
Peta Perpétua de Ceceta
Placenta Maricórnia da Letra Pi
Plácido e Seus Companheiros
Pombinha Guerreira Martins
Presolpina Furtado
Primavera Verão Outono Inverno
Primeira Delícia Figueiredo Azevedo
Produto do Amor Conjugal de Marichá e Maribel
Protestado Felix Correa
Radigunda Cercená Vicensi Confessoura Dornelles
Remédio Amargo
Renato Pordeus Furtado
Ressurgente Monte Santos
Restos Mortais de Catarina
Rolando Caio da Rocha
Rolando Escada Abaixo
Romulo Reme Remildo Rodo
Safira Azul Esverdeada
Sansão Vagina
Sebastião Salgado Doce
Segundo Avelino Peito
Segundo Clenildo Rodrigues
Serdeberão dos Anjos Pereira Vargas
Sete Chagas de Jesus e Salve Pátria
Sete Rolos de Arame Farpado
Sherlock Holmes da Silva
Simplício Simplório da Simplicidade Simples
Soraiadite das Duas a Primeira
Telesforo Veras
Terebentina Terepenis
Terprando Wilson Rego
Tertuliano Firgufino
Tigalphinezer Fernando Lima
Tom Mix Bala
Tropicão de Almeida
Última Delícia do Casal Carvalho
Último Vaqueiro
Um Dois Três de Oliveira Quatro
Um Mesmo de Almeida
Universo Cândido
Valdir Tirado Grosso
Veneza Americana do Recife
Vicente Mais ou Menos de Souza
Vitimado José de Araújo
Vitor Hugo Tocagaita
Vitória Carne e Osso
Vivelinda Cabrita
Voltaire Rebelado de França
Wanslívia Heitor de Paula
Zélia Tocafundo Pinto
Liberdade de Jesus Narigueta Perna Torta Banha
Cidália Calçada Descalça
Norlinda Rapa Buraco
Maria Ténia Viu Vultus
Etelvina Vaca Cabeça
Barbosa Cuecas
Luis Fortes Lopes Carago
Reinaldo Rabo Bacalhau Molho
António Agostinho Chouriço Junior
Maria Bem Grosso
Carlos Marques Bagina ao Léu
Elisa Maria Puns Dá
Maria Trombasia
Ignácio Bufa Bucelato
Maria Salva Um de Cada Vez
António Manuel de Sousa Rabito Magro
Maria Augusta Rata Seca
Documentada Registrada da Silva
Assumida Prometida de Souza
Maria Bastarda Dequem
Maria Enrolada Dequal
Aparecida Donada
Maria da Delícia Dazona
Juvenalda Datia Gulosa
Abelarda datóba roxa
Orelhuda Vesguinha Marcondes
Veneziana das Varetinhas Neves
Aberta Demais de Oliveira
Maria Vencedora Veneranda
Maria da Cruz em Cima da Cama
Falidora da Fortuna Dopai Ramiro
Acompanhada da Garrucha do Socorro
Gambita Magrela de Oliveira
Murchinha Mossoró
Enrugadinha Pelada Carijó
Farra Prejudicada Pinambá
Safada da Sogra Vitorina
Peludinha Fofa Jovenete
Maria do Futuro Comprometido
Ana Nana Ananias
Ambrísia Estilingue Morretes
Teotólia Carnaúba de Porrinhas Almeida
Ana Mariana Tertuliana Santana
Maria Pelúcia Torres
Jesuína das Bonecas Frióba
Venezuela Boliviana Paraíba da Silva
Josenilda do São Francisco Seco da Cruz Divina
Ana Baiana Meleva Daqui Pratinhos
Julieta Tevi Nabanda Javaés
Virgínia Coco Pelado Lins
Matildinha Venanciana Fanfarrote Capistrano
Mariana Daxana Laranjal
Virlueta Canisvalda Peçonha
Melchidiana Tres Reis Magos Barilda
Maria Nojetes Caramujo Bastos
Sapienta Tonia
Malurdes Nesgas
Tobiniana Matusquela
Felicinalda Faruta
Margarida Mastodoncia Marques
Roselaura Mariantonia Carmenlúcia Rios
Fontegilda Permanente Rosária
Saionará Mistura Fina Relicária
Credinha da Cruz
Santinha dos Santos Santarém
Jandicleidirene Sapopemba
Apressadinha Sampaio
Paleozóica Crepitomba
Desejosa de Jesus e dos Santos
Denunciada dos Desvios do Socorro
Ovariana Falópia Sargento
Celibatária do Acordeon Deletéria
Dadivosa da Linhagem Desejada
Conselheira dos Bons Motivos e Socorro
Seriaela Deu
Jacareana dos Lagartos Perereca Tobias
Joana Dabanda
Felicia Sorridentes Feliciana
Coagida Caneta
Esperanta Gicletes Farfalheiras
Cárnia Acacaueiras
Serralha Rateada Jó
Doremí das Escalas Sonoras e Magalhães
Dasdaquí Delá Soriana
Francia Ítala Alemoa Janaina
Lasanhina Espagueta de Oliveira
Chantileide Violina
Moranguia Reiner Werter Digesus
Nélia Nilcéia Nóia
Jéguia Francélia Barbados
Bódia Carrancuda Destemida de Jesus
Deselaine de Brito
Trancélia Porto
Torquatinha Édivirgis
Panacéia Palmeira
Afília Demaria de Nazaré
Cília Marília Pinto e Cruz
Clonildergis Vlanteérica Tabapuã
Ronron Gualtêncio Oásis
Plenitude Soares Antú
Avoal de Almeida
Coronária Ventícola Sim
Santarém das Amazonas Lins e Silva
Vaivai Jojô de Oliveira
Guatemalteca Mexicana de Souza
Maria Empedernida Vailá de Jesus
José Coton Coteneto Paranhos Albuquerque
Peixebom das Redescheias Camilo Cruz
Tezudinho de Sá
Gentiliano Amendoeiras
Vinil Diesel Preá e Silva
Gasosinha Contudo de Souza
Maria Deuembora Wagner
Rui Jafui Luís
Jardinzinho das Gardênias Margarido
Hortélia Picinguaba Bascarenhas Vlan
Fefildo Polido Caprichoso
Cristálio Fanfarra Bento
Clotoaldo Ribelino Telé
Padrícia Teodônia Vitela
Sextavado Obtusângulo Reto
Fleonasmo Marasmo Orgasmo Vil
Peludo José Diogo
Porrinheta dos Maracatins Atômicos
Tigrinaldson Leonildomar
Ratazano Fuçinhudo Perpendicular
Tegucigalpo Texuguinho Tarãntulo
Pernilonguildo Tentofaz Furão
Maria Sonora dos Sinos dos Santos
Cartomantia das Cartasboas Advinda
Pensamentia das Luzes Bromélias
Ventuinha Parracha
Vaicom Tudoemcima Saruê
Borraicho Tôncio
Flesgremizo do Juízo Topas
Craismen Laranis
Ralaílson Prejú do Artigo
Santana Senhor de Jesus
Juliopardo Beterraba Antuhérpes
Gentleman Benvindo Welcomer da Silva
Jenoína do Caráio
Fanreovaldson Carlatinguera Gerônimo da Veiga
Méscleas de Outrora Sá
Dassilva de Souza
Medula Óssea Trindade
Clônica Harventinha Assis Albuquerque
Mictorino dos Andrades e dos Monges
Runzito Vódika Cunhaque da Silva Sobrinho
Narótio Negrotão
Jirou Kaneko
Francisconde de Montecristo e Silva
Sandra Malandra de Véu da Noiva Baptista
Rançoso Cagado Nenem
Bezunto Preizunto Claro
Fenilda Garçinha
Peleuza Chacrinol Dias
Maria da Vasetomia Nolda Pereira
Creiscruz Tantaréu Jacintos
Jadioscre do Socorro Perpétuo
Valeriozinho Lindo de Jesus Divino e Reis
Pescócio Marzipan Dedéia
Mejalhana Véstias Cornolargo
Trasmontano das Riquezas do Santo Pai da Silva
Nanabavaca Gagafadasa Tobias
Realejo Jambiró
Nhanhá Siqueira Kipegue Roliço Junior
Peitúlia Maria Pereira Jaó
Rosnilosvaldo Florival
Florival Floriano Flôres
Maria Buceta Paranhos Pinto
Guenésio Guelão Sentado Pinteiro 
Velasquez de Albuquerque Lins e Silva Vasconcelos
Tanásio Girápolis Cléstrio Zalício Baldalho
Ventém Cloácio Baja
Danousse Dasvacas Probrejo de Oliveira
Amarfanhado Silveira
Maria das Dúvidas Perpétuas Castanha
Quideus Mideu Midas
Plotogoário Paniceudas Kina
Jozéfa Barriga de Maria Aguapés Gentildes
Rato Coelho
Maria Siú Apache Comanche de Souza Ramos
Benedito Tendodito Expedito Fedato
Sensível Felipe Aramalho
Castorzinho Rampazzo Pombeta
Vergalhão Fallod'oro Pinto Junior
Sasquachi Pezão Monteiro Reneé
Lairson Venancia Pederneiras Piá
Mestríades Papá Sorrisos Caldeirão
Traquinus Reis e Rosa
Milucas Butiago Resmaria
Jose Sanguinolento Parreira Azul
Cheisa das Vistas Longas Barbadalhos
Croassãn de Lisboa
Babuíno Sacristão Hediondo
Desluar Solaris das Nuvens Nogueira
Metia Paula da Silva
Gertrudes das Castanhadas das Derrapadas Silveirinha
Ranário Coelho Trombinha
Mildred Severina Pâmela Sebastiana
Chandler José
Ríspido Eduardo Candelabro Antonio
Cordelier Chandelier Nérda
Sastanás Dielzebú Ariel
João Medonho da Silva
Maria Atazanada Haleluia
Ducrutélia Masqueirosa Venlaíra
Sensodine Sansonaite Insosa Bachaí
Crenise Pâmela Bóstião
Fincomar Tiponhoaldo Lá e Silvia
Grudomar Coláceo Tudojunto Raspaduras
Versolácea Poemita das Canções de Outono Virgulina
Maria da Farofas Atômicas Rejuvenência
Talíngua dos Cotovelos Pela Raiz da Silveirinha
Jájáderson Pepeu Chapéu
Gardênio Camélio Rosauro
Espoleida Tatuzinho
José Esporráceo
Clacatur Venéreas
Nerrume Sagraz Bliocério Fanturpas Nenê
Candidato Cândido
Tourinho Gatão
José Marreco Patos
General do Garcia
João do Balde Poços Bilalê
Japinobaldo Torrú Carneirão
Vilagio Sarará Klios Hamptons
Margrio Juslio Merendão
Piá Motel das Dores
Lírio Dengoso Gaylor Almeidinha
Vorazgleidson Tenebroso Mosmêncio Trolhas
Jupiê Juciá Sucrilhas
Sigmar Montemor
Tamara Abalde
Maria Arrodo
Miriam Apano
Dolores Alvejante
Pierre Arraso
Luc Abalo
Jean Sacudio
Gerard Choco
Natasha Releeva
Katja Condena
Tatjana Guylhotina
Irina Abysova
Tjnder Wallis Achapaca
Avtar Mohammed Achapivara
Charenjeet Abdhul Achatoupeira
Sharath Kamal Achanta
Kuruna Dilambe
Abebe Diafta
Tirunesh Dibaba
Emmakulele Dissaliva
Ludovic Procuret
Frederick Bousquet
Antoine Achet
Jean Paul No´Encontret
Modesta Vzesniauskaite
Humilde Vzesniaupatins
Arrogante Vzesniausprancha
Jocosa Vzesniaupatinete
Osama Osama
Saddam Saddam
Hussein Hussein
Khomeini Khomeini
Sortudo Jardineira
Felizardo Bumba
Tristonho Busão
Alegre Lotação
Richard Topaki
Edmond Topalli
Salomon Topapuraí
Eribert Topacolá
Henry Louis Aaron
Grover Cleveland Alexander
Walter Emmons Alston
George Lee Anderson
Adrian Constantine Anson
Luis Ernesto Aparicio
Lucius Benjamin Appling
Don Richard Ashburn
Howard Earl Averill
John Franklin Baker
David James Bancroft
Ernest Banks
Albert Joseph Barlick
Edward Grant Barrow
Jacob Peter Beckley
Johnny Lee Bench
Charles Albert Bender
Lawrence Peter Berra
Wade Anthony Boggs
James Leroy Bottomley
Roger Philip Bresnahan
George Howard Brett
Louis Clark Brock
Dennis Joseph Brouthers
Mordecai Peter Centennial Brown
Morgan Gardner Bulkeley
James Paul David Bunning
Jesse Cail Burkett
Roy Campanella
Rodney Cline Carew
Max George Carey
Steven Norman Carlton
Gary Edmund Carter
Alexander Joy Cartwright, Jr.
Orlando Manuel Cepeda
Henry Chadwick
Frank Leroy Chance
Albert Benjamin Chandler
Oscar McKinley Charleston
John Dwight Chesbro
Fred Clifford Clarke
John Gibson Clarkson
Roberto Walker Clemente
Tyrus Raymond Cobb
Gordon Stanley Cochrane
Edward Trowbridge Collins, Sr.
James Joseph Collins
Earle Bryan Combs
Charles Albert Comiskey
John Bertrand Conlan
Thomas Henry Connolly
Stanley Anthony Coveleski
Samuel Earl Crawford
Joseph Edward Cronin
William Arthur Cummings
Hazen Shirley Cuyler
Raymond Emmett Dandridge
George Stacey Davis
Leon Day
Jay Hannah Dean
Edward James Delahanty
William Malcolm Dickey
Martin Dihigo
Joseph Paul DiMaggio
Lawrence Eugene Doby
Robert Pershing Doerr
Donald Scott Drysdale
Leo Ernest Durocher
Dennis Lee Eckersley
William G. Evans
John Joseph Evers
William Ewing
Urban Charles Faber
Robert William Andrew Feller
Richard Benjamin Ferrell
Roland Glen Fingers
Carlton Ernest Fisk
Elmer Harrison Flick
Edward Charles Ford
William Hendrick Foster
Jacob Nelson Fox
James Emory Foxx
Ford Christopher Frick
Frank Francis Frisch
James Francis Galvin
Henry Louis Gehrig
Charles Leonard Gehringer
Vernon Louis Gomez
Leon Allen Goslin
Henry Benjamin Greenberg
Clark Calvin Griffith
Burleigh Arland Grimes
Robert Moses Grove
Anthony Keith Gwynn
Charles James Hafey
Jesse Joseph Haines
William Robert Hamilton
Edward Hugh Hanlon
Stanley Raymond Harris
Charles Leo Hartnett
Harry Edwin Heilmann
William Jennings Bryan Herman
Harry Bartholomew Hooper
Waite Charles Hoyt
Robert Cal Hubbard
Carl Owen Hubbell
Miller James Huggins
James Augustus Hunter
Reginald Martinez Jackson
Travis Calvin Jackson
Ferguson Arthur Jenkins
Hugh Ambrose Jennings
Byron Bancroft Johnson
William Julius Johnson
Walter Perry Johnson
Albert William Kaline
Timothy John Keefe
William Henry Keeler
George Clyde Kell
Joseph James Kelley
George Lange Kelly
Michael Joseph Kelly
Harmon Clayton Killebrew Junior
Ralph McPherran Kiner
Charles Herbert Klein
William Joseph Klem
Kenesaw Mountain Landis
Thomas Charles Lasorda
Anthony Michael Lazzeri
Robert Granville Lemon
Walter Fenner Leonard
Frederick Charles Lindstrom

Muito obrigado pela atenção!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Na função gera_Historico() tens um strcpy(uce,uces[ind]); que pode dar asneira quando uces[ind] tiver mais de 40 caracteres.

Além disso fazes um malloc para `medias`, e nunca libertas essa memória.

Edit: o malloc não está relacionado com o "stack smashing".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Na função gera_Historico() tens um strcpy(uce,uces[ind]); que pode dar asneira quando uces[ind] tiver mais de 40 caracteres.

Na mouche...

   char *uces[]  = {"Sistemas de Suporte a Decisao",
	    "Criptografia e Seguranca de Sistemas de informacao",
	    "Engenharia de APlicacoes",
	    "Sistemas INteligentes",
	    "Engenharia de Redes e Servicos",
	    "Engenharia de LInguagens",
	    "Analise e Concepcao de Software",
	    "Metodos Formais em Engenharia de software",
	    "Sistemas DisTribuidos",
	    "Computacao Paralela Distribuida",
	    "Tecnologias e Protocolos de Infra-estrutura",
		    "BIOinformatica",
	    "Computacao Movel e Ubiqua",
	    "Computacao GRafica",
	    "Engenharia do COnhecimento",  // Estas duas últimas UCEs...
	    "Programacao CerTificada"};  // (...) são as menos requisitadas

Tinha aqui strings com mais de 40 caracteres, e não me tinha apercebido! Mas o programa estava a imprimi-las bem no ficheiro.... Sabes explicar-me porquê?

Além disso fazes um malloc para `medias`, e nunca libertas essa memória.

Nunca sei quando devo ou não utilizar free()...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Simples: Quando usas um malloc deves no fim usar o free. Quando não usas, não deves.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Simples: Quando usas um malloc deves no fim usar o free. Quando não usas, não deves.

Sempre? Sem qualquer tipo de excepção?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Boas! Tou a fazer um programa em C que gera um Histórico de alunos.... Essa parte (supostamente a mais dificil) já está! Mas ao sair da função, o programa dá este erro: "*** stack smashing detected ***", que pelo que andei a ver, é uma espécie de "segmentation fault"++... Será que alguém me pode ajudar?

Essa mensagem de erro é gerada devido a uma "medida" de segurança de alguns compiladores que consiste em inserir um valor no início do stack frame da função quando esta é chamada. Antes de retornar, a função verifica se o valor ainda lá está, e se não estiver, quer dizer que houve um stack overflow durante a execução de função (provavelmente um array declarado como local que foi escrito out-of-bounds, como parece ter sido o caso).

Todas as variaveis locais, incluindo os arrays, são alocadas no stack do processador (pelo menos, nas arquitecturas mais comuns aka no x86). O stack frame da função é um espaço que a função reserva no stack quando é chamada, e que é tornado inválido quando esta retorna. Como em C não existem function closures (isto é, funções com ambientes "envolventes" dedicados, onde as respectivas expressões "recaem" quando referenciam variaveis que não são locais), este mecanismo é usado para implementar o âmbito local das variaveis locais (i.e. porque em C as funções só podes aceder a variaveis locais à função e a variaveis globais). Desculpa se te baralhei!

-fstack-protector

    Emit extra code to check for buffer overflows, such as stack smashing attacks.  This is done by adding a guard variable to

    functions with vulnerable objects.  This includes functions that call alloca, and functions with buffers larger than 8

    bytes.  The guards are initialized when a function is entered and then checked when the function exits.  If a guard check

    fails, an error message is printed and the program exits.

No GCC, se bem me lembro, podes desligar a verificação com a opção.-fnostack-protector. É claro que a solução correcta é corrigir o bug. :-D

Também é possível que encontres um bug deste género num programa normalmente destribuido em binário, mas que tu tenhas resolvido compilar (por a versão normalmente destribuida ter sido compilada com uma versão antiga do GCC que não activava a verificação automaticamente). Por acaso, isso aconteceu comigo há uns meses.

Sempre? Sem qualquer tipo de excepção?

A questão é: tens de libertar a memória. Por várias razões, a maioria dos sistemas operativos não tem problemas se os programas terminarem sem libertar a memória. No entanto, há várias razões porque te deves habituar a libertá-la manualmente (i.e. chamar o free() quando não precisas da memória alocada com o malloc()):

- Há ambientes que não "sabem" libertar a memória automaticamente quando o programa sai. Por exemplo, no DOS, um programa .EXE que aloque memória e não a desaloque está a comprometer o sistema. O mesmo se passa com o kernel do Linux, que não sabe desalocar a memória que os módulos (drivers) deixam por desalocar. O mesmo para alguns (muitos?) sistemas embebidos.

- Se quiseres que o teu programa fique a correr durante muito tempo (por exemplo, se for um sevidor ou se for um programa interactivo), então vais querer devolver a memória ao sistema assim que não precisares dela. Isto passa-se porque, se precisares de memória mais tarde e chamares o malloc(), podes reutilizar aquela que libertaste (idem para outros proramas que precisem de memória).

- É uma boa prática, e faz parte do "pacote" de coisas que um programador de C tem que saber. Quero dizer, mesmo num sistema que não precise, deves fazer sempre free() à memória de que não precisares simplesmente porque é um bom exercício de programação, e mais cedo ou mais tarde vais ter de escrever código em que não tens outro remédio.

- Se fizeres fork(), crias um novo processo. Esse processo é uma cópia daquele que chamou o fork(), e como tal, toda a memória que o antigo alocou também está alocada pelo novo processo, e portanto, pela lógica, seria uma boa prática o novo processo fazer free() de toda essa memória antes de terminar. No entanto, afaik, acho que é uma situação em que geralmente se despensa o free(). Esta situação é um bocado específica... O fork() não se usa muito, até porque não faz parte do standard ANSI C.

JJ

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora