bismon (c'est un nom temporaire ) est un moniteur persistant qui (à l'avenir) interagirait avec les plugins du compilateur GCC à travers. Il est (ou deviendra) un successeur de mon ancien projet de fonte GCC; L'objectif à moyen terme est également l'analyse du code source du programme statique à l'aide de GCC. Le référentiel de code source (GPLV3 + sous licence) se trouve sur https://github.com/bstarynk/bismon .. mon travail (Basile Starynkevitch, employé à CEA, List en France) sur bismon est en partie financé (depuis le début de 2018 à la fin de 2020) par le CHARIOT EURURISE, Horizon H2020, Project Chariot, sous l'accord de subvention NON 780075. Analyse d'une sorte de logiciel IoT codé en C ou C ++ et (croisé) compilé par GCC sur un bureau Linux. En 2019 - 2021, le développement de bismon est également en partie financé par le projet Decoder H2020, en vertu de l'accord de subvention 824231 (lié à son moniteur de connaissances persistant WP1).
Actuellement (début de 2021) bismon toujours en scène bêta , et c'est un logiciel libre sous licence GPLV3 +. Il est destiné à la station de travail d'un développeur de bureau Linux X86-64 (ne fonctionnera pas sur Windows ou MacOSX ou Android).
Une documentation encore incomplète (en tant que rapport technique doc/bismon-doc.pdf dans PDF) peut être générée (avec make make doc ; cette commande vous oblige à avoir un $HOME/tmp/ répertoire). Un projet précoce (non officiel) de ce rapport pourrait être disponible sur http://starynkevitch.net/basile/bismon-doc.pdf
Alors que Bismon est actuellement financé par des projets H2020 avec des objectifs d'analyse statique, veuillez remarquer que Bismon pourrait plus tard - quand plus mature, après 2024 - être probablement utilisable comme un cadre générique en quelque sorte, avec beaucoup de travail supplémentaire ( années, pas des mois), peut-être même un certain type de système d'imagination (Lire J.Pitra D'une machine consciente , ISBN: 978-1848211018), des environnements graphiques sophistiqués de type Desktop, de nombreux outils logiciels collaboratifs interactifs basés sur le Web utilisés simultanément par une équipe, ou des applications de bases de données d'objets ou des problèmes pertinents. Puisque Bismon est sous licence GPLV3 +, tout futur logiciel qui l'utilise devrait, à mon humble avis, être également GPLV3 + (mais d'autres schémas de licence pourraient être possibles, contactez-moi sur [email protected] pour plus; cependant, Ianal ...)
[Strike Strike Fighter Air Vehicule C ++ CODING NORDESTES] (https://www.strousstrup.com/jsf-av-raliles.pdf)
[Exceptions déterministes zéro-overhead: lancers Valeurs] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0709r4.pdf)
[C ++ Standardisation, Papers 2021] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/)
Développez une sorte de langage spécifique au domaine de haut niveau (plus expressif, plus déclaratif) pour faciliter l'analyse du code source de programme statique au-dessus du CCC et générer des plugins GCC pour cela, donc les mêmes motivations que GCC Melt (et plus largement lié, les motivations - à Coccinnelle, Frama-C, Rascal, Crossmin, Clang Analyzer, Crasp etc.).
Les caractéristiques et les objectifs importants de cette langue spécifique au domaine et de sa mise en œuvre comprennent:
persistance orthogonale; Il s'agit d'une caractéristique majeure (utile pour l'analyse du code source statique du programme entier d'un programme analysé composé de plusieurs unités de traduction, chacun compilé indépendamment) qui n'était pas réaliste à la fonte GCC, donc nécessite une refonte complète. Le processus bismon devrait être un serveur à durée de vie relativement longue et conserve la plupart de ses données d'une exécution à la suivante (en store*.bmon Fichiers textuels). À l'avenir, le processus bismon communiquera avec les processus de compilation gcc ou g++ (Cross) (en utilisant un plugin GCC, à générer par bismon lui-même)
Typage dynamique comme dans Python, schéma, ruby, javascript, ... (et en quelque sorte fondu).
Multi-thread mais sans aucun gil. Un petit pool de fils de threads de travailleur est à plusieurs reprises et simultanément en train de récupérer des tasses à partir d'un programme mondial. Chaque tasklet s'exécute rapidement (millisecondes) dans un thread de travailleur et peut mettre à jour cet agenda (par exemple, en s'ajoutant pour être poursuivi).
réfléchi
homoiconique
les ordures recueillies avec précision
déclaratif, avec une bonne correspondance de modèles et des formalismes de règles
Bootstrapé et compilé en C, peut-être certaines pièces utilisant GCCJit.
donc métaprogrammé
générer des plugins GCC (en C ++) qui interagiraient avec bismon par un mécanisme RPC
Notez que la syntaxe et la sémantique (toujours sans papiers) de bismon sont en cours et sujet à changer de manière incompatible.
Lorsque bismon sera terminé pour être utilisable, il serait généralement utilisé par une petite équipe de développeurs travaillant ensemble sur un projet logiciel (commun) codé principalement en C ou C ++ (et de préférence un projet de logiciel libre).
La plupart de bismon est en C99 ou C11 (y compris une quantité croissante de code C généré sous modules/ ), mais quelques-uns codés écrits à la main se trouvent dans C ++ 14 (notamment misc_BM.cc et le BM_makeconst.cc MetapRogram Controgram Colders C).
Sur Linux / X86-64 (par exemple, Debian / Unstable ou Buster ou Ubuntu 18 ou 19) récent (sans correctifs ou travaux supplémentaires, Bismon ne fonctionnera pas sur des machines de 32 bits!):
Vous devriez être en mesure de compiler de nombreux logiciels open source pour leur code source. Vous devriez avoir un système GNU / Linux récent avec des accessoires racinaires, de préférence 32gaoctets ou plus de RAM, un processeur x86-64 avec au moins 4 cœurs et au moins 250gytes d'espace disque libre. On s'attend à ce que vous atteignez couramment l'interface de ligne de commande Linux et les coquilles UNIX telles que GNU Bash ou Zsh. Vous devriez être capable et autorisé à compiler GCC 10 ou de préférence même GCC 11 à partir de son code source et familier avec les éditeurs de code source tels que GNU Emacs, VIM, Geany etc ... Vous avez aimé lire SICP.
Voir également le sous-répertoire des dépendances et ses déprédentes de lecture - peut-être pas mises à jour.
GCC récent (SO GCC 10 ou de préférence GCC 11 ...), avec C et C ++ et JIT Prise en charge et les plugins activés (vérifiez avec gcc -v ; si votre système gcc et g++ manquent de prise en charge des plugins et libgccJit, vous devez créer et installer une version récente de GCC à partir de son code source, et la configurer pour les fournir.). Un ancien GCC (par exemple, version 9 ou antérieure) ne peut pas être utilisé.
'/usr/src/Lang/gcc-11.1.0/configure' '-v' '--prefix=/usr/local' '--with-gcc-major-version-only' '--program-suffix=-11' '--enable-shared' '--enable-linker-build-id' '--enable-nls' '--enable-bootstrap' '--enable-clocale=gnu' '--enable-libstdcxx-debug' '--enable-libstdcxx-time=yes' '--with-default-libstdcxx-abi=new' '--enable-gnu-unique-object' '--disable-vtable-verify' '--enable-plugin' '--enable-default-pie' '--with-system-zlib' '--enable-libphobos-checking=release' '--with-target-system-zlib=auto' '--enable-objc-gc=auto' '--enable-multiarch' '--disable-werror' '--with-arch-32=i686' '--with-abi=m64' '--with-multilib-list=m32,m64,mx32' '--enable-multilib' '--with-tune=native' 'CFLAGS=-O2 -g' 'CXXFLAGS=-O2 -g' '--enable-host-shared' '--enable-languages=c,c++,d,go,jit,lto'Un récent Python 3 avec PIP installé.
La documentation a besoin de A /usr/bin/mipsel-linux-gnu-gcc-8 CROPILEUR fournie par gcc-8-mipsel-linux-gnu Package. Méfiez-vous, ce package entre en conflit avec les packages gcc-multilib* sur Debian.
Ninja Builder, Version 1.8 ou plus récent est nécessaire (et est lancé par make ). N'utilisez pas un plus ancien (vérifiez auprès de ninja --version ; si cela ne fonctionne pas, votre ninja est trop vieux).
Un interprète de ruse récente est requis, version 2 ou mieux (de préférence Guile 2.2). Je ne sais pas et je n'aime pas fortement Python et l'interprète Guile est GNU, LGPLV3 + et beaucoup plus familier pour moi. En outre, les concepts des dialectes LISP tels que le schéma (la langue implémentée par Guile ) sont fortement pertinents pour comprendre Bismon , où la ruse est utilisée pour générer le script build.ninja utilisé par le constructeur Ninja.
Un récent mailutils amélioré, c'est-à-dire le mailutils-guile fournissant l'exécutable /usr/bin/guimb .
GLIB 2.58 ou mieux (qui est également nécessaire pour GTK ci-dessus), car certaines routines de bas niveau, notamment liées à l'UTF-8, sont nécessaires.
Jansson 2.12 ou mieux est nécessaire pour JSON (utilisé en relation avec WebSockets).
Libonion était nécessaire pour l'interface Web, mais supprimée le 27 juin, 2022, Git Commit a943cf687c748 ou TAG no-more-ibonion-tag (avec Typo: manquant l ). Avant cette validation, recherchez le drapeau du préprocesseur BISMON_LIBONION .
GNU fait 4 ou mieux
Ccache est utilisé pour éviter les recompilations inutiles. Si vous ne l'avez pas, vous devrez modifier notre Makefile pour la compilation des modules générés.
libbacktrace - il fait parfois partie de votre système GCC , mais vous ferez mieux de l'installer séparément (par exemple dans votre /usr/local/ préfixe)
Markdown est requis pour certaines documents, comme ceci README.md
Le retrait GNU (2.2.x enfin) et l'astyle (3.1 au moins) sont utiles pour make indent . indent est désormais requis pour les modules générés.
Tardy (un fichier tar postprocesseur) est utilisé pour générer de la documentation.
Latex - probablement en tant que Texlive Suite ou Luatex et les utilitaires connexes ( pdflatex , makeidx , bibtex ...) avec Inkscape et Hevea et Xindy sont nécessaires pour la documentation.
Sur Debian / Unstable ou récent Ubuntu, apt-get install build-essential make ninja-build gcc-8 g++-8 gcc-8-plugin-dev libgccjit-8-dev ccache gcc-8-mipsel-linux-gnu inkscape hevea texlive-full xindy fonts-inconsolata ttf-ubuntu-font-family fonts-ubuntu ttfautohint guile-2.2 mailutils-guile pour l'infrastructure de construction; Remarquez que gcc-8-mipsel-linux-gnu est le compilateur croisé MIPSEL GCC - il est en conflit avec les packages gcc-multilib* ; inkscape , hevea , texlive-full (un énorme méta-package), xindy , fonts-inconsolata , fonts-ubuntu , ttfautohint sont nécessaires pour générer la documentation.
Nous avons encore besoin apt-get install libgtk-3-dev pour GTK 3. Cela peut tirer beaucoup de dépendances.
Et apt-get install libglib2.0-dev libjansson-dev pour nos dépendances requises glib et jansson.
Le libbacktrace n'est pas emballé indépendamment dans Debian. Je recommande de le construire et de l'installer à partir de son code source, ou bien (non recommandé, mais faisable) modifier le Makefile pour utiliser celui de votre compilateur GCC système.
Le libonion n'est pas emballé indépendamment dans Debian.
apt-get install markdown indent astyle tardy et apt-get install texlive texlive-full hevea
Les dependencies/ sous-répertoire sont destinés aux git submodule liés à libbacktrace et libonion
Vous devrez peut-être ajouter .mjs en tant que suffixe valide ou extension de fichier pour le type de mime application/javascript dans votre fichier système /etc/mime.types . Lisez sur les modules JavaScript sur le Web et voyez Debian Bug # 927300.
Diriger locale pour vous assurer que votre localisation est conforme à POSIX ou anglais (britannique ou américain) dans UTF-8 (il ne peut pas être italien ou grec ou français). Il doit donc être POSIX ou C ou en_US.UTF-8 ou en_GB.UTF-8 . Vous voudrez peut-être définir vos variables d'environnement de manière appropriée (au moins LANG=en_US.UTF-8 et LANGUAGE=en_US:en et LC_ALL=en_US.UTF-8 , sans autre variable d'environnement LC_* ). Voir Locale (1), Locale (7), UTF-8 (7), Locale (5), Setlocale (3). Mais ne me demandez pas de comprendre davantage ces détails très subtils de l'international et de la localisation, ce sujet est très complexe. Si vous avez toujours besoin de ce travail pour être fait par moi, envoyez-moi un e-mail au travail à [email protected] . Mais ne vous attendez pas à ce que cela soit fait par moi avant 2024.
L'extension de fichier .mjs concerne les modules JavaScript. Si votre fichier /etc/mime.types (utilisé par libonion ) ne le sait pas, vous devez y ajouter les lignes suivantes (la première ligne ci-dessous, avec un hachage # , est un commentaire; ce qui est important, c'est la ligne mentionnant mjs ).
# in your /etc/mime.types for JavaScript modules
application/javascript mjs
La génération de documents a besoin d'un $HOME/tmp/ répertoire écrivatif.
Un contact responsable humain principal doit être donné dans un fichier contact_BM (les commentaires commençant par # sont acceptés à l'intérieur, mais il devrait avoir une ligne inspirée par John Doe <[email protected]> ). Ce fichier doit être dans le répertoire actuel ou votre répertoire domestique ou explicitement donné avec --contact-file=PATH . Mon fichier ~/contact_BM pourrait être:
# file $HOME/contact_BM
Bismon master (Basile Starynkevitch) <[email protected]>
git supplémentaire Vous voudrez peut-être (adapter cette suggestion et définir votre tête de morceau personnalisé) pour améliorer la sortie interactive de git diff sur store*.bmon Fichiers de données persistants. Peut-être quelque chose d'inspiré de git config diff.bismon.xfuncname '"^«_[0-9A-Za-z_]*$"' pourrait fonctionner, mais pas vraiment.
Clone ce référentiel git comme d'habitude, et construisez puis utilisez bismon à l'intérieur de l'arborescence source obtenue.
Regardez dans le Makefile et modifiez-le si nécessaire; Peut-être mettre à jour le PREPROFLAGS= et LIBES= lignes, par exemple pour utiliser le gcc libbacktrace de votre système, en ajoutant $(shell gcc-7 -print-file-name=include) dans le PREPROFLAGS= ligne et $(shell gcc-7 -print-file-name=libbacktrace.a) à la LIBES= line. Bien sûr, remplacez le 7 par 8 le cas échéant. Vous devez peut-être définir explicitement GCC= et GXX= à vos compilateurs GCC C et C ++ spécifiques.
Run make or make -j3
Le mécanisme de persistance est testé par make redump
Le programme ./bismon est (temporairement) toujours en utilisant GTK et Libonion. Nous voulons nous débarrasser de GTK. Il est systématique comme bismongtk et bismonion .
Assurez-vous d'exécuter bismon , bismongtk ou bismonion avec --help au début pour comprendre les options de programme disponibles.
bismon (au moins sa version Web) doit connaître vous. Vous devriez donc vous inscrire une fois à cela (et cela augmenterait son état persistant). Et bismon (plus exactement bismonion ) a un formulaire de connexion, vous devez donc avoir un mot de passe (spécifique à bismon , sans rapport avec tout autre mot de passe que vous avez).
Vous devez d'abord initialiser un fichier de mot de passe vide (le fichier de mot de passe par défaut est ~/passwords_BM ; vous pouvez en spécifier un autre sur la ligne de commande). Exécutez donc la commande touch ~/passwords_BM dans un terminal (shell) pour créer ce fichier vide. Ensuite, vous devez restreindre sa permission (lisible et écrivable par votre utilisateur UNIX uniquement) avec chmod u+rw,go-rwx ~/passwords_BM . Enfin, vérifiez avec ls -ls ~/passwords_BM que ce fichier est vide et lisible et écrit uniquement par vous.
Ensuite, vous vous inscrivez. Si Alan Turing est votre nom ou votre pseudo, et [email protected] est votre principal e-mail, votre e-mail secondaire étant turing@localhost , vous pouvez vous ajouter à bismon en l'exécutant avec quelque chose de similaire à --contributor='Alan Turing;[email protected];turing@localhost' and --batch --dump-after-load=. Options de programme. Bien sûr, vous devez remplacer Alan Turing , [email protected] et turing@localhost par tout ce qui vous convient. L'e-mail secondaire (également appelé alias) est facultatif. Si vous ne l'utilisez pas (donc si vous ne fournissez aucun alias, ce qui est probable - alors remplacez turing@localhost par une chaîne vide), bismon ne sait pas plus sur vous que git (voir Git Config pour user.email et user.name ). Vous pouvez même coder un script shell pour extraire ces informations de données personnelles de git et les mettre dans bismon .
Enfin, vous devez définir votre mot de passe (il n'est pas lié à d'autres mots de passe de votre ordinateur ou sur le Web, mais devrait avoir au moins 10 caractères Unicode, et chiffres, lettres, ponctuations), comme connu de bismon , en utilisant l'option --add-passwords (également avec --batch et --dump-after-load=. ). Pour définir votre mot de passe initial sur mypass!123456 Créez un fichier texte temporaire (il contient des noms de contributeurs et leurs --add-passwords=/tmp/addpassbismon --batch bismonion passe mis à jour dans un texte clair , vous ne devez donc pas le garder), peut-être /tmp/addpassbismon , contenant par exemple Alan Turing:mypass!123456 /tmp/addpassbismon . Bien sûr, vous ferez mieux d'écrire un script shell en emballage et assurez-vous d'avoir un mot de passe suffisamment fort qui n'est pas dans ce README.md .
Vous pourriez peut-être ajouter quelques autres utilisateurs (probablement moins d'une douzaine) en qui vous avez confiance et qui peuvent fonctionner avec vous. Chaque utilisateur pourrait gâcher ou abuser du système bismon aussi facilement que possible. Soyez alors sûr d'être conforme au RGPD si l'un de vos utilisateurs est européen (et la conformité du RGPD est alors votre responsabilité ). Le formulaire de connexion est modèle (avec code de web_ONIONBM.c ) à partir du fichier source login_ONIONBM.thtml (et vous pourriez améliorer le texte à l'intérieur de ce fichier si vous le souhaitez).
bismon Il n'est pas encore vraiment utilisable, sauf par moi (basile) en juillet 2018 (pas encore d'analyse de code source statique, pas encore de génération de plugins GCC). Si vous voulez voir quelque chose en utilisant GTK, exécutez ./bismongtk , Tapez the_system dans la fenêtre de commande étiquetée New-Bismon , alors Ctrl et Retour des touches appuyées ensemble. Si vous voulez voir quelque chose via l'interface Web, exécutez ./bismonion , ouvrez son URL (peut-être localhost:8086/ ou tout ce qui a été spécifié avec --web-base ) dans votre navigateur Web.
Il est recommandé de make clean de temps en temps (par exemple, quotidiennement ou hebdomadaire). Lors de la génération de fichiers, bismon fait une sauvegarde de leur version précédente.
Demandez-moi (basile Starynkevitch, [email protected] ou [email protected] ...) pour plus de détails.
Ce référentiel git contient également, pour plus de commodité, le framework JQueryui 1.12 (qui a une licence MIT différente) sous webroot/jquery-ui
Utilisez-le (comme stopbismon ) votre propre risque, si $HOME/bismon contient le code source de Bismon et l'exécutable:
#!/bin/bash -x
# script stopbismon
if [ -f $HOME/bismon/_bismon.pid ]; then
kill -TERM $(/bin/head -1 $HOME/bismon/_bismon.pid)
else
pkill bismon
fi
Ceci est un logiciel libre inédit
La licence (GPLV3 +) est susceptible de ne pas changer (elle est spécifiée contractuellement dans la subvention Chariot). L'avis du droit d'auteur est probablement mauvais: dans les fichiers générés, il n'est pas encore conforme aux attentes de GPL. Ces détails sont des bogues en attente, mais il y a aussi beaucoup d'autres bugs.
L'auteur est pleinement conscient - à la mi-2019 - de plusieurs bugs dans ce système bismon - un projet de recherche -, mais les corriger n'est pas une priorité (car la poursuite de l'amorçage progressif de Bismon est beaucoup plus important et n'est pas encore réalisé). L'interface GTK est buggy par conception et plante souvent (qui ne sera pas corrigée), et devrait être le plus rapidement possible par une interface Web plus utilisable - et c'est un travail en cours à la mi-2019. Veuillez contacter par e-mail à l'auteur pour recevoir des solutions de contournement possibles. Notez que ces bogues temporaires connus de l'auteur ne sont pas enregistrés en tant que problèmes de Bismon gitlab , car ce logiciel n'est pas encore inédit.
Dans Commit 24E400E4B25EA8FBD91, la documentation ne parvient pas à être générée.
Suppression input{appendix-bm} du fichier bismon-doc.tex ne résout pas ce bug.
La façon préférée de les signaler est d'ajouter un nouveau problème sur https://github.com/bstarynk/bismon
Bien sûr, un problème devrait être autonome. Veuillez donner explicitement la sortie de bismon --version sur votre ordinateur si vous avez pu construire bismon .
Si le problème est lié à la construction de l'exécutable bismon , donnez explicitement toutes les commandes Linux que vous avez exécutées (après avoir examiné et réussi à exécuter le script distclean-script.bash , ou juste après une nouvelle commande git clone ). Mentionnez la sortie de git log -3 .
Alternativement (si vous ne souhaitez pas ajouter de problème github ), envoyez un e-mail (UTF-8 encodé, HTML5 est préférable) en anglais, ou en français, (ou peut-être en russe, seulement si vous ne pouvez pas envoyer un e-mail en anglais ou en français) à [email protected] ou [email protected]. J'essaierai de répondre en anglais ou en français (puisque mon russe écrit est si mauvais).
Si vous avez besoin d'envoyer une capture d'écran, joignez une image encodée en JPEG ou PNG à votre e-mail.
Si vous voulez ou avez besoin d'envoyer plusieurs fichiers, archisez tous dans un répertoire unique (dont le nom de basen (1) ne contient que des lettres, des chiffres et un certain soulignement _ ) et en faire des archives de goudron (1). Donnez-moi explicitement la commande tar que j'ai besoin d'exécuter (sur Linux) pour extraire vos archives. Vous pouvez supposer que j'ai la version 1.30 GNU TAR ou mieux sur mon ordinateur Linux.
Si vous m'envoyez un code C ou C ++ à traiter par bismon , permettez-moi explicitement de le compiler et d'ajouter des commentaires (encodés UTF8) en anglais, en français ou en russe.
Si possible, ajoutez un script shell (pour GNU bash ou pour zsh ....) qui me permet de reproduire ce bug et de nommer ce script dans votre rapport de messagerie ou de bogue.
Mon employeur (si vous êtes en dehors de CEA ...