2015-07-19 1 views
0

supposons que j'ai beaucoup d'apparences de strcpy, strcat & memcpy dans notre projet (un très grand!). Comment puis-je détecter facilement tous les endroits où il y a un chevauchement entre les pointeurs source et destination?comment trouver des chevauchements entre src & dest dans strcpy (et des fonctions similaires)

Je sais que valgrind peut le faire mais tous les cas ne peuvent pas être détectés à l'exécution pendant que vilgrind est en cours d'exécution (il y a beaucoup de flux possibles). Est-ce que quelqu'un sait si gcc hardening peut offrir une solution à ce problème? ou peut-être une autre idée en plus d'emballer ces fonctions et de vérifier par moi-même?

+0

Aucune méthode ne permet de trouver de manière statique tous les problèmes potentiels de ce type. –

Répondre

0

Vous pouvez écrire un wrapper pour les vérifier dynamiquement.

void *memcpy_check(void *dest, const void *src, size_t n) 
{ 
    // Code to examine whether dest and src overlap. 
    // If overlap, abort() or report error. 
    memcpy(dest, src, n); 
} 

#define memcpy memcpy_check 

Avertissement qui ne comprend aucun en-tête du système après la ligne #define. Tous les en-têtes système requis doivent être #include d avant ces codes.

Il est impossible de vérifier statiquement car le compilateur ne connaît pas la valeur d'exécution de ces pointeurs.

0

Même une vérification au moment de l'exécution ne vous indiquera que les tests que vous avez exécutés s loin ne produisent pas de chevauchement de chaînes.

Une autre approche serait de ne pas inquiéter, et simplement changer tous les memcpy-memmove, et tous les strcpy(d,s)-memmove(d,s,strlen(s)+1) (qui peut bien sûr être mis en fonction en ligne). Dans la plupart des cas, la différence de performance serait négligeable. Cela devrait vous prendre 5 minutes entières avec perl qui sera une utilisation du temps considérablement plus productive que l'instrumentation du lot ou la compréhension de chaque appel.