Programmation Avancée en C


Table des matières détaillée de l'ouvrage


Avant-propos
Le langage C
Organisation de cet ouvrage
Notations
Remerciements
Chapitre 1. Survol rapide du langage C
(top)
1.1. Un premier programme
1.1.1. Compilation
1.1.2. Eléments du programme Hello World
1.2. Etude d'un second exemple et structure d'un programme C typique
1.2.1. Directives au préprocesseur
1.2.2. Déclarations et définitions de variables
1.2.3. Définitions de fonctions
1.3. Notion d'identificateur
1.4. Conventions d'écritures d'un programme C
1.5. Les principaux types
1.5.1. Les caractères
1.5.2. Les entiers
1.5.3. Les flottants
1.5.4. Le type void
1.5.5. Les autres types
1.6. Structures de contrôle
1.7. Opérateurs et expressions
1.8. Entrées / sorties de base
1.8.1. La fonction d'écriture à l'écran printf
1.8.2. La fonction de saisie scanf
1.9. Exercices
PREMIERE PARTIE : LE LANGAGE C
Chapitre 2. Syntaxe et sémantique générales
(top)
2.1. Jeu de caractères
2.2. Les mots-clefs
2.3. Les commentaires
2.4. Expressions et Opérateurs
2.4.1. Les opérateurs arithmétiques
2.4.2. Les opérateurs bit-à-bit
2.4.3. Les opérateurs d'affectation
2.4.4. Les opérateurs relationnels
2.4.5. Les opérateurs logiques
2.4.6. Les opérateurs d'accès à la mémoire
2.4.7. Autres opérateurs
2.5. Constructions et structures de contrôle
2.5.1. Les branchements conditionnels
2.5.2. Les boucles
2.5.3. Les branchements inconditionnels
2.5.4. Les autres constructions
2.6. Fonctions et variables
2.6.1. Déclarations
2.6.2. Définitions (et appels) de fonctions
2.6.3. Définitions et portée des variables
2.7. Exercices
Chapitre 3. Types
(top)
3.1. Les types entiers
3.1.1. Les caractères
3.1.2. Les entiers
3.1.3. Nombres signés / non signés et leurs représentations
3.1.4. Les booléens
3.2. Les nombres à virgule flottante
3.2.1. Représentation interne
3.2.2. Cas des constantes flottantes
3.2.3. Les nombres complexes
3.3. Le type void
3.4. Spécificateurs de classe de stockage
3.5. Le spécificateur de fonction inline
3.6. Qualificatifs de types
3.6.1. const
3.6.2. volatile
3.6.3. restrict
3.7. Définition de synonymes pour les noms de types avec typedef
3.8. Les conversions de type
3.8.1. La règle de "promotion des entiers"
3.8.2. Les conversions arithmétiques habituelles
3.8.3. Les surprises de la conversion de type
3.9. Les pointeurs
3.9.1. Déclaration d'un pointeur
3.9.2. Les pointeurs génériques void *
3.9.3. Le pointeur spécial NULL
3.9.4. Opérateurs de manipulation des pointeurs
3.9.5. Initialisation d'un pointeur
3.9.6. Arithmétique des pointeurs
3.9.7. Allocation et libération dynamique de mémoire
3.10. Pointeurs sur une fonction
3.11. Les énumérations
3.12. Les tableaux
3.12.1. Initialisation d'un tableau
3.12.2. Le cas particulier des chaînes de caractères
3.12.3. Tableaux multidimensionnels
3.12.4. Passage de tableau en paramètre
3.12.5. Relation entre tableaux et pointeurs
3.12.6. Cas des tableaux de chaînes de caractères
3.12.7. Gestion des arguments de la ligne de commande
3.13. Les structures
3.13.1. Initialisation et affectation d'une structure
3.13.2. Comparaison de structures
3.13.3. Tableau de structures
3.13.4. Pointeur vers une structure
3.13.5. Structures auto-référées
3.13.6. Les champs de bits
3.14. Les unions
3.14.1. Déclaration d'une union
3.14.2. Utilisation pratique des unions
3.14.3. Une méthode pour alléger l'accès aux membres
3.15. Les littéraux composés
3.16. Exercices
Chapitre 4. Entrées / Sorties
(top)
4.1. Entrée standard, sorties standards, et utilisation des formats
4.1.1. Lecture et écriture de caractères depuis stdin et stdout : getchar et putchar
4.1.2. Ecriture de chaînes sur la sortie standard: puts
4.1.3. Lecture de chaînes depuis l'entrée standard : gets
4.1.4. Ecriture formatée de chaînes sur la sortie standard: printf
4.1.5. Lecture formatée de chaînes depuis l'entrée standard : scanf
4.2. Ouverture et fermeture de flots de données
4.2.1. Ouverture de fichiers : la fonction fopen
4.2.2. Détection de fin de fichier
4.2.3. Fermeture de fichiers: la fonction fclose
4.3. Lectures/écritures sur flots de données
4.3.1. Lecture et écriture de caractères sur un flot de données: fgetc et fputc
4.3.2. Ecriture de chaînes sur un flot de données: fputs
4.3.3. Lecture de chaînes depuis un flot de données : fgets
4.3.4. Ecriture formatée de chaînes sur flot de données : fprintf
4.3.5. Lecture formatée de chaînes depuis un flot de données : fscanf
4.3.6. Lecture / écriture formatée sur chaîne de caractères: sprintf , snprintf et sscanf
4.3.7. Entrées-sorties binaires : fread et fwrite
4.3.8. Positionnement dans un flot de données
4.4. Exercices
Chapitre 5. Les directives du préprocesseur
(top)
5.1. Inclusion de fichiers : la directive #include
5.2. Définition de macros
5.2.1. Définition de constantes
5.2.2. Les macros avec paramètres
5.3. La compilation conditionnelle
5.3.1. Condition liée à la valeur d'une expression
5.3.2. Condition liée à l'existence d'un symbole
5.3.3. La commande #error
5.4. Directives plus rarement utilisées
5.4.1. #line
5.4.2. La commande #pragma
5.4.3. La directive nulle
5.5. Exercices
Chapitre 6. La bibliothèque standard
(top)
6.1. Implémentations hosted / freestanding
6.2. Diagnostics d'erreurs : assert.h
6.3. Gestion des nombres complexes complex.h
6.4. Classification de caractères et changements de casse ctype.h
6.5. Numéro de la dernière erreur errno.h
6.6. Gestion de l'environnement à virgule flottante fenv.h
6.6.1. Gestion des exceptions
6.6.2. Gestion des arrondis
6.6.3. Gestion des environnements en virgule flottante.
6.6.4. Contraction des expressions
6.7. Intervalle et précision des nombres flottants float.h
6.8. Extension des types entiers inttypes.h et stdint.h
6.9. Alias d'opérateurs logiques et binaires iso646.h
6.10. Intervalle de valeur des types entiers limits.h
6.11. Gestion de l'environnement local locale.h
6.12. Les fonctions mathématiques de math.h
6.12.1. Gestion des erreurs
6.12.2. Fonctions trigonométriques et hyperboliques
6.12.3. Fonctions exponentielles, puissances et logarithmiques
6.12.4. Autres fonctions
6.12.5. Quelques ajouts de C99
6.13. Branchements non locaux setjmp.h
6.14. Manipulation des signaux signal.h
6.15. Nombre variable de paramètres stdarg.h
6.16. Définition du type booléen stdbool.h
6.17. Définitions standards stddef.h
6.18. Gestion des entrées / sorties stdio.h
6.18.1. Manipulation de fichiers
6.18.2. Lectures / écritures de base
6.18.3. Lectures / écritures formatées de chaînes de caractères
6.19. Utilitaires généraux stdlib.h
6.19.1. Allocation dynamique
6.19.2. Génération de nombres pseudo-aléatoires
6.19.3. Conversion de chaînes de caractères en nombres
6.19.4. Arithmétique sur les entiers
6.19.5. Recherche et tri dans un tableau
6.19.6. Contrôles d'exécution et d'environnement
6.20. Manipulation de chaînes de caractères string.h
6.21. Macros génériques pour les fonctions mathématiques tgmath.h
6.22. Date et heure time.h
6.23. Manipulation de caractères étendus wchar.h et wctype.h
DEUXIEME PARTIE : PROGRAMMATION AVANCEE EN LANGAGE C
Chapitre 7. Tester et débugger un programme
(top)
7.1. Débugger avec le langage lui-même
7.1.1. Afficher des valeurs : printf
7.1.2. assert
7.2. Débuggeurs
7.2.1. Gdb, le débuggeur GNU
7.2.2. Valgrind
7.3. Bibliothèques spécialisées
7.4. Tests
7.4.1. Jeux de tests
7.4.2. Fuzzing
7.5. Pour aller plus loin, d'autres outils
7.6. Exercices
Chapitre 8. Programmation modulaire et bibliothèques
(top)
8.1. Programmation modulaire
8.1.1. Eviter les erreurs d'inclusions multiples
8.1.2. La compilation séparée
8.1.3. Quelques notes supplémentaires
8.2. Bibliothèques
8.2.1. Bibliothèques statiques et partagées
8.2.2. Utiliser une bibliothèque
8.2.3. Créer une bibliothèque
8.2.4. Interposition
8.3. Introduction à l'outil make
8.3.1. Principe de base
8.3.2. Création d'un Makefile
8.3.3. Variables
8.3.4. Règles génériques
8.3.5. Inclusions
8.3.6. Utiliser gcc pour générer une liste de dépendances
8.3.7. Nettoyage
8.4. Exercices
Chapitre 9. Quelques notions de systèmes et d'architecture
(top)
9.1. Système d'exploitation, mode noyau, mode utilisateur
9.2. Disposition d'un programme en mémoire
9.3. Appels de fonction
9.4. Appels système
9.5. « Boutisme »
9.6. Alignement des données
9.7. Caches
9.8. Exercices
Chapitre 10. Programmation en C et sécurité
(top)
10.1. Tout le monde est concerné
10.2. Failles de sécurité courantes en C
10.2.1. Débordements de tampons
10.2.2. Race conditions
10.2.3. Débordements sur les nombres
10.2.4. Problèmes de chaînes de caractères
10.2.5. Fichiers temporaires
10.3. Mieux vaut prévenir que guérir
10.3.1. Validation des entrées
10.3.2. Confinement et séparation des pouvoirs
10.3.3. Outils d'analyse de code
10.3.4. Cryptographie
10.4. Exercice
Chapitre 11. Optimisation
(top)
11.1. Mesures de performances
11.1.1. Ajouter du code pour mesurer le temps
11.1.2. Profilers
11.2. Techniques d'optimisation
11.2.1. « Bonne programmation »
11.2.2. Trucs et astuces
11.2.3. Utiliser les possibilités du système et du compilateur
11.3. Exercices
Chapitre 12. Utiliser C avec d'autres langages
(top)
12.1. Inclure de l'assembleur dans du C avec gcc
12.2. Interfacer C avec un autre langage
12.2.1. Un cas simple : C++
12.2.2. Swig
12.2.3. L'exemple de Perl
12.2.4. Utiliser du code d'un langage de haut niveau depuis C
12.2.5. Exercices
TROISIEME PARTIE : INTRODUCTION A LA PROGRAMMATION POSIX
Chapitre 13. Programmation système Unix / POSIX
(top)
13.1. Accès aux fichiers
13.1.1. Les principaux appels système d'accès aux fichiers
13.1.2. Position dans un fichier
13.1.3. Descripteurs de fichiers standards
13.1.4. Duplication de descripteurs
13.1.5. Encore quelques appels sur les fichiers
13.2. Gestion de processus
13.2.1. Création de processus et exécution de programme
13.2.2. Attendre un processus
13.3. Communications et synchronisation inter-processus
13.3.1. Signaux
13.3.2. Tubes
13.3.3. Mapping de fichiers, mémoire partagée et sémaphores
13.4. Threads
13.4.1. Gestion des threads
13.4.2. Synchronisation des threads
13.5. Exercices
Chapitre 14. Sockets et programmation réseau POSIX
(top)
14.1. Quelques notions de réseaux
14.1.1. Modèles OSI et TCP/IP
14.1.2. Encapsulation des données
14.1.3. Modèle de communication Client / Serveur
14.1.4. Adressage réseau
14.1.5. Ports et services réseaux
14.1.6. Nommage
14.2. Généralités sur les sockets
14.2.1. Caractéristiques
14.2.2. Descripteurs de fichiers et descripteurs de sockets
14.2.3. Les différentes structures de socket
14.2.4. Fonctions communes sur les sockets
14.3. Sockets TCP
14.3.1. Connexion TCP d'un client à un serveur via connect
14.3.2. Envoi et réception de données
14.3.3. Exemple d'un client TCP simple
14.3.4. Attente de connexions (sur le serveur) : listen
14.3.5. Accepter une connexion sur le serveur via accept
14.3.6. Traitement concurrentiel des requêtes clientes sur le serveur
14.3.7. Fermeture paramétrable d'une socket TCP: shutdown
14.3.8. Exemple d'un serveur TCP simple
14.4. Sockets UDP
14.4.1. Envoi de données: sendto
14.4.2. Réception de données: recvfrom
14.4.3. Exemple d'un client / serveur UDP simple
14.5. Sockets Unix
14.5.1. Calcul de la taille effective d'une adresse de socket Unix
14.5.2. Socket Unix par flot
14.5.3. Socket Unix par datagrammes
14.5.4. Socket Unix anonymes: socketpair
14.6. Aspects avancés de la programmation des sockets
14.6.1. Multiplexage d'entrées / sorties avec select
14.6.2. Entrées / sorties non bloquantes
14.6.3. Passage de descripteurs entre processus
14.7. Exercices
Annexes
A. Correction des exercices
(top)
B. Licences
B.1. Licence du stdbool.h d'OpenBSD
B.2. Licence du gets d'OpenBSD
B.3. Licence du execl d'OpenBSD
Bibliographie
Index