À QUOI ÇA SERT ?
Une fonction permet d’encapsuler une opération réutilisable.
Au lieu d’écrire dix fois le même code :
Code: Select all
result = a + b;
Code: Select all
int add(int a, int b)
{
return a + b;
}
Code: Select all
int x = add(10, 20);
1. DÉCLARATION
Code: Select all
int add(int a, int b);
2. DÉFINITION
Code: Select all
int add(int a, int b)
{
return a + b;
}
3. PARAMÈTRES PAR VALEUR
Code: Select all
void increment(int value)
{
++value;
}
Code: Select all
int x{10};
increment(x);
Pourquoi ?
value est une copie locale.
4. RETOUR
Code: Select all
int doubleValue(int x)
{
return x * 2;
}
5. SURCHARGE
Code: Select all
int add(int a, int b);
double add(double a, double b);
La surcharge est utile pour fournir la même opération logique à plusieurs types.
6. LE TYPE DE RETOUR NE SUFFIT PAS
Ceci n’est pas valide :
Code: Select all
int f();
double f();
Quand tu écris :
Code: Select all
f();
7. auto COMME TYPE DE RETOUR
Code: Select all
auto add(int a, int b)
{
return a + b;
}
8. __func__
Code: Select all
void test()
{
std::cout << __func__;
}
Utile pour les logs.
9. CE QUI SE PASSE AU NIVEAU MACHINE
Une fonction C++ finit par devenir des instructions machine.
Lors d’un appel, les paramètres sont transmis selon une convention d’appel / ABI.
Sous Windows x64, pour les appels natifs classiques, les quatre premiers paramètres entiers/pointeurs sont généralement transmis dans :
Code: Select all
RCX
RDX
R8
R9
Le retour entier/pointeur est souvent dans RAX.
Exemple conceptuel :
Code: Select all
add(1, 2)
Code: Select all
mov ecx, 1
mov edx, 2
call add
C’est pourquoi comprendre les fonctions est essentiel en reverse engineering.
À RETENIR
Au niveau C++, une fonction est une abstraction.
Au niveau CPU, elle devient :
- préparation des arguments ;
- call ;
- changement du flot d’exécution ;
- exécution ;
- ret ;
- récupération du résultat.
