Cette question est une question de suivi sur Can the C compiler optimizer violate short-circuiting and reorder memory accesses for operands in a logical-AND expression?.Comment une erreur spéculative due à l'optimisation du compilateur est-elle implémentée sous le capot?
Considérons le code suivant.
if (*p && *q) {
/* do something */
}
Maintenant que par la discussion à Can the C compiler optimizer violate short-circuiting and reorder memory accesses for operands in a logical-AND expression? (en particulier David commentaire Schwartz et réponse), il est possible pour l'optimiseur d'un compilateur standard conforme C pour émettre des instructions CPU qui accède à *q
avant *p
tout en conservant le comportement observable du point de séquence établi avec l'opérateur &&
.
Par conséquent, bien que l'optimiseur peut émettre le code qui accède *q
avant *p
, il doit encore faire en sorte que tous les effets secondaires des *q
(comme erreur de segmentation) est observable uniquement si *p
est non nul. Si *p
est zéro, alors une erreur due à *q
ne devrait pas être observable, c'est-à-dire qu'une erreur spéculative se produirait d'abord parce que *q
était exécutée en premier sur la CPU mais la faute spéculative serait ignorée une fois que *p
serait exécutée et trouvée 0.
Ma question: Comment cette faille spéculative est-elle mise en œuvre sous le capot?
J'apprécierais que vous puissiez jeter plus de lumière sur les points suivants en répondant à cette question.
- Pour autant que je sache, lorsque le CPU détecte un défaut, il génère un piège, que le noyau doit gérer (soit prendre des mesures de recouvrement telles que swap de page ou signaler la faute comme SIGSEGV au processus) . Ai-je raison?
- Donc si le compilateur doit émettre du code pour effectuer un défaut spéculatif, il me semble que le noyau et le compilateur (et peut-être aussi le CPU) doivent tous coopérer les uns avec les autres pour implémenter un défaut spéculatif. Comment le compilateur émet-il des instructions qui indiqueraient au noyau ou au CPU qu'une faute générée par le code devrait être considérée comme spéculative?
Si on accède * inconditionnellement à * q avant ou après le 'if (* p && * q)', le compilateur peut être capable de conclure que l'accès ne peut pas être défectueux dans un programme conforme, et ainsi pouvoir réorganiser les accès. – EOF