Giter VIP home page Giter VIP logo

bazellab's Introduction

Laboratoire Bazel

Pré-engagement

Un espace d'expérimentation conçu pour explorer les capacités de Bazel dans un environnement multi-langages.

Ce projet vise à approfondir la connaissance de la construction logicielle avec Bazel dans un environnement multi-langages. Il permet d'expérimenter avec des langages de programmation tels que le C++, Python et Rust. Le projet explore les avantages de Bazel pour la gestion des dépendances et l'optimisation des constructions dans un cadre diversifié. Créé pour faciliter l'apprentissage et l'innovation, "BazelLab" offre une chance d'améliorer la compétence en programmation et de comprendre les subtilités des systèmes de construction contemporains, tout en restant dans un environnement confortable et autodirigé.

Utilisation de Bazelisk pour la gestion de projet

Introduction à Bazelisk

Dans ce projet, nous imposons l'utilisation de Bazelisk en tant que gestionnaire de version pour Bazel, notre principal outil de construction. Bazelisk sert d'enveloppe indispensable autour de Bazel, fournissant plusieurs avantages clés cruciaux pour le développement logiciel sophistiqué.

Implications de ne pas utiliser Bazelisk

Négliger l'utilisation de Bazelisk dans ce projet pourrait entraîner plusieurs défis significatifs :

Installation de Bazelisk

  1. Pour installer Bazelisk et garantir une expérience de développement sans heurts, suivez ces étapes :
curl -LJO "https://github.com/bazelbuild/bazelisk/releases/latest/download/bazelisk-linux-amd64"
chmod +x bazelisk-linux-amd64
mv bazelisk-linux-amd64 /usr/local/bin/bazel

Pour vérifier l'installation, exécutez la commande suivante :

bazel version
  1. Utilisation : Utilisez la commande bazel comme d'habitude dans vos processus de construction. Bazelisk gérera automatiquement la version de Bazel, s'alignant sur les spécifications de votre projet.

Pré-engagement

Ce projet utilise pre-commit pour automatiser les contrôles de qualité du code avant de valider les modifications. pre-commit est un outil qui permet d'exécuter automatiquement une série de contrôles (hooks) sur vos fichiers à chaque validation. Cela garantit que le code soumis respecte les normes de qualité définies dans le projet. Configuration

La configuration de pre-commit est définie dans le fichier .pre-commit-config.yaml à la racine du projet. Ce fichier spécifie les hooks à exécuter et la manière de les exécuter. Pour installer et configurer pre-commit localement, il suffit d'exécuter la commande suivante

pre-commit install

Mise à jour et exécution des hooks

Pour mettre à jour les hooks de pre-commit et les exécuter sur tous les fichiers du projet, vous pouvez utiliser la commande suivante :

pre-commit autoupdate --freeze && pre-commit run -a

Exécuter avec Bazel

Pour exécuter les hooks pre-commit avec Bazel, utilisez la commande suivante :

bazel run //scripts:lint

Génération de la base de données de compilation avec Hedron

Hedron est un outil utile pour générer une base de données de compilation (compile database) à partir de projets Bazel. Cette base de données est essentielle pour l'intégration de Bazel avec des outils externes tels que les analyseurs statiques de code et les éditeurs de texte pour une meilleure prise en charge du développement.

Pour utiliser Hedron et générer une base de données de compilation, exécutez simplement la commande :

bazel run :refresh_compile_commands

Gestion des dépendances avec Bazel

Dans ce projet, Bazel est utilisé pour maintenir et mettre à jour les dépendances Python. Les commandes ci-dessous sont utilisées pour assurer la cohérence des versions des dépendances à travers le développement.

bazel mod deps --lockfile_mode=update
bazel run //third_party/pip:requirements.update

Elles simplifient le processus de mise à jour et garantissent la compatibilité des dépendances, contribuant ainsi à la stabilité du projet.

Tests de Fuzzing avec Bazel

Dans ce projet, nous utilisons des tests de fuzzing pour détecter des bogues, des vulnérabilités et des comportements inattendus dans notre code. Les tests de fuzzing consistent à injecter des données aléatoires ou semi-aléatoires dans notre programme pour tester sa robustesse.

Configuration des Tests de Fuzzing

Pour exécuter les tests de fuzzing dans notre projet, nous avons configuré des options spécifiques dans Bazel pour utiliser les moteurs de fuzzing libFuzzer en combinaison avec AddressSanitizer (ASan) et UndefinedBehaviorSanitizer (UBSan) pour détecter les erreurs de mémoire et les comportements indéfinis dans notre code C/C++.

Voici les commandes de configuration pour les tests de fuzzing avec Bazel :

build:asan-libfuzzer --@rules_fuzzing//fuzzing:cc_engine=@rules_fuzzing//fuzzing/engines:libfuzzer
build:asan-libfuzzer --@rules_fuzzing//fuzzing:cc_engine_instrumentation=libfuzzer
build:asan-libfuzzer --@rules_fuzzing//fuzzing:cc_engine_sanitizer=asan

build:ubsan-libfuzzer --@rules_fuzzing//fuzzing:cc_engine=@rules_fuzzing//fuzzing/engines:libfuzzer
build:ubsan-libfuzzer --@rules_fuzzing//fuzzing:cc_engine_instrumentation=libfuzzer
build:ubsan-libfuzzer --@rules_fuzzing//fuzzing:cc_engine_sanitizer=ubsan

Ces configurations nous permettent de détecter efficacement les erreurs et les bogues potentiels dans notre code, contribuant ainsi à améliorer sa qualité et sa fiabilité.

Exécution des Tests de Fuzzing

Pour exécuter les tests de fuzzing avec les configurations définies, utilisez les commandes suivantes :

bazel run --config=asan-libfuzzer //src/lib/containers:fuzz_test
bazel run --config=ubsan-libfuzzer //src/lib/containers:fuzz_test

Ces commandes lancent respectivement les tests de fuzzing avec les configurations ASan-libfuzzer et UBSan-libfuzzer sur notre code source situé dans le répertoire src/lib/containers.

Codechecker

  1. Checkout repository
  2. Install LLVM
  3. Get CodeChecker
    1. pip3 install codechecker
  4. Prepare JSON compilation Database
    1. bazel run :refresh_compile_commands
  5. Execute static analysis
    1. CodeChecker analyze compile_commands.json --output external/tmp --jobs $(nproc)
  6. Parse and convert results to HTML
    1. CodeChecker parse /mnt/c/Users/33673/Documents/codechecker --export "html" --output /mnt/c/Users/33673/Documents/codechecker/toto
  7. Store the result in the CodeChecker server/database (upload analysis of the main branch for diff with PR)
    1. CodeChecker store /mnt/c/Users/33673/Documents/codechecker/ --url "http://localhost:8001/Default" --name "Mon Premier Essai" --tag "UnTag"
    2. Idea: create a baseline file from the reports which contains the legacy finding.
  8. Diff current results against previously stored run 1.

bazellab's People

Contributors

thibfrgsgmz avatar

Stargazers

 avatar

Watchers

 avatar

bazellab's Issues

✨ Integrate Ericsson's CodeChecker

See: https://codechecker.readthedocs.io/en/latest/

  • Must be integrated as Bazel Python dependency in line with hermetic environment managed by Bazel.
  • Configure VSCode with the CodeChecker VSCode Extension (add what's needed in the .code-workspace)
  • Streamline the CI process and define the strategy of how to handle the false-positive.

For now only analyze with clang-based tool and GCC's analyzer. No need for Meta's Infer, CPPLINT (too slow), and Cppcheck (not clear added value from experience).

Static Analysis flow:

  • Include LLVM Clang suite's analysers, and CodeChecker in Bazel hermetic environment
  • Obtain the compile_command.json to prepare for analysis (hedron tool or CodeChecker log)
  • Execute the analysis CodeChecker analyze compile_command.json
  • Show the analysis results in the CI log, and create HTML reports that can be uploaded as an artifact CodeChecker parse
  • Check for the current commit introducing new bug reports against a known state CodeChecker cmd diff and CodeChecker store.

Static analysis is a time-consuming process so it needs as its own job in a workflow, or a completely distinct workflow altogether.

More info here:

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.