Effectivement, il n'y pas de type void* en Safe C, parce que c'est quasiment impossible à vérifier à l'exécution.Citation:
Tu ne peux donc pas avoir un type void*, ce qui est quand même une des "features" majeures de C..
J'ai dû me creuser les méninges pour trouver un équivalent pratique, et après avoir examiné beaucoup de langages je suis arrivé à la solution suivante :
- ajout d'un attribut 'byte qui permet de convertir tous les types "paqués" en tableau de byte.
- conversion implicite de tous les types "paqués" en tableau de byte (donc byte[]) lors du passage de paramètres.
En clair, ces 2 règles permettent les choses suivantes :
etCode:
1
2
3
4
5
6
7 float f; int i; double l; f'byte = i'byte; // copie des 4 bytes du i dans les 4 bytes de f l'byte[0:2] = i'byte[0:2]; // recopie des 2 premiers bytes de i vers les 2 premiers bytes de l.
Pour ne pas mettre en péril la sécurité, il y a une restriction sur ces types 'paqués':Code:
1
2
3
4 // fonctions acceptant n'importe quel type "paqué" pour les I/O bas-niveau. int read (int fd, out byte[] buffer); int write (int fd, byte[] buffer);
ils ne peuvent pas contenir de pointeur sécurisé (donc p^).
Cela n'est pas gênant car il est rare de devoir sauver un pointeur sur disque ..
On peut donc écrire :
Code:
1
2
3
4
5
6
7
8
9
10
11
12 packed struct PERSON { string(20) nom; int age; } PERSON person; // ... rc = write (fd, person);