différence entre strmov et strcpy ? - C - Programmation
Marsh Posté le 29-03-2005 à 02:53:20
"La fonction strmov() utilisée dans cet exemple est inclue dans la bibliothèque mysqlclient et fonctionne comme strcpy() mais retourne un pointeur sur le nul de fin du premier paramètre. Valeur de retour La longueur de la valeur passée dans to , n'incluant pas la caractère nul de fin de chaîne."
http://www.nexen.net/docs/mysql/an [...] string.php
Marsh Posté le 29-03-2005 à 02:56:49
mais est-ce que src est "déplacé" dans dst en pratique
et qu'est ce qui se passe si src est effacé après coup ? (a priori rien ?)
Je demande ca aussi par rapport à la version assembler qui semble faire un movb pour chaque caractère
Code :
|
Marsh Posté le 29-03-2005 à 03:07:28
c'est justement dans le cadre de mysql que je m'y interesse
Code :
|
apparement cette fonction crash dans certains cas, quand un thread se termine et qu'on doit fermer les temp table rattachée à la connexion (et donc marquer DROP /*!40005 TEMPORARY */ TABLE IF EXISTS ... dans le binlog).
Me demande si c'est un problème d'estimation de la taille de query_buf_size ou un autre problème
Ce qui est bizarre c'est que si dans le thread y a des users temp table et des temp table "internes", il va quand même écrire dans le binlog le DROP TABLE sur la table interne
C'est louche
Marsh Posté le 29-03-2005 à 09:58:26
Je doute que ça plante dans le strmov vu que 50 char son alloués au minimum. Par contre je verrais bien un plantage dans le strxmov qui suit.
Le query_buf_size+= table->key_length+1;
alors que strxmov (google) concatène plus de choses, à savoir :
# end = strxmov(end,"`",table->table_cache_key,"`.`",
# table->real_name,"`,", NullS);
soit 3 caractères, le cache_key et le real_name.
Donc si cette chaine fait moins de 50+table->key_length+1, ça passe, sinon ça casse.
Le code correct serait plutôt :
query_buf_size+= table->key_length + table->real_name_length + 6;
avec une longueur initiale de 22 octets (pour le strmov).
Autre chose, le commentaire "// we might be out of memory, but this is not fatal", semblant signifier que alloc_root ne retourne pas forcément la mémoire demandée, auquel cas le strxmov derrière peut se ramasser.
Si c'est le cas, pour moi, ça ferait 2 bugs potentiels à vérifier.
Enfin, en question subsidiaire, vérifier le comportement de strxmov en cas d'overlapping entre src et dst.
Marsh Posté le 29-03-2005 à 10:52:05
joce a écrit : apparemment un strmov fait ca :
|
Déjà ce n'est pas tout à fait correct. Si la fonction est vraiment écrite comme ça alors elle va foirer si on l'appelle de cette façon
strmov(ptr + 1, ptr) |
Elle recopiera le premier octet de "src" à l'infini.
Pour qu'elle fonctionne correctement, elle doit d'abord regarder les positions de "src" et "dst". Si "dst" est placé après "src", elle doit alors balayer "src" à reculon pour que ça marche à 100%. Si "dst" est placé avant "src", alors elle doit balayer "src" normallement.
Marsh Posté le 30-03-2005 à 17:44:24
Notez que d'apres la description que vous en donnez, strmov fait la meme chose que stpcpy, qui est disponible sur de nombreux systeme (mais ne fais partie d'aucun standard).
Marsh Posté le 02-04-2005 à 20:01:47
el muchacho a écrit : Je doute que ça plante dans le strmov vu que 50 char son alloués au minimum. Par contre je verrais bien un plantage dans le strxmov qui suit. |
T'as pas du faire attention au commentaire :
# /*
# We are going to add 4 ` around the db/table names, so 1 does not look
# enough; indeed it is enough, because table->key_length is greater (by 8,
# because of server_id and thread_id) than db||table.
# */
Marsh Posté le 29-03-2005 à 02:43:26
apparemment un strmov fait ca :
quelle différence avec strcpy ? (hormis que strmov fait pointer vers le \0 final)
Message édité par joce le 29-03-2005 à 02:45:42