Bonjour à tous,
Dans le cadre d'une campagne de portabilité visual studio / gcc je suis tombé sur une horreur dans notre codebase avec un cast d'un tableau vers un va_list.
Tout d'abord voici le code qui nous est fourni sous forme de bibliothèque, c'est du code que je ne peux pas modifier. (Pour info c'est en fait à la base un code C++ avec des classes, d'ou l'écriture un peu bizarre mais le problème de fond est typique du C)
Et voici la fonction qui pose problème :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 struct String { char* m_chars; }; struct StringArray { String* m_array; }; formatV(const char* pszFormat, va_list args) { //...} char* getPattern() { //...} StringArray getParameters() {//...}
J'ai encore du mal à y croire mais ça compile avec visual studio et donne le résultat attendu. L'astuce repose sur le fait la chaine pattern ressemble à qqchose du style "%s %s %s" et que StringArray contient un pointeur vers un tableau de char* contenant exactement le nombre de chaine attendu. Je suppose que par chance avec visual studio, va_list est effectivement un pointeur et qu'on émule donc ce qu'aurait fait un compilateur si foo avait était variadique et qu'il avait placé dans la pile les arguments de la fonction les un à la suite des autres.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 void foo() { char* pattern = getPattern(); StringArray parameters = getParameters(); formatV(pattern, (va_list) parameters.m_array); // tada }
En passant sur GCC on se prend un erreur de compilation indiquant qu'il est impossible de convertir un pointeur de type String* en va_list (ce qui semble la moindre des choses) du coup j'aimerais en profiter pour corriger ce comportement indéterminé manifeste et le remplacer par du code légal.
Le problème c'est que je n'ai en fait pas la moindre idée sur la bonne manière pour transformer mes paramètres qui sont empacketés dans un tableau dont le taille est connu au runtime vers une va_list. Des idées ?
Partager