{"id":18594043,"url":"https://github.com/machi1990/static-analyzer","last_synced_at":"2026-01-25T00:31:35.319Z","repository":{"id":88188407,"uuid":"52783972","full_name":"machi1990/static-analyzer","owner":"machi1990","description":"Static analysis of a c-ish programming language ","archived":false,"fork":false,"pushed_at":"2016-04-13T17:13:25.000Z","size":307,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-05-16T11:09:07.108Z","etag":null,"topics":["static-analysis","static-code-analysis"],"latest_commit_sha":null,"homepage":"","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/machi1990.png","metadata":{"files":{"readme":"README.TXT","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-02-29T10:44:06.000Z","updated_at":"2017-07-29T11:08:53.000Z","dependencies_parsed_at":"2023-05-09T21:31:37.430Z","dependency_job_id":null,"html_url":"https://github.com/machi1990/static-analyzer","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/machi1990/static-analyzer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/machi1990%2Fstatic-analyzer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/machi1990%2Fstatic-analyzer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/machi1990%2Fstatic-analyzer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/machi1990%2Fstatic-analyzer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/machi1990","download_url":"https://codeload.github.com/machi1990/static-analyzer/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/machi1990%2Fstatic-analyzer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28739851,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-24T22:12:27.248Z","status":"ssl_error","status_checked_at":"2026-01-24T22:12:10.529Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["static-analysis","static-code-analysis"],"created_at":"2024-11-07T01:14:23.987Z","updated_at":"2026-01-25T00:31:35.305Z","avatar_url":"https://github.com/machi1990.png","language":"HTML","readme":"EXPLANATION DE NOS OBSERVATION, RESULTATS ET IMPLEMENTATION.\n============================================================\n\nLe dossier \"tests/observation\" contient quelques tests que nous avons écrit au\nfur et à mesure de notre implementation.\n\nPour génerer le fichier résultat de tout le banc de tests, il faut exécuter le script\n\"run.sh\". Pour ce faire, il faut d'abord vérifier que toutes les dependances spécifiées dans le fichier INSTALL.txt soient satisfaites.\n\nSous terminal d'UNIX, la commande \"bash run.sh -h\", vous proposera une guide\nd'utilisation.\n\nLes résultats de notre analyse se trouve dans le dossier \"chitimbo-larbi-results\".\n\n3.1.1. OBSERVATION\n=================\n    1) L'instruction rand(l,h) génère une suite d'entiers entre l et h si l\n    est inferieur ou égal à h. L'interpreteur nous envoie bien la liste d'entiers\n    dans le cas où  l est inferieur à h. Dans le cas contraire , il nous envoie\n    \"bottom\" signalant un problème dans l'interpretation.\n\n    2) Le programme s'arrête sous deux conditions :\n        (a). Le cas trivial, l'exécution du programme est terminé en arrivant à la\n        fin du programme. Dans ce cas, le résultat envoyé sera l'évaluation du\n        programme en suivant la sémantique du langage: le résulat attendu.\n\n        (b). Le second cas, càd lorsqu'on evalue l'instruction \"halt\".\n        Dans ce cas nous aurons \"bottom\" comme résulat de l'interpretation.\n\n    3) Oui, si un programme comporte une boucle infinie l'interprète peut se\n    términer. Cela arrive quand nous avons reussi à trouver qu'un point fixe existe.\n\n\n3.1.2: Assertion\n===============\nL'implementation est faite dans le fichier interpreter.ml.\n\n3.1.3: Enrichement\n==================\nNous avons choisi d'implementer le modulo. Pour ce faire, Nous nous sommes\nservi de la function \"erem\" du package Zarith. Nous avons aussi écrit des fichiers\ndu test préfixé par \"modulo\", pour ensuite tester notre implementation.\n\n3.2. Domaine des constantes.\n===========================\nCette partie constiste à ajouter un certain degré de précision dans le domaine\ndes constantes. Par example, renvoyer toujours zero lors d'une multiplication par zero.\nLa raffinement de la division pour obetnir l'operande de gauche constiste en une\nmultiplication du resultat de la division et l'operande de droite par une\naddition du reste de la division, etc.\n\n3.3. Domaine des intervalles\n============================\nNous avons implementé cette partie en se basant sur le module \"Q\" du package Zarith.\nEn effet ce module nous offre déjà une implementation d'entiers plus le moins/plus\ninfinie. (Z inclus dans Q). Et donc, nous avons representé nos bornes d'intervalle\ncomme un nombre dans Q. Avec cette implémentation nous avons réussi à avoir les mêmes\nrésulats attendus par l'analyseur. Nous offrons l'option \"-interval\" pour tester\nnotre implementation. En terme de comparaison, cette analyse peut nous envoyer un résulat\npas assez précis vu qu'il y a des cas qui se sont revelés presque impossible à traiter.\nPar exemple, la non-égalité de deux intervalles où le premier intervalle est\ntotalement un sous-ensemble de l'autre i.e soit i1 = [a,b] et i2 = [c,d], si c \u003c a et\nb \u003c d, alors i1 est totalement inclus dans i2, et dans ce cas notre implementation\nse comportera comme l'identité. Nous avons aussi une petite imprécision pour le module\nd'intervalle surtout quand l'intervalle contient des bornes négatives.\n\n3.4: Analyse des boucles.\n=========================\nLe traitement des boucles dans intepreter.ml tel qu'il était, risquait de prendre\nbeaucoup du temps avant qu'on trouve un point fixe: Un risque d'une convergence\nassez précis mais pas assez rapide.\n\nPour palier à cela, et ainsi avoir une convergence dans un temps raisonnable, nous\navons utilisé l'operateur de \"widening\". Le problème avec cet operateur, est qu'il\napporte une perte de précision et ainsi d'autres option comme \"-delay N\" pour\nl'utilisation tardive de \"widening\" normalement aprés \"N\" iteration, et \"unroll N\"\npour l'evaluation de la boucle normale \"sans faire de joining de widen\" pour les \"N\"\npremier iterations. Ce dernier nous apporte une bonne précision par rapport à delay,\nvu qu'il s'agit d'une \"simulation\" d'evaluation de la boucle dans le domaine, et ainsi\nla boucle est exécutée avec les valeur précises. \n\nPar example, pour le fichier \"tests/observation/loop_3.c\", nous avons pour unroll=3\net delay= 0 le résultat suivant:\n\ntests/observation/loop_3.c:7.8-17: [ x in [0;0] ]\ntests/observation/loop_3.c:7.8-17: [ x in [1;1] ]\ntests/observation/loop_3.c:7.8-17: [ x in [2;2] ]\ntests/observation/loop_3.c:7.8-17: [ x in [3;3] ]\ntests/observation/loop_3.c:7.8-17: [ x in [3;64] ]\ntests/observation/loop_3.c:11.4-13: [ x in [65;+inf] ]\n\nPar contre pour delay=3 et unroll=0, nous avons:\ntests/observation/loop_3.c:7.8-17: [ x in [0;0] ]\ntests/observation/loop_3.c:7.8-17: [ x in [1;1] ]\ntests/observation/loop_3.c:7.8-17: [ x in [1;2] ]\ntests/observation/loop_3.c:7.8-17: [ x in [1;3] ]\ntests/observation/loop_3.c:7.8-17: [ x in [1;4] ]\ntests/observation/loop_3.c:7.8-17: [ x in [1;64] ]\ntests/observation/loop_3.c:11.4-13: [ x in [65;+inf] ]\n\nDans cette partie aussi, il s'agissait d'implementer le narrowing de la boucle pour\ngagner en précision (raffiner le point fixe par un opérateur de rétrécissement permet \nde forcer la convergence en temps fini) après l'utilisation de widening. Pour cela, nous\navons ajouté l'option \"-narrow N\". Cette option fera n iteration de la boucle en\nappliquant l'operation de narrowing à chaque tour de boucle.\n\nPour ce même exemple, nous avons le résultat suivant en appliquant l'option de narrowing,\navec un unroll de 3 et delay de 0.\ntests/observation/loop_3.c:7.8-17: [ x in [0;0] ]\ntests/observation/loop_3.c:7.8-17: [ x in [1;1] ]\ntests/observation/loop_3.c:7.8-17: [ x in [2;2] ]\ntests/observation/loop_3.c:7.8-17: [ x in [3;3] ]\ntests/observation/loop_3.c:7.8-17: [ x in [3;64] ]\ntests/observation/loop_3.c:7.8-17: [ x in [3;64] ]\ntests/observation/loop_3.c:11.4-13: [ x in [65;65] ]\n\nNB: \nEtant donné quelques imprécisions remarquées lors de nos tests, cette partie est encore sous une revue\ntotale. Par example, à la fin d'analyse du programme \"tests/observation/loop_5.c\",nous avons,\ntoujours avec unroll 3 et narrowing 1, nous avons en sortie de la boucle la valeur de x dans\n[0;47]. Ce résulat est assez imprécis comparé au vrai résulat qui est [0;0]. Nous estimons \nque cette imprecision peut être lié à notre application de narrowing.   \n\t\n\n3.5: Produit reduit\n===================\nCette implementation est réalisée de sorte qu'elle soit un foncteur générique.\nOn peut ainsi faire des produits des autres domaines abstraits tels que le\nproduit de parité et intervalle. Son implémentation concrète se trouve dans le fichier\n\"parity_interval_reduction.ml\".\n\nPS: Nous avons du ajouter une signature \"value: t -\u003e interval_value\", qui étant\ndonné une domaine abstraite de type t, nous créera une intervalle d'entiers: On peut\nvoir cette signature comme étant un accesseur des bornes d'intervalles.\n\nPour tester cette implémentation, nous avons ajouté l'option \"-parity-interval-reduction\".\n\n4: Extensions (Analyse disjonctive).\n===================================\nComme extension pour notre analyseur nous avons choisi d'implémenter l'anaylse disjonctive par \npartitionnement de trace. Cette implémentation se comporte comme un autre module pour l'inteprétation. \nTout les details de l'implémentation se trouvent dans le fichier \"trace_interpreter.ml\", et nous avons ajouté \nune option \"-partition-interval\" et \"partition-constant\" pour tester cette implémentation pour \nles domaine d'intervalles et constantes respectivement.\n\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmachi1990%2Fstatic-analyzer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmachi1990%2Fstatic-analyzer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmachi1990%2Fstatic-analyzer/lists"}