Quali potrebbero essere le possibili ragioni per questo e come posso correggerlo?
Uno scenario sarebbe il seguente esempio:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void swap (char *a , char *b);
void revSTR (char *const src);
int main (void){
char arr[] = "A-B-C-D-E";
revSTR(arr);
printf("ARR = %s\n", arr);
}
void swap (char *a , char *b){
char tmp = *a;
*a = *b;
*b = tmp;
}
void revSTR (char *const src){
char *start = src;
char *end = start + (strlen(src) - 1);
while (start < end){
swap(&(*start) , &(*end));
start++;
end--;
}
}
In questo programma è possibile invertire una stringa o di una parte della stringa se per esempio chiamata reverse()
con qualcosa di simile:
reverse(arr + 2);
Se si decide di passare la lunghezza della matrice in questo modo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void swap (char *a , char *b);
void revSTR (char *const src, size_t len);
int main (void){
char arr[] = "A-B-C-D-E";
size_t len = strlen(arr);
revSTR(arr, len);
printf("ARR = %s\n", arr);
}
void swap (char *a , char *b){
char tmp = *a;
*a = *b;
*b = tmp;
}
void revSTR (char *const src, size_t len){
char *start = src;
char *end = start + (len - 1);
while (start < end){
swap(&(*start) , &(*end));
start++;
end--;
}
}
Funziona bene.
Ma quando si esegue questa operazione:
revSTR(arr + 2, len);
Si ottiene ottenere:
==7125== Command: ./program
==7125==
ARR = A-
*** stack smashing detected ***: ./program terminated
==7125==
==7125== Process terminating with default action of signal 6 (SIGABRT)
==7125== at 0x4E6F428: raise (raise.c:54)
==7125== by 0x4E71029: abort (abort.c:89)
==7125== by 0x4EB17E9: __libc_message (libc_fatal.c:175)
==7125== by 0x4F5311B: __fortify_fail (fortify_fail.c:37)
==7125== by 0x4F530BF: __stack_chk_fail (stack_chk_fail.c:28)
==7125== by 0x400637: main (program.c:14)
E questo accade perché nel primo codice, la lunghezza del arr
viene verificata all'interno di revSTR()
che va bene, ma nel secondo codice in cui si passa la lunghezza:
revSTR(arr + 2, len);
la lunghezza ora è più lunga della lunghezza effettivamente passata quando dici arr + 2
.
Lunghezza strlen (arr + 2)
! = strlen (arr)
.
Potresti identificare quali parti del tuo codice causano la distruzione dello stack e pubblicarlo? Quindi probabilmente saremo in grado di indicare esattamente perché succede e come correggerlo. –