valgrind donne lecture invalide de taille 1
Je suis passé par plusieurs de même posé des questions concernant le même code d'erreur, la plupart de souci avec le passage de pointeur non valide les adresses de retour. Toutefois, cela ne semble pas être le cas ici, que mon programme fonctionne correctement avec n'importe quelle adresse est passée en retour.
format_string:
static char *format_string(char *string)
{
int i;
if (string == NULL) {
return string;
}
string[0] = (char)toupper((int)string[0]);
111->for (i = 1; string[i] != 'static char *format_string(char *string)
{
int i;
if (string == NULL) {
return string;
}
string[0] = (char)toupper((int)string[0]);
111->for (i = 1; string[i] != '\0'; i++) {
if (!isalpha(string[i-1])) {
string[i] = (char)toupper((int)string[i]);
} else {
string[i] = (char)tolower((int)string[i]);
}
if (string[i] == '/' || string[i] == '\\') {
string[i] = ' ';
}
}
/* Remove End of string White Spaces */
while (string[--i]==' '); string[++i]='\0';
return string;
}
'; i++) {
if (!isalpha(string[i-1])) {
string[i] = (char)toupper((int)string[i]);
} else {
string[i] = (char)tolower((int)string[i]);
}
if (string[i] == '/' || string[i] == '\\') {
string[i] = ' ';
}
}
/* Remove End of string White Spaces */
while (string[--i]==' '); string[++i]='static char *format_string(char *string)
{
int i;
if (string == NULL) {
return string;
}
string[0] = (char)toupper((int)string[0]);
111->for (i = 1; string[i] != '\0'; i++) {
if (!isalpha(string[i-1])) {
string[i] = (char)toupper((int)string[i]);
} else {
string[i] = (char)tolower((int)string[i]);
}
if (string[i] == '/' || string[i] == '\\') {
string[i] = ' ';
}
}
/* Remove End of string White Spaces */
while (string[--i]==' '); string[++i]='\0';
return string;
}
';
return string;
}
metadata_extract:
static int metadata_extract(const char *filename, struct kw_metadata *s)
{
char *memchar = NULL;
s->obj = NULL;
s->do_cleanup = &do_on_cleanup;
if (!is_of_type(filename)) {
return KW_ERROR;
}
TagLib_File* file = taglib_file_new(filename);
TagLib_Tag* tag = taglib_file_tag(file);
s->type = strdup("Audio");
s->tagc = 4;
s->tagtype = (char **)malloc(4 * sizeof(char *));
s->tagv = (char **)malloc(4 * sizeof(char *));
memchar = strdup("title");
s->tagtype[0] = memchar;
memchar = strdup("artist");
s->tagtype[1] = memchar;
memchar = strdup("album");
s->tagtype[2] = memchar;
memchar = strdup("genre");
s->tagtype[3] = memchar;
153->memchar = strdup(taglib_tag_title(tag));
memchar = format_string(memchar);
s->tagv[0] = memchar;
memchar = strdup(taglib_tag_artist(tag));
memchar = format_string(memchar);
s->tagv[1] = memchar;
memchar = strdup(taglib_tag_album(tag));
160->memchar = format_string(memchar);
s->tagv[2] = memchar;
memchar = strdup(taglib_tag_genre(tag));
memchar = format_string(memchar);
s->tagv[3] = memchar;
s->obj = file;
s->do_init = &do_on_init;
s->do_cleanup = &do_on_cleanup;
taglib_tag_free_strings();
taglib_file_free(file);
return KW_SUCCESS;
}
valgrind:
==16769== Invalid read of size 1
==16769== at 0x5317605: format_string (plugin_taglib.c:111)
==16769== by 0x531781F: metadata_extract (plugin_taglib.c:160)
==16769== by 0x405EB3: metadata_extract (metadata_extract.c:36)
==16769== by 0x403351: add_metadata_file (dbbasic.c:221)
==16769== by 0x4032D5: add_file (dbbasic.c:174)
==16769== by 0x406485: import_semantics (import.c:97)
==16769== by 0x406440: import_semantics (import.c:92)
==16769== by 0x4065AC: import (import.c:127)
==16769== by 0x401916: main (kwest_main.c:87)
==16769== Address 0x6f4ce11 is 0 bytes after a block of size 1 alloc'd
==16769== at 0x4C2B3F8: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==16769== by 0x57A6D71: strdup (strdup.c:43)
==16769== by 0x531780F: metadata_extract (plugin_taglib.c:159)
==16769== by 0x405EB3: metadata_extract (metadata_extract.c:36)
==16769== by 0x403351: add_metadata_file (dbbasic.c:221)
==16769== by 0x4032D5: add_file (dbbasic.c:174)
==16769== by 0x406485: import_semantics (import.c:97)
==16769== by 0x406440: import_semantics (import.c:92)
==16769== by 0x4065AC: import (import.c:127)
==16769== by 0x401916: main (kwest_main.c:87)
- Pourquoi le
const
dans la déclaration deformat_string
? C'est un mensonge flagrant. - parce que je dois passer l'adresse de fonction et il s'attend à ce format :/
Vous devez vous connecter pour publier un commentaire.
Dans
vous êtes en train de lire
string[-1]
, qui est généralement d'une défaillance de lire de taille 1.Sans doute que vous vouliez dire
Après edit:
Avant la boucle, vous devez vérifier que la chaîne a au moins un caractère avant que ça se termine,
(mieux fait avant
string[0] = (char)toupper((int)string[0]);
même). Le messagevous dit que l'un de vos
strdup
ed cordes a vide (bloc de taille 1 signifie seulement l'espace pour les 0-terminator a été attribué).Lorsque vous marquent les espaces,
vous n'avez pas de vérifier si l'indice est valable, si l'ensemble de la chaîne se composait d'espaces, vous l'avez lu au moins
string[-1]
, vous devez vérifier que:format_string
.Essayer de valider avec if (NULL != memchar) avant d'utiliser la variable; sinon
strdup
et des fonctions semblables, donner des résultats imprévisibles.