GCC calcule par exemple automatiquement la taille des buffers pour la passer en paramètre des fonctions "sécurisées".
Voici un exemple d’un programme compilé sans FORTIFY_SOURCE et avec (-D_FORTIFY_SOURCE=2) :
- 08048400 <foo>:
- 8048400: 83 ec 3c sub esp,0x3c
- 8048403: 8b 44 24 40 mov eax,DWORD PTR [esp+0x40]
- 8048407: 89 44 24 04 mov DWORD PTR [esp+0x4],eax
- 804840b: 8d 44 24 1c lea eax,[esp+0x1c]
- 804840f: 89 04 24 mov DWORD PTR [esp],eax
- 8048412: e8 b9 fe ff ff call 80482d0 <strcpy@plt>
- 8048417: 83 c4 3c add esp,0x3c
- 804841a: c3 ret
- 08048420 <foo>:
- 8048420: 83 ec 3c sub esp,0x3c
- 8048423: c7 44 24 08 14 00 00 mov DWORD PTR [esp+0x8],0x14
- 804842a: 00
- 804842b: 8b 44 24 40 mov eax,DWORD PTR [esp+0x40]
- 804842f: 89 44 24 04 mov DWORD PTR [esp+0x4],eax
- 8048433: 8d 44 24 1c lea eax,[esp+0x1c]
- 8048437: 89 04 24 mov DWORD PTR [esp],eax
- 804843a: e8 d1 fe ff ff call 8048310 <__strcpy_chk@plt>
- 804843f: 83 c4 3c add esp,0x3c
- 8048442: c3 ret
On voit que la fonction appelée dans le code compilé avec FORTIFY_SOURCE n’est plus strcpy, mais strcpy_chk, qui prends un paramètre de plus : la taille du buffer.
On voit que gcc calcule automatiquement le dernier paramètre à passer à strcpy_chk.