mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-04-26 14:54:55 +00:00
317 lines
6.1 KiB
Markdown
317 lines
6.1 KiB
Markdown
# C++ Code Quality and Linting Guide
|
|
|
|
## Overview
|
|
|
|
The DBAL C++ project uses industry-standard tools for maintaining code quality:
|
|
|
|
- **clang-tidy**: Static analysis and linting
|
|
- **clang-format**: Code formatting
|
|
- **cppcheck**: Additional static analysis
|
|
- **Doxygen**: Documentation generation
|
|
|
|
## Quick Start
|
|
|
|
### Run All Checks
|
|
|
|
```bash
|
|
cd dbal/cpp
|
|
./lint.sh
|
|
```
|
|
|
|
### Apply Automatic Fixes
|
|
|
|
```bash
|
|
./lint.sh --fix
|
|
```
|
|
|
|
## Tools
|
|
|
|
### 1. clang-tidy
|
|
|
|
**Purpose**: Static analysis, best practices enforcement, modern C++ suggestions
|
|
|
|
**Configuration**: `.clang-tidy`
|
|
|
|
**Enabled Checks**:
|
|
- `bugprone-*` - Potential bugs
|
|
- `cert-*` - CERT secure coding guidelines
|
|
- `clang-analyzer-*` - Clang static analyzer
|
|
- `cppcoreguidelines-*` - C++ Core Guidelines
|
|
- `google-*` - Google C++ Style Guide
|
|
- `modernize-*` - Modern C++ suggestions
|
|
- `performance-*` - Performance improvements
|
|
- `readability-*` - Code readability
|
|
|
|
**Usage**:
|
|
```bash
|
|
# Single file
|
|
clang-tidy src/daemon/server.cpp -p build/
|
|
|
|
# All files
|
|
find src -name "*.cpp" | xargs clang-tidy -p build/
|
|
```
|
|
|
|
### 2. clang-format
|
|
|
|
**Purpose**: Automatic code formatting
|
|
|
|
**Configuration**: `.clang-format`
|
|
|
|
**Style**: Based on Google C++ Style Guide with customizations:
|
|
- 4-space indentation
|
|
- 100 character line limit
|
|
- Attach braces
|
|
- Pointer/reference alignment: left
|
|
|
|
**Usage**:
|
|
```bash
|
|
# Check formatting
|
|
clang-format --dry-run --Werror src/daemon/server.cpp
|
|
|
|
# Apply formatting
|
|
clang-format -i src/daemon/server.cpp
|
|
|
|
# Format all files
|
|
find src include -name "*.cpp" -o -name "*.hpp" | xargs clang-format -i
|
|
```
|
|
|
|
### 3. cppcheck
|
|
|
|
**Purpose**: Additional static analysis for potential bugs
|
|
|
|
**Usage**:
|
|
```bash
|
|
cppcheck --enable=all \
|
|
--suppress=missingIncludeSystem \
|
|
--std=c++17 \
|
|
-I include \
|
|
src/
|
|
```
|
|
|
|
### 4. Doxygen
|
|
|
|
**Purpose**: Generate HTML documentation from code comments
|
|
|
|
**Style**: Javadoc-style comments
|
|
|
|
**Example**:
|
|
```cpp
|
|
/**
|
|
* @brief Brief description
|
|
*
|
|
* Detailed description of the function or class.
|
|
*
|
|
* @param param1 Description of parameter
|
|
* @param param2 Description of parameter
|
|
* @return Description of return value
|
|
* @throws Error Description of when error is thrown
|
|
*
|
|
* @example
|
|
* @code
|
|
* auto result = myFunction(42, "test");
|
|
* if (result.isOk()) {
|
|
* std::cout << result.value();
|
|
* }
|
|
* @endcode
|
|
*/
|
|
Result<int> myFunction(int param1, const std::string& param2);
|
|
```
|
|
|
|
**Generate docs**:
|
|
```bash
|
|
doxygen Doxyfile
|
|
```
|
|
|
|
## Documentation Standards
|
|
|
|
### File Headers
|
|
|
|
Every source file should have a file-level docstring:
|
|
|
|
```cpp
|
|
/**
|
|
* @file filename.cpp
|
|
* @brief Brief description of file purpose
|
|
*
|
|
* Detailed description of what this file contains,
|
|
* its role in the system, and any important notes.
|
|
*/
|
|
```
|
|
|
|
### Class Documentation
|
|
|
|
```cpp
|
|
/**
|
|
* @class ClassName
|
|
* @brief Brief description of class purpose
|
|
*
|
|
* Detailed description of the class, its responsibilities,
|
|
* and how it should be used.
|
|
*
|
|
* @example
|
|
* @code
|
|
* ClassName obj(param1, param2);
|
|
* obj.doSomething();
|
|
* @endcode
|
|
*/
|
|
class ClassName {
|
|
// ...
|
|
};
|
|
```
|
|
|
|
### Function Documentation
|
|
|
|
```cpp
|
|
/**
|
|
* @brief Brief description of what function does
|
|
*
|
|
* Detailed description including algorithm details,
|
|
* preconditions, postconditions, and side effects.
|
|
*
|
|
* @param param1 Description of first parameter
|
|
* @param param2 Description of second parameter
|
|
* @return Description of return value
|
|
* @throws ErrorType When this error occurs
|
|
*
|
|
* @note Special notes or caveats
|
|
* @warning Important warnings
|
|
* @see Related functions or classes
|
|
*/
|
|
Result<ReturnType> functionName(Type1 param1, Type2 param2);
|
|
```
|
|
|
|
### Member Variables
|
|
|
|
```cpp
|
|
class MyClass {
|
|
private:
|
|
int counter_; ///< Brief description of member
|
|
std::string name_; ///< Brief description of member
|
|
};
|
|
```
|
|
|
|
## Naming Conventions
|
|
|
|
Enforced by clang-tidy configuration:
|
|
|
|
- **Classes/Structs**: `CamelCase`
|
|
- **Functions**: `camelCase`
|
|
- **Variables**: `lower_case`
|
|
- **Constants**: `UPPER_CASE`
|
|
- **Member variables**: `lower_case_` (trailing underscore)
|
|
- **Namespaces**: `lower_case`
|
|
|
|
## Pre-commit Hooks
|
|
|
|
To automatically run linting before commits:
|
|
|
|
```bash
|
|
# Create pre-commit hook
|
|
cat > .git/hooks/pre-commit << 'EOF'
|
|
#!/bin/bash
|
|
cd dbal/cpp
|
|
./lint.sh
|
|
if [ $? -ne 0 ]; then
|
|
echo "Linting failed. Fix issues or use git commit --no-verify to skip."
|
|
exit 1
|
|
fi
|
|
EOF
|
|
|
|
chmod +x .git/hooks/pre-commit
|
|
```
|
|
|
|
## IDE Integration
|
|
|
|
### VSCode
|
|
|
|
Install extensions:
|
|
- **C/C++** (Microsoft)
|
|
- **clangd**
|
|
- **Clang-Format**
|
|
|
|
Settings (`.vscode/settings.json`):
|
|
```json
|
|
{
|
|
"clang-format.executable": "/usr/bin/clang-format",
|
|
"clang-format.style": "file",
|
|
"editor.formatOnSave": true,
|
|
"C_Cpp.codeAnalysis.clangTidy.enabled": true,
|
|
"C_Cpp.codeAnalysis.clangTidy.path": "/usr/bin/clang-tidy"
|
|
}
|
|
```
|
|
|
|
### CLion
|
|
|
|
Settings → Editor → Code Style → C/C++:
|
|
- Scheme: Set from file (.clang-format)
|
|
|
|
Settings → Editor → Inspections → C/C++:
|
|
- Enable "Clang-Tidy"
|
|
- Configuration file: .clang-tidy
|
|
|
|
## Continuous Integration
|
|
|
|
Add to GitHub Actions workflow:
|
|
|
|
```yaml
|
|
- name: Lint C++ Code
|
|
run: |
|
|
cd dbal/cpp
|
|
./lint.sh
|
|
```
|
|
|
|
## Common Issues and Fixes
|
|
|
|
### Issue: "Use of old-style cast"
|
|
```cpp
|
|
// Bad
|
|
int x = (int)value;
|
|
|
|
// Good
|
|
int x = static_cast<int>(value);
|
|
```
|
|
|
|
### Issue: "Variable never read"
|
|
```cpp
|
|
// Bad
|
|
int unused = 42;
|
|
|
|
// Good
|
|
[[maybe_unused]] int for_future_use = 42;
|
|
```
|
|
|
|
### Issue: "Missing const"
|
|
```cpp
|
|
// Bad
|
|
std::string getName() { return name_; }
|
|
|
|
// Good
|
|
std::string getName() const { return name_; }
|
|
```
|
|
|
|
### Issue: "Pass by value instead of const reference"
|
|
```cpp
|
|
// Bad
|
|
void setName(std::string name) { name_ = name; }
|
|
|
|
// Good
|
|
void setName(const std::string& name) { name_ = name; }
|
|
```
|
|
|
|
## Metrics
|
|
|
|
The lint script reports:
|
|
- Formatting violations
|
|
- Static analysis warnings
|
|
- TODO/FIXME comments count
|
|
- Long functions (>100 lines)
|
|
|
|
Aim for zero warnings before committing.
|
|
|
|
## Resources
|
|
|
|
- [C++ Core Guidelines](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines)
|
|
- [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html)
|
|
- [clang-tidy checks](https://clang.llvm.org/extra/clang-tidy/checks/list.html)
|
|
- [Doxygen manual](https://www.doxygen.nl/manual/)
|