tete du loic

 Loïc YON [KIUX]

  • Enseignant-chercheur
  • Référent Formation Continue
  • Responsable des contrats pros ingénieur
  • Référent entrepreneuriat
  • Responsable de la filière F2 ingénieur
  • Secouriste Sauveteur du Travail
mail
loic.yon@isima.fr
phone
(+33 / 0) 4 73 40 50 42
location_on
ISIMA
  • twitter
  • linkedin
  • viadeo

[TOOLS] Mémoire

Date de première publication : 2023/06/23

Cette page est en cours d'écriture

Cette page est dédiée à l'utilisation d'outils d'amélioration de code sous l'angle de ma mémoire.

Il existe de nombreux outils en fonction de l'environnement de développement et des langages, on se concentrera sur le C/C++ avec des outils plutot génériques et libres.

Valgrind

Vous connaissez valgrind normalement. On l'utilise pour deux aspects intéressants :

Pour utiliser valgrind, il faut compiler avec l'option -g. Valgrind instrumente alors le binaire compilé et l'exécution sous valgrind peut être jusqu'à 40 fois plus lente que le code non instrumenté.

À l'exécution, valgrind vous proposera peut-être de le relancer avec des options pour avoir plus de détails, n'hésitez pas !

Valgrind est disponible sous Windows, LINUX mais pas pour les dernières versions de MacOS. Pour le reste, rendez-vous sur :

Valgrind est vu en TP et vous avez une description dans le sujet du projet et notamment l'utilisation de valgrind avec la SDL2 (section 8.4).

https://valgrind.org/

Les "sanitizers"

Les sanitizers sont des outils qui ont été ajoutés aux compilateurs (clang et gcc notamment) pour un meilleur développement. Le code est instrumenté à la compilation (ce qui permet, en général de meilleures performances que valgrind) et des versions adaptées de fonctions peuvent être appelées au travers de l'édition des liens (par exemple, pour appeler des versions adaptées de malloc() et free())

Il existe de nombreux sanitizers qui sont dépendants des compilateurs (clang est plus riche). Il faut les spécifier un par un et faire attention à la compatibilité entre eux.

Voici la page de documentation officielle de gcc qui en traite :

https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html
Vous pourrez par exemple préciser : -fsanitize=address,undefined

Address Sanitizer (ASAN)

Ce module est un "must-have", il permet de détecter :

Prenez l'exemple suivant :


int main() {
	char s[50] = "detection or not" ;
	printf("%c\n", s[51]);
  
	return 0;
}

clang détecte le problème directement à la compilation, gcc non. Le sanitizer le détecte également.

Sur un cas à peine différent, ni clang ni gcc ne voient quoi que ce soit à la compilation


int main() {
	char * s = "detection or not";
	printf("%c\n", s[51]);
  
	return 0;
  }

Undefined Behavior Sanitizer (UBSAN)

Comme son nom l'indique, ce sanitizer concerne les comportements "indéfinis", c'est-à-dire les comportements non spécifiés car ils ne devraient pas se produire. Les exmeples sont légions : utiliser une variable statique avant son initialisation, diviser par 0, des dépassements d'opérations entières, ...

Quelques liens :

Thread Sanitizer (UBSAN)

https://github.com/google/sanitizers/wiki/ThreadSanitizerCppManual

Si vous comptez faire de la programmation multithread, activez cette option !

https://medium.com/@lucianoalmeida1/i-little-bit-about-thread-sanitizer-56a887dc144

Dr Memory

Dr Memory est un programme à l'image de valgrind : un couteau suisse qui s'installe sur de nombreux systèmes d'exploitation (hormis, là encore, les derniers MacOs). L'installation est rapide et l'exécution tout autant. Tout se trouve à l'url : https://drmemory.org/