F. Bobot, J. Filliâtre, C. Marché, and A. Paskevich, Why3: Shepherd your herd of provers, 2011.
URL : https://hal.archives-ouvertes.fr/hal-00790310

J. Andreoli, Logic programming with focusing proofs in linear logic, 1992.

R. F. Blute, J. R. Cockett, and R. A. Seely, Differential categories. Math. Structures Comput. Sci, vol.16, issue.6, 2006.

T. Ehrhard and L. Regnier, Differential interaction nets, Theoretical Computer Science, vol.364, issue.2, pp.166-195, 2006.
URL : https://hal.archives-ouvertes.fr/hal-00150274

T. Ehrhard, On köthe sequence spaces and linear logic, Mathematical Structures in Computer Science, vol.12, issue.5, pp.579-623, 2002.

T. Ehrhard, Finiteness spaces, Mathematical Structures in Computer Science, vol.15, issue.4, pp.615-646, 2005.
URL : https://hal.archives-ouvertes.fr/hal-00150276

T. Ehrhard, An introduction to differential linear logic : proof-nets, models and antiderivatives, Mathematical Structures in Computer Science, vol.28, issue.7, pp.995-1060, 2018.
URL : https://hal.archives-ouvertes.fr/hal-01326738

T. Ehrhard and O. Laurent, Interpreting a finitary pi-calculus in differential interaction nets, Inf. Comput, 2010.
URL : https://hal.archives-ouvertes.fr/hal-00148816

J. Girard, Linear logic, Theoretical Computer Science, vol.50, issue.1, pp.1-102, 1987.
URL : https://hal.archives-ouvertes.fr/inria-00075966

J. Girard, A new constructive logic : Classical logic. Mathematical Structures in Computer Science, 1991.
URL : https://hal.archives-ouvertes.fr/inria-00075117

A. Grothendieck, Produits tensoriels topologiques et espaces nucléaires, Mem. Amer. Math. Soc, issue.16, p.140, 1955.

H. Jarchow, Locally convex spaces, 1981.

M. Kerjean and C. Tasson, Mackey-complete spaces and power series, MSCS, 2016.
URL : https://hal.archives-ouvertes.fr/hal-01175662

M. Kerjean, A logical account for linear partial differential equations, Proceedings of the 33rd Annual ACM/IEEE Symposium on Logic in Computer Science, LICS 2018

M. Kerjean and J. Lemay, Higher-order distributions for differential linear logic, FOS-SACS 2019, Held as Part ETAPS
URL : https://hal.archives-ouvertes.fr/hal-01969262

O. Laurent, Etude de la polarisation en logique, 2002.
URL : https://hal.archives-ouvertes.fr/tel-00007884

P. Melliès, Categorical semantics of linear logic, 2008.

P. Melliès, Dialogue categories and chiralities. Publ. Res. Inst. Math. Sci, vol.52, issue.4, pp.359-412, 2016.

M. Fiore, Differential structure in models of multiplicative biadditive intuitionistic linear logic. Proceedings of TLCA, 2007.

L. Schwartz, Théorie des distributions, 1966.

L. Vaux, Differential linear logic and polarization, Typed Lambda Calculi and Applications, 9th International Conference, pp.371-385, 2009.
URL : https://hal.archives-ouvertes.fr/hal-00387062

S. Archipoff and D. Janin, Structured reactive programming with polymorphic temporal tiles, ACM Work. on Functional Art, Music, Modeling and Design (FARM), 2016.
URL : https://hal.archives-ouvertes.fr/hal-01350525

S. Archipoff and D. Janin, Unified media programming : An algebraic approach, ACM Work. on Functional Art, Music, Modeling and Design (FARM), 2017.
URL : https://hal.archives-ouvertes.fr/hal-01571133

C. Deleuze, Concurrence légère en ocaml : muthreads, Journées Francophones des Langages Applicatifs (JFLA), 2013.

H. Robert and J. Halstead, Multilisp : A language for concurrent symbolic computation, ACM Trans. Program. Lang. Syst, vol.7, issue.4, pp.501-538, 1985.

P. Hudak, J. Hugues, S. P. Jones, and P. Wadler, A history of Haskell : Being lazy with class, Third ACM SIGPLAN History of Programming Languages (HOPL), 2007.

D. Janin, An equational modeling of asynchronous concurrent programming, 2019.

D. Janin, Screaming in the IO monad, ACM Work. on Functional Art, Music, Modeling and Design (FARM), 2019.
URL : https://hal.archives-ouvertes.fr/hal-02368138

S. P. Jones, A. Gordon, and S. Finne, Concurrent haskell, Principles of Programing Languages (POPL), 1996.

N. R. Krishnaswami, Higher-order functional reactive programming without spacetime leaks, Int. Conf. Func. Prog. (ICFP), 2013.

X. Leroy, D. Doligez, A. Frisch, J. Garrigue, D. Rémy et al., The OCaml system, release 4.08, Documentation and user's manual. Inria, 2019.
URL : https://hal.archives-ouvertes.fr/hal-00930213

S. Marlow, Parallel and Concurrent Programming in Haskell, 2013.

Y. Minsky, J. Hickey, and A. Madhavapeddy, Real World Ocaml : Functional programming for the masses, 2013.

E. Moggi, A modular approach to denotational semantics, Category Theory and Computer Science (CTCS), vol.530, 1991.

P. Wadler, Comprehending monads, Conference on LISP and Functional Programming (LFP), 1990.

J. Karl and . Åström, Introduction to stochastic control theory, 2012.

G. Baudart, L. Mandel, E. Atkinson, B. Sherman, M. Pouzet et al., , 2019.

G. Berry, Real time programming: Special purpose or general purpose languages. Information Processing, vol.89, pp.11-17, 1989.
URL : https://hal.archives-ouvertes.fr/inria-00075494

E. Bingham, J. P. Chen, M. Jankowiak, F. Obermeyer, N. Pradhan et al., Pyro: Deep universal probabilistic programming, Journal of Machine Learning Research, vol.20, issue.6, pp.1-28, 2019.

T. Bourke and M. Pouzet, Zélus, a Synchronous Language with ODEs, International Conference on Hybrid Systems: Computation and Control, 2013.

B. Carpenter, A. Gelman, D. Matthew, D. Hoffman, B. Lee et al., Stan: A probabilistic programming language, Journal of Statistical Software, vol.76, issue.1, pp.1-37, 2017.

J. Colaço, B. Pagano, and M. Pouzet, A Conservative Extension of Synchronous Data-flow with State Machines, ACM International Conference on Embedded Software, 2005.

J. Colaco, B. Pagano, and M. Pouzet, Scade 6: A formal language for embedded critical software development, International Symposium on Theoretical Aspects of Software Engineering, 2017.
URL : https://hal.archives-ouvertes.fr/hal-01666470

P. Del-moral, A. Doucet, and A. Jasra, Sequential Monte Carlo samplers, Journal of the Royal Statistical Society: Series B (Statistical Methodology), vol.68, issue.3, pp.411-436, 2006.
URL : https://hal.archives-ouvertes.fr/hal-01593880

D. Noah, A. Goodman, and . Stuhlmüller, The Design and Implementation of Probabilistic Programming Languages, pp.2019-2029, 2014.

D. Harel, Statecharts: A visual formalism for complex systems, Sci. Comput. Program, vol.8, issue.3, pp.231-274, 1987.

D. Huang, J. Tristan, and G. Morrisett, Compiling Markov chain Monte Carlo algorithms for probabilistic modeling, ACM SIGPLAN Conference on Programming Language Design and Implementation, 2017.

D. Lunn, D. Spiegelhalter, A. Thomas, and N. Best, The bugs project: Evolution, critique and future directions, Statistics in medicine, vol.28, issue.25, pp.3049-3067, 2009.

M. Montemerlo, S. Thrun, D. Koller, and B. Wegbreit, FastSLAM: A factored solution to the simultaneous localization and mapping problem, AAAI National Conference on Artificial Intelligence, vol.10895, pp.88-107, 2002.

K. Sarah-cohen-boulakia, O. Belhajjame, J. Collin, C. Chopard, A. Froidevaux et al., Scientific workflows for computational reproducibility in the life sciences : Status, challenges and opportunities, Future Generation Comp. Syst, vol.75, pp.284-298, 2017.

P. Buneman, S. Khanna, and W. Tan, Why and where : A characterization of data provenance, Database Theory -ICDT 2001, 8th International Conference, vol.1973, pp.316-330, 2001.

S. Chu, K. Weitz, A. Cheung, and D. Suciu, HoTTSQL : Proving query rewrites with univalent SQL semantics, PLDI, 2017.

C. Cohen, M. Dénès, and A. Mörtberg, Refinements for free, Certified Programs and Proofs -Third International Conference, vol.8307, pp.147-162, 2013.
URL : https://hal.archives-ouvertes.fr/hal-01113453

É. Contejean, Coccinelle, a Coq library for rewriting, Types, 2008.

Y. Cui, J. Widom, and J. L. Wiener, Tracing the lineage of view data in a warehousing environment, ACM Trans. Database Syst, vol.25, issue.2, pp.179-227, 2000.

C. Gonzalia, Towards a formalisation of relational database theory in constructive type theory, RelMiCS, pp.137-148, 2003.

C. Gonzalia, Relations in Dependent Type Theory, 2006.

T. J. Green, Containment of conjunctive queries on annotated relations, Proceedings of the 12th International Conference on Database Theory, ICDT '09, pp.296-309, 2009.

T. J. Green, G. Karvounarakis, and V. Tannen, Provenance semirings, Proceedings of the Twenty-Sixth ACM SIGACT-SIGMOD-SIGART Symposium on Principles of Database Systems, pp.31-40, 2007.

G. Todd-j-green, V. Karvounarakis, and . Tannen, Provenance semirings, Proceedings of the twenty-sixth ACM SIGMOD-SIGACT-SIGART symposium on Principles of database systems, pp.31-40, 2007.

J. Todd, V. Green, and . Tannen, The semiring framework for database provenance, Proceedings of the 36th ACM SIGMOD-SIGACT-SIGAI Symposium on Principles of Database Systems, pp.93-99, 2017.

J. Harrison and L. Théry, A Sceptic's Approach to Combining HOL and Maple, Journal of Automated Reasoning, vol.21, issue.3, pp.279-294, 1998.

D. Maglott, J. Ostell, D. Kim, T. Pruitt, and . Tatusova, Entrez gene : gene-centered information at ncbi, Nucleic acids research, vol.33, issue.suppl_1, pp.54-58, 2005.

G. Malecha, G. Morrisett, A. Shinnar, and R. Wisnesky, Toward a verified relational database management system, ACM Int. Conf. POPL, 2010.

L. Orr, D. Suciu, and M. Balazinska, Probabilistic database summarization for interactive data exploration, vol.10, pp.1154-1165, 2017.

D. Kim, T. Pruitt, . Tatusova, D. R. Garth-r-brown, and . Maglott, Ncbi reference sequences (refseq) : current status, new features and genome annotation policy, Nucleic acids research, vol.40, issue.D1, pp.130-135, 2011.

, The Mathematical Components team. Mathematical Components. Available at

, Documentation du solveur ilog solver

, Github du solveur naxos solver

, Site officiel de minizinc

, Site officiel du solveur eclipse prolog

, Site officiel du solveur gecode

, Site officiel du solveur minion

, Site officiel du solveur sicstus prolog

P. Brisset and N. Barnier, FaCiLe : a Functional Constraint Library, CICLOPS 2001, Colloquium on Implementation of Constraint and LOgic Programming Systems, 2001.
URL : https://hal.archives-ouvertes.fr/hal-00938018

M. Carlier, C. Dubois, and A. Gotlieb, A certified constraint solver over finite domains, Formal Methods (FM 2012, vol.7436, pp.116-131, 2012.
URL : https://hal.archives-ouvertes.fr/hal-01126135

A. Charguéraud, Characteristic formulae for the verification of imperative programs, Proceeding of the 16th ACM SIGPLAN international conference on Functional Programming, pp.418-430, 2011.

C. Dubois and A. Gotlieb, Solveurs cp(fd) vérifiés formellement, Journées Francophones de Programmation par Contraintes (JFPC'13), pp.115-118, 2013.

C. Guillaume, Coq of OCaml. The OCaml Users and Developers Workshop, 2014.

V. Le-clément-de-saint-marcq, P. Schaus, C. Solnon, and C. Lecoutre, Sparse-Sets for Domain Implementation, CP workshop on Techniques foR Implementing Constraint programming Systems (TRICS), pp.1-10, 2013.

N. Pothitos and P. Stamatopoulos, Flexible management of large-scale integer domains in csps, Artificial Intelligence: Theories, Models and Applications, 6th Hellenic Conference on AI, SETN 2010, vol.6040, pp.405-410, 2010.

C. Prud'homme, J. Fages, and X. Lorca, , 2017.

C. Schulte and M. Carlsson, Finite domain constraint programming systems, Handbook of Constraint Programming, vol.2, pp.495-526, 2006.

A. Bauer, Dedekind reals

Y. Berthot and G. Allais, Views of pi: definition and computation, 2014.

E. Bishop, Foundations of constructive analysis, 2012.

E. Bishop and H. Cheng, Constructive measure theory. Memoirs of the American mathematical society, Number, vol.116, 1972.

S. Boldo, C. Lelay, and G. Melquiond, Formalization of real analysis: A survey of proof assistants and libraries, 2013.
URL : https://hal.archives-ouvertes.fr/hal-00806920

N. Bourbaki, Éléments de mathématique, intégration, 1967.

L. Egbertus and J. Brouwer, Über definitionsbereiche von funktionen, Mathematische Annalen, vol.97, pp.60-75, 1927.

P. and D. , A general form of integral, Annals of Mathematics. Second Series, 1918.

H. Geuvers and M. Niqui, Constructive reals in coq: Axioms and categoricity, 2000.

. Inria, La documentation de coq

R. Krebbers and B. Spitters, Computer certified efficient exact reals in coq, 2011.

G. Lee and B. Werner, Proof-irrelevant model of cc with predicative induction and judgmental equality, 2011.

S. Maclane and I. Moerdijk, Sheaves in geometry and logic, 1992.

O. Russell and . Connor, A monadic, functional implementation of real numbers, 2007.

E. Specker, Nicht konstruktiv beweisbare sätze der analysis, J. Sym. Logic, vol.14, 1949.

A. Timany and M. Sozeau, Consistency of the predicative calculus of cumulative inductive constructions (pcuic), 2017.
URL : https://hal.archives-ouvertes.fr/hal-01615123

, The Univalent Foundations Program. Homotopy Type Theory: Univalent Foundations of Mathematics, 2013.

J. Abrial, Modeling in Event-B -System and Software Engineering, 2010.

C. Barrett, P. Fontaine, and C. Tinelli, The SMT-LIB Standard: Version 2.6, 2017.

J. Blanchette, Automatic proofs and refutations for higher-order logic, 2012.

R. Cartwright and M. Fagan, Soft typing, Proceedings of the ACM SIGPLAN'91 Conference on Programming Language Design and Implementation (PLDI), pp.278-292, 1991.

D. Déharbe, P. Fontaine, Y. Guyot, and L. Voisin, Integrating SMT solvers in Rodin. Sci. Comput. Program, vol.94, pp.130-143, 2014.

C. Hawblitzel, J. Howell, M. Kapritsos, J. R. Lorch, B. Parno et al., Ironfleet: proving practical distributed systems correct, Proceedings of the 25th Symposium on Operating Systems Principles, SOSP 2015, pp.1-17, 2015.

M. Kerber, How to prove higher order theorems in first order logic, Proceedings of the 12th International Joint Conference on Artificial Intelligence, pp.137-142, 1991.

C. Kaliszyk and K. P?k, Semantics of Mizar as an Isabelle object logic, Journal of Automated Reasoning, vol.63, issue.3, pp.557-595, 2019.

L. Lamport, Specifying Systems, The TLA+ Language and Tools for Hardware and Software Engineers, 2002.

L. Lamport and L. C. Paulson, Should your specification language be typed, ACM Trans. Program. Lang. Syst, vol.21, issue.3, pp.502-526, 1999.

L. C. Paulson, Set theory for verification: I. from foundations to functions. CoRR, 1993.

T. Petrucciani, Polymorphic set-theoretic types for functional languages. (Types ensemblistes polymorphes pour les langages fonctionnels), 2019.
URL : https://hal.archives-ouvertes.fr/tel-02119930

J. and M. Spivey, Z Notation -a reference manual, Prentice Hall International Series in Computer Science, 1992.

J. G. Siek and W. Taha, Gradual typing for functional languages, Scheme and functional programming workshop, pp.81-92, 2006.

H. Vanzetto, Proof automation and type synthesis for set theory in the context of TLA+. (Automatisation de preuves et synthèse de types pour la théorie des ensembles dans le contexte de TLA+), 2014.
URL : https://hal.archives-ouvertes.fr/tel-01751181

Y. Yu, P. Manolios, and L. Lamport, Model checking tla + specifications, Correct Hardware Design and Verification Methods, 10th IFIP WG 10.5 Advanced Research Working Conference, CHARME '99, vol.1703, pp.54-66, 1999.

A. Aguirre, Towards a provably correct encoding from F* to SMT. Master's thesis, 2016.

M. Armand, G. Faure, B. Grégoire, C. Keller, L. Thery et al., A modular integration of SAT/SMT solvers to Coq through proof witnesses, Certied Programs and Proofs, vol.7086, p.135150, 2011.
URL : https://hal.archives-ouvertes.fr/hal-00639130

A. Assaf, G. Burel, R. Cauderlier, D. Delahaye, G. Dowek et al., Dedukti : a logical framework based on the ??-calculus modulo theory, 2016.

A. Assaf, G. Burel, R. Cauderlier, D. Delahaye, G. Dowek et al., Expressing theories in the ??-calculus modulo theory and in the Dedukti system, 22nd International Conference on Types for Proofs and Programs, 2016.
URL : https://hal.archives-ouvertes.fr/hal-01441751

F. Bobot, J. Filliâtre, C. Marché, and A. Paskevich, Why3 : Shepherd your herd of provers, International Workshop on Intermediate Verication Languages, vol.5364, 2011.
URL : https://hal.archives-ouvertes.fr/hal-00790310

F. Bobot, J. Filliâtre, C. Marché, and A. Paskevich, Let's verify this with Why3, International Journal on Software Tools for Technology Transfer (STTT), vol.17, issue.6, p.709727, 2015.

S. Böhme and T. Weber, Fast LCF-style proof reconstruction for Z3, Interactive Theorem Proving, vol.6172, p.179194, 2010.

R. Cauderlier and P. Halmagrand, Checking Zenon modulo proofs in Dedukti, Proof eXchange for Theorem Proving, vol.186, p.5773, 2015.
URL : https://hal.archives-ouvertes.fr/hal-01171360

E. Contejean, Coccinelle, a Coq library for rewriting, Types, 2008.

S. Dailler, C. Marché, and Y. Moy, Lightweight interactive proving inside an automatic program verier, Formal Integrated Development Environments, 2018.

D. Greenaway, Automated proof-producing abstraction of C code, CSE, 2015.

D. Greenaway, J. Lim, J. Andronick, and G. Klein, Don't sweat the small stu : Formal verication of C code without the pain, Programming Language Design and Implementation, p.429439, 2014.

B. Grégoire, L. Théry, and B. Werner, A computational approach to Pocklington certicates in type theory, Functional and Logic Programming, vol.3945, p.97113, 2006.

R. Krebbers, R. Jung, A. Bizjak, J. Jourdan, D. Dreyer et al., The essence of higher-order concurrent separation logic, Programming Languages and Systems, vol.10201, p.696723, 2017.
URL : https://hal.archives-ouvertes.fr/hal-01633133

N. Swamy, C. Hritcu, C. Keller, A. Rastogi, A. Delignat-lavaud et al., Dependent types and multimonadic eects in F*, Principles of Programming Languages, p.256270, 2016.

Ç. Bozman, B. Canou, R. D. Cosmo, P. Couderc, L. Gesbert et al., Carine Morel et Loïc Peyrot : Learn-OCaml : un assistant à l'enseignement d'OCaml, Trentièmes Journées Francophones des Langages Applicatifs (JFLA'19), 2019.

B. Canou, Ç. Bozman, and G. Henry, Sous le capot du MOOC OCaml, Vingt-septièmes Journées Francophones des Langages Applicatifs (JFLA'16), vol.2016
URL : https://hal.archives-ouvertes.fr/hal-01333599

B. Canou and A. Darrasse, Fast and sound random generation for automated testing and benchmarking in Objective Caml, In ACM SIGPLAN Workshop on ML, pp.61-70, 2009.
URL : https://hal.archives-ouvertes.fr/hal-00391817

B. Canou and R. Henry, Scaling up functional programming education : under the hood of the OCaml MOOC, ACM SIGPLAN International Conference on Functional Programming (ICFP'17), pp.1-25, 2017.

A. Hameer and B. Pientka, Teaching the art of functional programming using automated grading (experience report), ACM SIGPLAN International Conference on Functional Programming (ICFP'19), vol.2019

C. Queinnec, An Infrastructure for Mechanised Grading, 2nd International Conference on Computer Supported Education (CSEDU'10), pp.37-45, 2010.
URL : https://hal.archives-ouvertes.fr/hal-00429671

. Asak,

, Compilateur OCaml pour la collecte de termes Lambda

. Learnocaml,

I. D. Baxter, A. Yahin, L. Moura, M. Sant'anna, and L. Bier, Clone detection using abstract syntax trees, Proceedings. International Conference on Software Maintenance (Cat. No. 98CB36272), p.368377, 1998.

M. Chilowicz, É. Duris, and G. Roussel, Syntax tree ngerprinting : a foundation for source code similarity detection, 2009.

S. Ducasse, M. Rieger, and S. Demeyer, A language independent approach for detecting duplicated code, Proceedings IEEE International Conference on Software Maintenance -1999 (ICSM'99). 'Software Maintenance for Business Change' (Cat. No.99CB36360), p.109118, 1999.

J. Ferrante, K. J. Ottenstein, and J. D. Warren, The program dependence graph and its use in optimization, ACM Trans. Program. Lang. Syst, vol.9, issue.3, p.319349, 1987.

J. , C. Filliâtre, and S. Conchon, Type-safe modular hash-consing, Proceedings of the ACM Workshop on ML, p.1219, 2006.

P. Gautam and H. Saini, Various code clone detection techniques and tools : A comprehensive survey, p.655667, 2016.

A. Hunt and D. Thomas, The Pragmatic Programmer : From Journeyman to Master

. Addison-wesley, , 1999.

L. Jiang, G. Misherghi, Z. Su, and S. Glondu, Deckard : Scalable and accurate tree-based detection of code clones, 29th International Conference on Software Engineering (ICSE'07), p.96105, 2007.

T. Kamiya, S. Kusumoto, and K. Inoue, Ccnder : a multilinguistic token-based code clone detection system for large scale source code, IEEE Transactions on Software Engineering, vol.28, issue.7, p.670, 2002.

J. Krinke, Identifying similar code with program dependence graphs, Proceedings Eighth Working Conference on Reverse Engineering, p.301309, 2001.

Z. Li, S. Lu, S. Myagmar, and Y. Zhou, Cp-miner : nding copy-paste and related bugs in largescale software code, IEEE Transactions on Software Engineering, vol.32, issue.3, p.176192, 2006.

K. Chandan, B. Reddy, and . Vinzamuri, A survey of partitional and hierarchical clustering algorithms, Data Clustering : Algorithms and Applications, p.87110, 2013.

K. Chanchal, J. R. Roy, R. Cordy, and . Koschke, Comparison and evaluation of code clone detection techniques and tools : A qualitative approach, Science of Computer Programming, vol.74, issue.7, pp.470-495, 2009.

B. S. Baker, On nding duplication and near-duplication in large software systems, Reverse Engineering -Working Conference Proceedings, 2001.

, Elle s'explique par une taille de pile de 8 Mo et des tableaux d'activation de 32 octets chacun (une adresse de retour, deux valeurs sauvegardées sur la pile et un

, espace aussi grand pour en calculer la hauteur. Le code en ligne accompagnant cet article inclut un programme, dûà Martin Clochard, qui calcule la hauteur en espace log(N ). Son temps de calcul, en revanche

. Remerciements, Je remercie toutes les personnes, collègues ouétudiants, qui se sont prêtées au jeu lorsque j'ai testé sur elles ce problème

O. Danvy, Defunctionalized interpreters for programming languages, SIGPLAN Not, vol.43, issue.9, pp.131-142, 2008.

O. Danvy and L. R. Nielsen, Defunctionalization at work, Proceedings of the 3rd ACM SIGPLAN International Conference on Principles and Practice of Declarative Programming, PPDP '01, pp.162-174, 2001.

D. Gries, The schorr-waite graph marking algorithm, Acta Inf, vol.11, pp.223-232, 1979.

G. Huet, The Zipper, Journal of Functional Programming, vol.7, issue.5, pp.549-554, 1997.

D. E. Knuth, The Art of Computer Programming, volumes 1-4A, 1997.

J. M. Morris, Traversing binary trees simply and cheaply, Inf. Process. Lett, vol.9, issue.5, pp.197-200, 1979.

J. C. Reynolds, Definitional interpreters for higher-order programming languages, Proceedings of the ACM Annual Conference, vol.2, pp.717-740, 1972.

J. C. Reynolds, The discoveries of continuations, LISP and Symbolic Computation, vol.6, issue.3, pp.233-247, 1993.

. Rustina-recoules,

, A' edx::eax, etc.) et de modificateurs ('=' écriture, '+' lecture/écriture, etc.). Il est possible de partager explicitement un emplacement entre une sortie et une entrée, en attribuant le numéro de la sortie à l'entrée ("0"). Le compilateur peut également le faire de son propre chef -il cherchera à minimiser le nombre de registres alloués et, pour ce faire, travaille avec l'hypothèse que les entrées sont « consommées » avant que les sorties ne soient « produites, lié au contexte C : les lignes 1587 à 1589 déclarent un contrat composé de 3 listes (séparées par ':') : les sorties, les entrées et les effets bord (appelés clobbers) du bloc. Les entrées et sorties associent des variables ou des expressions du C à des registres ou emplacements mémoire de l'assembleur

. %0, =S" ( __ res) indique que le registre esi retournera la nouvelle valeur de __ res et "0" ( __ s) qu'il doit contenir la valeur de __ s à l'entrée du bloc

. %1-2, d1)) indique que le registre eax (respectivement ecx) sera écrasé -__ d0 (respectivement __ d1) n'étant pas utile au delà du bloc, il s'agit d'un registre intermédiaire, =&a" ( __ d0) (respectivement "=&c

. %3, =&D" ( __ d2) indique, comme précédemment, que le registre edi est un registre intermédiaire

. %4, r" ( __ reject) indique qu'un registre en lecture seule -au choix du compilateur -doit contenir la valeur de __ reject

, memory" et "cc" indiquent que le bloc peut accéder et modifier respectivement tout emplacement mémoire accessible depuis l'environnement

, Le compilateur a ici peu de marge de manoeuvre, l'interface est très contrainte car les mnémoniques sont très spécialisées et utilisent implicitement des registres particuliers. Le seul choix qu'il lui reste à faire est d'associer un registre à l'entrée %4 (lignes 1572 et 1581), en sachant qu'il ne peut choisir eax, Nous pouvons déduire de ces informations quelles sont les entrées qui partagent ou ne peuvent partager un registre avec une sortie ; ces données sont illustrées dans la Fig

. Le-fond-du-problème.-en, il est bien utilisé dans le code assembleur (écrit ligne 1576, lu ligne 1582), à l'insu des compilateurs, puisque ceux-ci n'inspectent pas les mnémoniques. Ainsi, si ce registre est choisi, la valeur de l'entrée (le pointeur __ reject) sera écrasée à la ligne 1576 par le calcul d'ecx (la longueur de la chaîne pointée par __ reject). Le problème est alors d'autant plus important que, s'agissant d'un pointeur, la lecture (ligne 1581) et le déréférencement (ligne 1583) de la mauvaise valeur provoquera une erreur de segmentation

. Remarque and . La, au moins jusqu'à GCC 4.8, la déclaration d'ebx en clobber si l'option -fpic était active : il était ainsi utilisé de façon détournée, en prenant soin de le sauvegarder (push ligne 1571) et de le restaurer

P. Cousot and R. Cousot, Abstract interpretation : A unified lattice model for static analysis of programs by construction or approximation of fixpoints, 1977.

R. David, S. Bardin, T. D. Ta, L. Mounier, J. Feist et al., BINSEC/SE : A dynamic symbolic execution toolkit for binary-level analysis, SANER, 2016.
URL : https://hal.archives-ouvertes.fr/hal-01721502

, DWARF Debugging Information Format Committee. DWARF Debugging Information Format, vol.5, 2017.

A. Fehnker, R. Huuck, F. Rauch, and S. Seefried, Some assembly required -program analysis of embedded system code, SCAM, 2008.

F. Kirchner, N. Kosmatov, V. Prevosto, J. Signoles, and B. Yakobowski, Frama-c : A software analysis perspective, Formal Asp. Comput, vol.27, issue.3, pp.573-609, 2015.
URL : https://hal.archives-ouvertes.fr/cea-01808981

F. Recoules, S. Bardin, R. Bonichon, L. Mounier, and M. Potet, De l'assembleur sur la ligne ?, Appelez TInA ! In JFLA, 2019.

F. Recoules, S. Bardin, R. Bonichon, L. Mounier, and M. Potet, Get rid of inline assembly through verificationoriented lifting, ASE, 2019.

M. Rigger, S. Marr, S. Kell, D. Leopoldseder, and H. Mössenböck, An analysis of x86-64 inline assembly in c programs, 2018.

Ç. Bozman, G. Henry, M. Iguernelala, F. L. Fessant, and M. Mauny, ocpmemprof : un profileur mémoire pour OCaml, Vingtsixièmes Journées Francophones des Langages Applicatifs, 2015.

Ç. Bozman, Profilage mémoire d'applications OCaml, 2014.

A. Sylvain-conchon and . Coquereau, Mohamed Iguernelala, and Alain Mebsout, Proceedings of the 16th International Workshop on Satisfiability Modulo Theories, SMT 2018, 2018.

J. Sylvain-conchon, F. L. Filliâtre, J. Fessant, G. V. Robert, ;. Tokarski et al., Observation temps-réel de programmes Caml, JFLA (Journées Francophones des Langages Impératifs), Studia Informatica Universalis, pp.195-216, 2010.

J. Jourdan, Statistically profiling memory in OCaml. OCaml Workshop, 2016.
URL : https://hal.archives-ouvertes.fr/hal-01406809

J. Seward and N. Nethercote, Using valgrind to detect undefined value errors with bitprecision, Proceedings of the Annual Conference on USENIX Annual Technical Conference, ATEC '05, pp.2-2, 2005.

A. , on en déduit que isTrue (x f1 ) ; eval (x ? , x t2 ) ? x o isFalse (x f1 ) ; eval (x ? , x t3 ) ?

. Ainsi,

, Tout d'abord, les fichiersécrits une fois pour toute et décrivant le cadre formel : la définition des squelettes (Section 3.1) et la définition d'une interprétation concrète (Section 3.2). Ensuite, des fichiers générés automatiquementà partir de la description squelettique de la sémantique. Ces fichiers instancient la définition générale des squelettes pour la sémantique considérée. Enfin, des fichiers supplémentaires fournissent l'implémentation des filtres, ou donnent des propriétés sur ceux-ci

, On suppose donnés tous leséléments de base d'une sémantique squelettique (l'ensemble des sortes ?, l'ensemble des constructeurs, filtres, crochets et les fonctions csort

, Alors on donne la définition d'un terme de sorte s (on exclut volontairement les termes de base, qui n'existent pas au niveau de la sémantique squelettique, mais qui seront

, Inductive skel_var : sort -> Type := | skel_var_intro : forall s, string -> skel_var s. Inductive term : term_sort -> Type := | term_sv : forall t, skel_var (Term t) -> term t | term_constructor : forall (c:constructor), list_term (fst (csort c)) -> term (Prgm (snd (csort c))) with list_term: list term_sort -> Type := | nil_term: list_term

, Les définitions d'un os et d'un squelette sont exactement les mêmes que dans la formalisation ci-dessus,à l'exception des variables squelettiques qui sont explicitement typées (leur sorte est donnée) : Inductive bone := | H : hook -> list typed_skel_var -> typed_term -> list typed_skel_var -> bone | F : filter -> list typed_skel_var -> list typed_skel_var -> bone | B : list (list bone) -> list typed_skel_var -> bone. Definition skeleton := list (bone). flux : Variable l: language

, Inductive cterm := | cterm_base : forall (b:l.(l_base_sort)), base_interp b -> cterm | cterm_constructor : l.(l_cons) -> list cterm -> cterm. On définit aussi les valeurs, et les quadruplets concrets. Inductive value := | val_flow : forall f, flow_interp f -> value | val_cterm : cterm -> value, Les termes concrets sont des termes clos, sans variables de termes, qui représentent des termes du langage

, On suppose maintenant qu'on a une interprétation des filtres (donc une fonction quià chaque filtre associe une relation)

, Variable filter_interp : l.(l_filter) -> list value -> list value -> Prop

. Enfin-;-des-os, Deux versions existent, dans deux fichiers différents. La première (Concrete.v) utilise l'induction structurelle de Coq pour interpréter les crochets. La seconde (Concrete2.v) suit la définition donnée en Section 2.3 et définit une fonctionnelle de conséquence immédiate, l'homologue de la fonction H définie plus haut, qui transforme un ensemble de quadruplets en un autre ensemble de quadruplets. La sémantique en est alors le plus petit point fixe

, :S) s1 s3 | i_Void : forall s, interp_skel [] s s with interp_bone : bone -> env -> env -> Prop := | i_F : forall lv f (f1 : env) (l1 : list typed_skel_var) l2, filter_interp_opt f (List.map (find f1) (map skel_name l1)) lv -> interp_bone, Inductive interp_skel : skeleton -> env -> env -> Prop := | i_Cons : forall B S s1 s2 s3, interp_bone B s1 s2 -> interp_skel S s2 s3 -> interp_skel

, | i_H : forall (v1 v2: list value) (h: l.(l_hook)) (ct: cterm) (t : typed_term) (e:env)

, ) (map (skel_name) V) = map Some vals -> interp_bone (B Ss V) e (add_asn e V vals) with concrete_semantics :concrete_quadruple -> Prop := | cs_intro: forall (h: l.(l_hook)), forall (c: l.(l_cons)) (s xt xo: list typed_skel_var), forall (S: skeleton), forall lt s1 s2 sigma, In (h,s,c,xt,S,xo) (l.(l_semantics)) -> interp_skel S (add_asn (add_asn_cterm void_env xt lt) s s1) sigma -> unfold_list_option (map (find sigma) (map skel_name xo, | i_B : forall vals Ss Si V e e', List.In Si Ss -> interp_skel Si e e' -> map

, Le cas intéressant de cette définition est pour le crochet, qui utilise le prédicat concrete semantics, défini en induction mutuelle, pour la récursion. Voici la définition principale de la seconde version (code)

, :S) (s1,T) r | i_Void : forall s t, interp_skel [] (s,t) s with interp_bone : bone -> Cstate -> Cresult -> Prop := | i_F : forall f (f1 : env) tl lv (l1 : list typed_skel_var) l2, filter_interp_opt f (List.map (find f1) (map skel_name l1)) lv -> interp_bone, Inductive interp_skel : skeleton -> Cstate -> Cresult -> Prop := | i_Cons : forall B S s1 s2 T r, interp_bone B (s1,T) s2 -> interp_skel S (s2,T) r -> interp_skel

, | i_H : forall (h: (l.(l_hook))) (e : env) (T:concrete_quadruple -> Prop) (xf1 xf2 : list typed_skel_var) (t:typed_term) (v : list value), match unfold_list_option (map (find e) (map skel_name xf1)), eval_term e (projT2 t) with | Some xf1

|. and _. =>-false-end-->-interp_bone, H h xf1 t xf2) (e,T) (add_asn e xf2 v: env) | i_B : forall Ss Si V e T vals e', List.In Si Ss -> interp_skel Si (e,T) e' -> map (find e') (map skel_name V) = map Some vals -> interp_bone

, xo) l.(l_semantics) -> interp_skel S (add_asn (add_asn_cterm void_env xt lt) s s1, T) sigma -> unfold_list_option (map (find sigma) (map skel_name xo)) = Some

, Fixpoint consequence n := match n with | 0 => fun _ => False | S m => immediate_consequence

, Prop := exists n

, le crochet s'appuie sur l'ensemble de quadruplets passé en argument pour définir la récursion. L'équivalence entre ces deux versions est immédiate, et estégalement prouvée (code)

, On appelle donc un analyseur lexical et un analyseur syntaxique de fichiers de sémantique squelettique, puis un typeur qui vérifie la bonne formation des crochets et ajoute des annotations de type. Ces trois outils sont ceux qui ontété définis pour necro

U. Ensuite,

, Exemple de Génération Prenons l'exemple de l'opérateur conditionnel if défini ci-dessus. Sa version définie en sémantique squelettique s'écrit de la manière suivante (code)

, If (x_t1, x_t2, x_t3) -> x_f1 <-expr x_s x_t1

, Appel de crochet *) x_f1' <-isBool x_f1

, Appel de filtre *) x_o <-branch (* Branchement *) isTrue x_f1'

, Appel de filtre *) x_o <-stmt x_s x_t2 (* Appel de crochet *) or (* Deuxième branche *) isFalse x_f1

L. Sémantique-squelettique-de-ce-langage-est-définie-dans-le-fichier-while and . Sk, On prend les chaînes de caractères comme identifiants, et les entiers relatifs comme littéraux. De même, on choisit une implémentation pour les sortes de flot (code). Enfin, on définitégalement l'interprétation concrète des filtres (code)

, Assign "over

, Assign "fact" (Const, vol.1

, Assign "i

, While (Not (Equal (Var "n") (Const 0))) ( Assign "a

, Assign "i" (Const, vol.1

, Var n))) ( Assign "fact" (Plus (Var "fact

, Assign "i" (Plus (Var "i") (Const 1)) )

, On commence par définir deux lemmes correspondant aux invariants des deux boucles et on montre le résultat suivant par récurrence (code), où rd fm state accèdeà une variable de l'état, et où fact calcule (mathématiquement) la factorielle. exists (x:flow_interp s_state)

M. Bodin, P. Gardner, T. Jensen, and A. Schmitt, Skeletal Semantics and their Interpretations, Proceedings of the ACM on Programming Languages, vol.44, pp.1-31, 2019.
URL : https://hal.archives-ouvertes.fr/hal-01881863

A. Charguéraud, Characteristic formulae for the verification of imperative programs, Proceeding of the 16th ACM SIG-PLAN international conference on Functional Programming, pp.418-430, 2011.

N. Courant, E. Crance, and A. Schmitt, Necro : Animating Skeletons, ML 2019, 2019.

R. Jung, R. Krebbers, and J. Jourdan, Ales Bizjak, Lars Birkedal, and Derek Dreyer. Iris from the ground up : A modular foundation for higher-order concurrent separation logic, Journal of Functional Programming, vol.28, issue.20, 2018.

G. Kahn, Natural semantics, STACS 87, 4th Annual Symposium on Theoretical Aspects of Computer Science, vol.247, pp.22-39, 1987.
URL : https://hal.archives-ouvertes.fr/inria-00075953

L. Li and E. L. Gunter, Isak : A complete semantics of K, 2018.

, Grigore Ro?u. Matching logic. Logical Methods in Computer Science, vol.13, issue.4, pp.1-61, 2017.

G. Ro?u and . Traian-florin-?erb?nu??, An overview of the K semantic framework, Journal of Logic and Algebraic Programming, vol.79, issue.6, pp.397-434, 2010.

P. Sewell, F. Z. Nardelli, S. Owens, G. Peskine, T. Ridge et al., Ott : Effective tool support for the working semanticist, Journal of Functional Programming, vol.20, issue.1, pp.71-122, 2010.

C. Ballarin, Locales: A Module System for Mathematical Theories, Journal of Automated Reasoning, vol.52, issue.2, pp.123-153, 2014.

R. Kumar, M. O. Myreen, M. Norrish, and S. Owens, CakeML: A verified implementation of ML, Principles of Programming Languages (POPL), pp.179-191, 2014.

X. Leroy, A formally verified compiler back-end, Journal of Automated Reasoning, vol.43, issue.4, pp.363-446, 2009.
URL : https://hal.archives-ouvertes.fr/inria-00360768

T. Nipkow, L. C. Paulson, and M. Wenzel, Isabelle/HOL: a proof assistant for higher-order logic, vol.2283, 2002.

D. Sangiorgi, Introduction to bisimulation and coinduction, 2011.
URL : https://hal.archives-ouvertes.fr/hal-00907026

X. Yang, Y. Chen, E. Eide, and J. Regehr, Finding and understanding bugs in C compilers, Proceedings of the ACM SIGPLAN Conference on Programming Language Design and Implementation (PLDI), 2011.