web-dev-qa-db-fra.com

Le type Python est-il sûr?

Selon Wikipedia

Les informaticiens considèrent un langage "sûr pour le type" s'il ne permet pas des opérations ou des conversions qui violent les règles du système de type.

Étant donné que Python les contrôles d'exécution garantissent que les règles système de type sont satisfaites, nous devons considérer Python un langage de type sécurisé).

Le même argument est fait par Jason Orendorff et Jim Blandy dans Programmation Rust :

Notez que la sécurité de type est indépendante du fait qu'un langage vérifie les types au moment de la compilation ou au moment de l'exécution: C vérifie au moment de la compilation et n'est pas de type sécurisé; Python vérifie au moment de l'exécution et est sûr de type.

Les deux notions distinctes de vérification de type statique et de sécurité de type.

Est-ce exact?

25
user8664060

De nombreux programmeurs assimileront la vérification de type statique à la sécurité de type:

  • "la langue A a statique vérification de type et donc est sûr pour le type"
  • "la langue B a dynamique vérification de type et donc n'est pas type-safe"

Malheureusement, ce n'est pas si simple.

Dans le monde réel

Par exemple, C et C++ ne sont pas sûrs pour le type car vous pouvez miner le système de type via type punning . De plus, les spécifications du langage C/C++ autorisent largement comportement indéfini (UB) plutôt que de gérer explicitement les erreurs, ce qui est devenu la source d'exploits de sécurité tels que l'exploit smashing de pile et attaque de chaîne de format . De tels exploits ne devraient pas être possibles dans les langages de type sécurisé. Les premières versions de Java avait un bug de type avec son Generics qui prouvait qu'il n'était pas complètement sûr pour le type.

Encore aujourd'hui, pour des langages de programmation comme Python, Java, C++, ... il est difficile de montrer que ces langages sont complètement sûrs pour le type car ils nécessitent une preuve mathématique. Ces langages sont massifs et les compilateurs/interprètes ont des bogues qui sont continuellement signalés et corrigés.

[ Wikipedia ] De nombreuses langues, en revanche, sont trop grandes pour les preuves de sécurité de type généré par l'homme, car elles nécessitent souvent de vérifier des milliers de cas. .... certaines erreurs peuvent survenir au moment de l'exécution en raison de bogues dans l'implémentation ou dans des bibliothèques liées écrites dans d'autres langues; de telles erreurs peuvent rendre un type d'implémentation donné dangereux dans certaines circonstances.

Dans le milieu universitaire

La sécurité des types et les systèmes de types, bien qu'applicables à la programmation du monde réel, ont leurs racines et leurs définitions provenant de universitaire - et donc une définition formelle de ce qui est exactement est "la sécurité du type" est difficile - surtout quand on parle de vrais langages de programmation utilisés dans le monde réel. Les universitaires aiment définir mathématiquement (formellement) de minuscules langages de programmation appelés langages jouets . Ce n'est que pour ces langues qu'il est possible de montrer formellement qu'elles sont de type sécurisé (et de prouver que les opérations sont logiquement correct ).

[ Wikipedia ] La sécurité de type est généralement une exigence pour tout langage jouet proposé dans la recherche sur le langage de programmation universitaire

Par exemple, les universitaires ont eu du mal à prouver Java est de type sécurisé, ils ont donc créé une version plus petite appelée Featherweight Java et prouvée dans un papier qu'il est type-safe. De même, ce article de doctorat par Christopher Lyon Anderson a pris un sous-ensemble de Javascript, l'a appelé JS0 et l'a prouvé type sûr.

Il est pratiquement supposé que les langages appropriés comme python, Java, c ++ ne sont pas complètement sûrs pour le type car ils sont si grands. Il est si facile pour un minuscule bogue de se faufiler entre les fissures, ce qui minerait le système de saisie.

Sommaire

  • Non python est probablement pas complètement sûr pour le type - personne ne l'a prouvé , c'est trop difficile à prouver. Vous êtes plus susceptible de trouver un minuscule bogue dans le langage qui démontrerait qu'il n'est pas sûr pour le type.
  • En fait, la plupart des langages de programmation sont probablement pas complètement sûr pour les types - tous pour les mêmes raisons (uniquement jouet académique ceux ont été prouvés être)
  • Vous ne devriez vraiment pas croire que les langages de type statique sont nécessairement taper sûr . Ils sont généralement plus sûrs que les langages typés dynamiquement, mais dire qu'ils sont complètement sûrs avec le type est une erreur car il n'y a aucune preuve pour cela.

Références: http://www.pl-enthusiast.net/2014/08/05/type-safety/ et https://en.wikipedia.org/wiki/Type_system

38
James Lawson

L'article de wikipedia associe le type sécurisé à la mémoire sûre, ce qui signifie que la même zone de mémoire n'est pas accessible, par exemple entier et chaîne. De cette façon Python est de type sécurisé. Vous ne pouvez pas changer implicitement le type d'un objet.

9
Daniel

Parce que personne ne l'a encore dit, il convient également de souligner que Python est un langage fortement typé , qui ne devrait pas être confondu avec typé dynamiquement. Python diffère la vérification de type jusqu'au dernier moment possible, et entraîne généralement une exception levée. Cela explique le comportement mentionné par Mureinik. Cela étant dit, Python effectue également souvent une conversion automatique. Cela signifie qu'il tentera de convertir un entier en un flottant pour une opération arithmétique, par exemple.

Vous pouvez appliquer manuellement la sécurité des types dans vos programmes en vérifiant les types d'entrées. Parce que tout est un objet, vous pouvez toujours créer des classes dérivées des classes de base et utiliser la fonction isinstance pour vérifier le type (au moment de l'exécution bien sûr). Python 3 a ajouté des indications de type, mais cela n'est pas appliqué. Et mypy a ajouté une vérification de type statique à la langue si vous voulez l'utiliser, mais cela ne le fait pas garantir la sécurité du type.

7
VoNWooDSoN

En Python, vous obtiendrez une erreur d'exécution si vous utilisez une variable du mauvais type dans le mauvais contexte. Par exemple.:

>>> 'a' + 1

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects

Étant donné que cette vérification ne se produit que dans runtime , et pas avant d'exécuter le programme, Python n'est pas un langage de type sécurisé ( PEP-484 nonobstant).

3
Mureinik