Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    [C] strcpy con architettura a 64bit

    Ciao a tutti,
    Un programma scritto da oltre 6 anni compilato con gcc 3.8 mi dà problemi dopo averlo compilato su un pc a 64bit compilandolo con gcc 4.6. Dopo averci perso giornate ho visto che il problema è sulle strcpy: il programma si inchioda non appena deve eseguirne una. Ho controllato le stringhe e le lunghezze di sorgente e destinazione sono compatibili.
    Qualcuno può darmi delle indicazioni?

    Grazie!

  2. #2
    Il comportamento della strcpy è identico indipendentemente dall'architettura, quindi il problema starà in come viene usata... cerca di isolare un blocco di codice che presenta il problema che magari ci diamo un'occhiata insieme.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    ho isolato il pezzo che dà problemi:

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

    FILE *fp;
    FILE *de;
    FILE *va;

    char stri[100];
    char strip[120];

    int main(void)
    {
    /* apre il file di testo in lettura/scrittura */
    if ((fp=fopen("C:\\CODIFICATORE\\TEST.TXT","w"))==NUL L)
    {
    printf("Impossibile aprire il file test.\n");
    exit(-1);
    }

    if ((de=fopen("C:\\CODIFICATORE\\MESSAGGI.TXT","w+")) ==NULL)
    {
    printf("Impossibile aprire il file messaggi.\n");
    exit(-1);
    }

    if ((va=fopen("C:\\CODIFICATORE\\VALVAR.TXT","r"))==N ULL)
    {
    printf("Impossibile aprire il file dei valori.\n");
    exit(-1);
    }


    float DLT_2CAM = 1;
    float DLT_2NAL = 2;
    char *DLT_2SEP=malloc(sizeof(char)*30);
    char *DLT_4CFI=malloc(sizeof(char)*5);
    char *DLT_4FA1=malloc(sizeof(char)*5);
    char *DLT_4FAM = "PR19632 ";

    fscanf ( va,"%s",strip);
    DLT_2CAM = atof(strip);
    fscanf ( va,"%s",strip);
    DLT_2NAL = atof(strip);
    fscanf ( va,"%s",strip);
    strcpy ( DLT_2SEP,strip);
    fscanf ( va,"%s",strip);
    strcpy ( DLT_4CFI,strip);
    fscanf ( va,"%s",strip);
    strcpy ( DLT_4FA1,strip);
    fscanf ( va,"%s",strip);
    printf("Qui arrivo, ma poi si impianta");
    strcpy ( DLT_4FAM,strip);
    printf("Qui non arrivo");
    }

  4. #4
    Il contenuto del file C:\CODIFICATORE\VALVAR.TXT è il seguente:

    1
    2
    (null)
    (null)
    (null)
    PR
    N
    101
    100
    Z
    1234
    1223
    000

  5. #5
    char *DLT_4FAM = "PR19632 ";

    Ho fatto la prova, questa istruzione è come se creasse una memoria read-only per questa variabile...

    Se provi ad assegnare un valore a DLT_4FAM ti darà errore...il problema non è della strcpy.

    sostituisci con:
    codice:
    char *DLT_4FAM = (char*)malloc(10);
    DLT_4FAM = "PR19632 ";
    non ti darà errore

  6. #6
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    codice:
    char *DLT_4FAM = "PR19632 ";
    Non hai alocato memoria.Questa istruzione è lecita, e tutto va come deve andare fintanto che non fai un accesso in scrittura alla stringa.
    Perchè "PR19632 " è una costante, viene messa nell' area di sola lettura, puoi leggerla quanto vuoi ma non scriverla.
    Per cui con l' istruzione:

    codice:
    strcpy ( DLT_4FAM,strip);
    Accedi ad un' area di memoria che è di sola lettura.
    Ma è di sola lettura a runtime, non a compile time perchè DLT_4FAM è di tipo char* e non di tipo const char*, per proteggerti dal fare una cosa del genere avresti dovuto dichiararla di tipo const char*, o allocarci sopra memoria.
    E comunque utilizzi tre fopen e neanche una fclose.

  7. #7
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Originariamente inviato da ardito86
    char *DLT_4FAM = "PR19632 ";

    Ho fatto la prova, questa istruzione è come se creasse una memoria read-only per questa variabile...

    Se provi ad assegnare un valore a DLT_4FAM ti darà errore...il problema non è della strcpy.

    sostituisci con:
    codice:
    char *DLT_4FAM = (char*)malloc(10);
    DLT_4FAM = "PR19632 ";
    non ti darà errore
    Sbagliato, l' errore lo da comunque,ora DLT_4FAM perde l' indirizzo della zona di memoria allocata, e punta ad un' altra area di memoria che è di sola lettura.

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Originariamente inviato da ramy89
    Accedi ad un' area di memoria che è di sola lettura.
    ...
    E comunque utilizzi tre fopen e neanche una fclose.
    E aggiungo che non capisco come facesse a funzionare prima ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    grazie ardito86 e ramy89!

    Quello che mi chiedo è come mai abbia funzionato per 6 anni e abbia dato questo problema solo ora che ho ricomilato con gcc 4.6. Può essere che sia legato al fatto che sono passato dalla versione 3.8 di gcc alla 4.6? Sapete se c'è qualche opzione di compilazione che modifichi quanto mi avete detto e che magari era di default sulla 3.8?

    p.s.non ci sono fclose perchè quello che vi ho mandato è solo un pezzo del programma..

  10. #10
    Originariamente inviato da ramy89
    Sbagliato, l' errore lo da comunque,ora DLT_4FAM perde l' indirizzo della zona di memoria allocata, e punta ad un' altra area di memoria che è di sola lettura.
    è vero, hai ragione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.