36 votes

Existe-t-il une liste des extensions GHC considérées comme "sûres" ?

Parfois, un morceau de code que je veux écrire n'est pas légal sans au moins une extension de langage. C'est particulièrement vrai quand on essaie d'implémenter des idées dans des articles de recherche, qui ont tendance à utiliser n'importe quelle version super étendue de GHC disponible au moment où l'article a été écrit, sans préciser quelles extensions sont réellement nécessaires.

Le résultat est que je me retrouve souvent avec quelque chose comme ceci en haut de mes fichiers .hs :

{-# LANGUAGE TypeFamilies
           , MultiParamTypeClasses
           , FunctionalDependencies
           , FlexibleContexts
           , FlexibleInstances
           , UndecidableInstances
           , OverlappingInstances #-}

Cela ne me dérange pas, mais j'ai souvent l'impression de faire des sacrifices aveugles pour apaiser le Grand Dieu de GHC. Il se plaint qu'un certain morceau de code n'est pas valide sans l'extension de langage X, alors j'ajoute un pragma pour X. Puis il demande que j'active Y, alors j'ajoute un pragma pour Y. Au moment où cela se termine, j'ai activé trois ou quatre extensions de langage que je ne comprends pas vraiment, et je n'ai aucune idée de celles qui sont "sûres".

Pour expliquer ce que j'entends par "sûr" :

  • Je comprends que UndecidableInstances est sûre, car même si elle peut empêcher le compilateur de terminer, tant que le code est compilé, elle n'aura pas d'effets secondaires inattendus.

  • D'un autre côté, OverlappingInstances est clairement dangereux, car il est très facile pour moi d'écrire accidentellement du code qui donne des erreurs d'exécution.

Donc ma question est :

Existe-t-il une liste des extensions GHC qui sont considérées comme "sûres" et "non sûres" ?

39voto

glaebhoerl Points 3182

C'est probablement mieux de regarder ce que SafeHaskell permet :

Un langage sûr

Le langage sûr (activé par -XSafe ) restreint les choses de deux manières différentes :

  1. Certaines extensions de GHC LANGUAGE sont complètement interdites.
  2. Certaines extensions de GHC LANGUAGE sont limitées dans leur fonctionnalité.

Vous trouverez ci-dessous les drapeaux et les extensions qui entrent dans chaque catégorie :

  • Interdit complètement : GeneralizedNewtypeDeriving , TemplateHaskell
  • Fonctionnalité restreinte : OverlappingInstances , ForeignFunctionInterface , RULES , Data.Typeable
    • Voir les caractéristiques restreintes ci-dessous
  • Peu importe : tous les drapeaux restants.

Fonctions GHC Haskell restreintes et désactivées

Dans le dialecte de langage Safe, nous limitons les caractéristiques suivantes du langage Haskell :

  • ForeignFunctionInterface : C'est généralement sûr, mais les déclarations d'importation étrangère qui importent une fonction avec un type non-IO sont interdites. Toutes les importations FFI doivent résider dans la monade IO.
  • RULES : Comme ils peuvent modifier le comportement du code de confiance de manière imprévue, en violant la cohérence sémantique, ils sont limités dans leur fonction. Plus précisément, tout RULES défini dans un module M compilé avec -XSafe sont abandonnés. RULES définis dans des modules de confiance qui M Les importations sont toujours valables et seront tirées comme d'habitude.
  • OverlappingInstances : Cette extension peut être utilisée pour violer la cohérence sémantique, car un code malveillant pourrait redéfinir une instance de type (en contenant une définition d'instance plus spécifique) de manière à modifier le comportement du code important le module non approuvé. L'extension n'est pas désactivée pour un module M compilé avec -XSafe mais restreint. Alors que M peuvent définir des déclarations d'instance qui se chevauchent, elles ne peuvent être utilisées que dans des M . Si dans un module N que les importations M Dans le cas d'un site d'appel qui utilise une fonction de classe de type, il y a un choix de l'instance à utiliser (c'est-à-dire un chevauchement) et le choix le plus spécifique est celui de la fonction de classe de type. M (ou tout autre module compilé en toute sécurité), alors la compilation échouera. Il n'est pas important que le module N est considéré comme sûr, ou digne de confiance ou aucun des deux.
  • Data.Typeable : Nous autorisons les instances de Data.Typeable pour être dérivées, mais nous n'autorisons pas les instances créées à la main. Les instances dérivées sont générées par GHC et devraient être parfaitement sûres, mais les instances créées à la main peuvent mentir sur leur type et permettre des coercitions non sûres entre les types. Ceci est dans l'esprit de la conception originale de SYB.

Dans le dialecte de langage Safe, nous désactivons complètement les caractéristiques suivantes du langage Haskell :

  • GeneralizedNewtypeDeriving : Il peut être utilisé pour violer le contrôle d'accès aux constructeurs, en permettant à du code non fiable de manipuler des types de données protégés d'une manière non prévue par l'auteur du type de données. C'est-à-dire qu'il peut être utilisé pour briser les invariants des structures de données.
  • TemplateHaskell : est particulièrement dangereux, car il peut provoquer des effets secondaires même au moment de la compilation et peut être utilisé pour accéder à des types de données abstraits. Il est très facile de briser les limites des modules avec TH.

Je me souviens avoir lu que l'interaction de FunctionalDependencies y UndecidableInstances peut également être dangereux, car en plus de permettre une profondeur illimitée de la pile de contexte UndecidableInstances lève également le soi-disant condition de couverture (section 7.6.3.2), mais je ne peux pas trouver une citation pour cela pour le moment.

MODIFIER 2015-10-27 : Depuis que GHC a obtenu le support des rôles de type, GeneralizedNewtypeDeriving n'est plus dangereux. (Je ne suis pas sûr de ce qui a pu changer d'autre).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X