Il m'a fallu une éternité pour traquer qu'il y avait un bug dans mon code qui a été déclenché par /OPT:ICF
:
Parce que /OPT:ICF peut causer la même adresse pour être affectés à différentes fonctions ou en lecture seule aux données membres (const variables compilé en utilisant /Gy), il peut se casser un programme qui dépend d'adresses uniques pour des fonctions ou des données en lecture seule les membres.
(J'avais le stockage et la comparaison de pointeurs de fonction pour l'égalité, qui se brise lorsque l'éditeur de liens jette fonctions identiques.)
Maintenant, j'ai besoin de trouver tous les endroits où j'ai pu faire une telle chose.
Le cas de test est bien sûr trivial:
//MSVC: /Gy /link /OPT:ICF
int test1(void) { return 0; }
int test2(void) { return 0; }
int main(void) { return test1 == test2; }
J'ai essayé d' -Wall
, -Wextra
, -Weverything
, -pedantic
, etc. mais aucun d'eux de générer des avertissements.
Est-il tout option du compilateur ou de l'outil (si une partie de Visual C++, GCC, Clang, ou autres) qui peuvent analyser mon code et me dire où je suis la comparaison de pointeurs de fonction les uns avec les autres, comme dans le code ci-dessus?