Allez c'est l'heure de mon bug mystique (et ça fait un moment que j'ai pas mis les pieds sur Yn).
Au boulot, on a un soft en Java (Eclipse RCP) qui communique avec une appli C+ via un pipe nommé. ça, en soit, y a pas de soucis.
En revanche, l'appli n'a pas été prévue pour Citrix, donc le premier truc que la prod a fait, c'est la faire tourner sur Citrix. Il a fallu faire pas mal de merdasses pour leur faire plaisir, côté Java, je n'étais pas là à l'époque du projet.
2018, j'arrive, on me dit de retaper l'appli C++ vu que j'ai le background. Horreur, malheur,
std::vector<std::vector<T>> et plus. Tout ça est rework, C++14, ça part en prod. NP.
Il y a 6 mois, un bug remonte de la prod, sous Citrix ou W10 uniquement. Il est lié à ... Dieu sait quoi. Toujours est-il que l'appli C++ plante à la fermeture, affichant une grosse popup pas belle chez Windows. Fonctionellement y a aucun soucis, c'est pendant la déallocation des ressources, à priori, mais je suspecte de la corruption de heap. DrMemory ne trouve rien, et à l'époque on avait pas encore ASAN sur MSVC (et j'ai pas encore CMake-ifié le projet, j'ai pas envie de leur faire peur, il leur faut pas grand chose). J'ai passé 1 semaine sur ce bug de malheur, sans en comprendre les tenants ou les aboutissants.
On arrive à la semaine dernière. En désespoire de cause, j'ai codé un truc qui détecte si Citrix est actif (**c'est pas évident**), et évite du code qu'on **pense** qu'il est à la source du problème. Je repompe aussi du code capturant les crash de l'appli courante et générant des minidump, et je l'adapte au programme. Je réussis à obtenir une VM Citrix sous W10 pour tester.
Et là...
EXCEPTION_ILLEGAL_INSTRUCTION. Au lancement du programme.
Mon beau crashdump/minidump m'informe que ça sauce quelque part au fin fond de la CRT, en particulier lors de l'insertion de clef/valeur dans une
unordered_map. L'instruction fautive est
vcvttsd2usi <registres>, mais elle est valide, si ce n'est que c'est de l'AVX-512.
Je demande à mon pinpin Citrix le modèle de CPU de la machine ... Qui supporte l'AVX-512 en allant voir sur l'ARK Intel. A ce stade mon collègue
anti-C++ se fout cordialement de ma gueule et me dit que si j'en suis aux instructions c'est qu'on arrivera à rien.
Un peu de google-fu plus tard...
https://developercommunity.visualstudio.com/content/problem/787296/vs2019-163-seems-to-incorrectly-detect-avx512-on-w.htmlPUT***.
Je suspecte que la VM (VMWare 6.5) arrive a prétendre ne pas gérer certaines instructions et que derrière ça claque. Bien entendu pinpin Citrix n'en savait rien.
J'implémente le patch proposé par pinpin MSVC, ça fonctionne direct mieux. Mon code détectant Citrix aussi, mais il me cache l'autre bug, dont je ne connais toujours pas la source. Avec un peu de pot, je ferais discrètement sauter le check Citrix, et j'attendrais les minidump de la prod.