DEV Community

Fahad Ali Khan
Fahad Ali Khan

Posted on

Enhancing Code Quality in EnglishFormatter with Static Analysis Tools

Introduction

In this post, I'll discuss my experience of setting up static analysis tools—clang-format and clang-tidy—in my C++ project, EnglishFormatter. Static analysis tools play a vital role in maintaining code quality by automatically detecting common issues and ensuring consistent code style, which is especially crucial in collaborative projects. I'll also cover the CONTRIBUTING.md file I created, which outlines how contributors can use these tools in their workflow.

Project Overview

EnglishFormatter is a command-line tool that formats, summarizes, and paraphrases text documents using advanced language models. It provides a user-friendly, interactive interface for different text-processing options and supports customization through command-line arguments.

Setting Up Static Analysis Tools

Step 1: Adding clang-format for Code Formatting

I started by integrating clang-format to maintain a consistent code style across the project. Here’s what I did:

  1. Installed clang-format: I installed clang-format as per my platform’s instructions.
  2. Configured clang-format: I created a .clang-format file with project-specific settings. To automate formatting, I added a format.sh script, which applies clang-format to all .cpp and .hpp files in the codebase. Running this script ensures that all files adhere to the same style without manual intervention.

Step 2: Using clang-tidy for Code Linting

Next, I set up clang-tidy to catch subtle coding issues and enforce modern C++ best practices:

  1. Installed clang-tidy: I installed clang-tidy on my system.
  2. Configured clang-tidy: I created a .clang-tidy file with checks for common issues, including safety checks from clang-analyzer. A lint.sh script was added to automate linting across the codebase.
  3. Applying clang-tidy suggestions: Running clang-tidy highlighted two changes that I made to enhance code quality:
    • Using a trailing return type: I changed the function bool test_env(char *apiKeyCStr, char *apiUrlCStr) to use a trailing return type, making it auto test_env(char *apiKeyCStr, char *apiUrlCStr) -> bool. This style improves readability in function declarations, especially in templates or complex types.
    • Making save_file static: clang-tidy suggested making the save_file method static, as it does not rely on instance-specific data. I updated the method signature accordingly, which improves performance by avoiding the need for an instance context.

Creating CONTRIBUTING.md

To make it easier for new contributors to get started, I created a CONTRIBUTING.md file. This document provides guidelines for setting up the development environment, running clang-format and clang-tidy, and building the project. Here’s a breakdown of what it includes:

  1. Development Setup: Instructions for installing prerequisites, dependencies, and setting up the .env file.
  2. Formatting and Linting: Steps to run clang-format and clang-tidy, with scripts included for convenience.
  3. Editor/IDE Integration: Instructions for integrating clang-format and clang-tidy with Visual Studio Code, allowing contributors to automatically format and lint code upon save.
  4. Contribution Workflow: Guidelines for creating feature branches, committing changes, and submitting pull requests.

Lessons Learned

Integrating static analysis tools into my project taught me several valuable lessons:

  • Improving Readability and Maintainability: By automating code formatting, contributors can focus on writing clean code without worrying about style inconsistencies.
  • Early Bug Detection: clang-tidy helps catch potential issues before they reach production, promoting safer and more reliable code.
  • Enhanced Collaboration: The CONTRIBUTING.md file standardizes the development workflow, making it easier for new contributors to onboard and contribute effectively.

Conclusion

Setting up clang-format and clang-tidy in EnglishFormatter has been an enlightening experience, reinforcing the importance of static analysis in maintaining code quality. With these tools in place, the project is now better prepared for future development, with a streamlined workflow that promotes readability and robustness.

Top comments (0)