Analysis Tools¶
Status: ✅ COMPLETED Version: 1.0.0 Phase: 08_05 - Optimization Pipeline / Phase 1
Overview¶
Static analysis and profiling tools for DSP code optimization. Detects RT-safety violations, calculates code complexity metrics, and integrates with profiling backends.
Components¶
1. StaticAnalyzer¶
Static code analysis for DSP processors.
Features: - RT-safety violation detection (malloc, new, locks) - Memory leak detection - Performance warning identification - SIMD alignment checking - Cache-efficiency analysis - Cyclomatic complexity checking
Usage:
#include "StaticAnalyzer.hpp"
using namespace audiolab::plugins::optimization;
// Analyze a file
StaticAnalyzer analyzer;
if (analyzer.analyzeFile("MyProcessor.cpp")) {
std::cout << analyzer.generateReport();
}
// Check specific issues
auto rtIssues = analyzer.getIssuesByType(IssueType::RTSafetyViolation);
for (const auto& issue : rtIssues) {
std::cout << issue.file << ":" << issue.line
<< " - " << issue.message << "\n";
}
Configuration:
AnalysisConfig config;
config.checkRTSafety = true;
config.checkPerformance = true;
config.maxCyclomaticComplexity = 15;
config.treatWarningsAsErrors = false;
StaticAnalyzer analyzer(config);
2. ComplexityMetrics¶
Code complexity calculator (cyclomatic, cognitive, maintainability).
Features: - Cyclomatic complexity (McCabe) - Cognitive complexity (readability) - Nesting depth analysis - Lines of code metrics - Maintainability index (0-100) - Function-level and module-level analysis
Usage:
#include "ComplexityMetrics.hpp"
using namespace audiolab::plugins::optimization;
// Analyze a module
ComplexityMetrics metrics;
auto moduleMetrics = metrics.analyzeFile("MyModule.cpp");
std::cout << "Functions: " << moduleMetrics.functionCount << "\n";
std::cout << "Avg Complexity: " << moduleMetrics.avgCyclomaticComplexity << "\n";
std::cout << "Maintainability: "
<< ComplexityMetrics::calculateMaintainabilityIndex(moduleMetrics)
<< "/100\n";
// Check individual functions
for (const auto& func : moduleMetrics.functions) {
if (metrics.exceedsThresholds(func)) {
std::cout << "Warning: " << func.name
<< " complexity=" << func.cyclomaticComplexity << "\n";
}
}
Complexity Levels: - Low: <= 5 - Medium: 6-10 - High: 11-20 - Very High: 21-50 - Extreme: > 50
3. ProfilingIntegration¶
Integration with profiling tools (Tracy, perf, VTune, Instruments).
Features: - RAII-based profiling scopes - Manual zone instrumentation - Performance statistics (min/max/avg/stddev) - Hotspot analysis - Export formats: Chrome Trace (JSON), Flamegraph, Tracy - Multi-threaded profiling support
Usage:
#include "ProfilingIntegration.hpp"
using namespace audiolab::plugins::optimization;
// Initialize profiler
ProfilingIntegration profiler;
profiler.initialize();
profiler.startSession("my_optimization_run");
// RAII-based profiling (automatic)
{
ProfileScope scope("processBlock");
// ... your code ...
} // timing automatically recorded
// Manual profiling
profiler.beginZone("custom_zone");
// ... your code ...
profiler.endZone();
// Get statistics
profiler.stopSession();
auto stats = profiler.getStats("processBlock");
std::cout << "Avg duration: " << stats.avgDuration.count() / 1e6 << " ms\n";
// Analyze hotspots
auto hotspots = profiler.analyzeHotspots(10);
for (const auto& [name, percentage] : hotspots) {
std::cout << name << ": " << percentage << "%\n";
}
// Export results
profiler.exportToChromeTrace("trace.json");
Profiling Macros:
#define PROFILING_ENABLED
#include "ProfilingIntegration.hpp"
void myFunction() {
AL_PROFILE_FUNCTION(); // Profiles entire function
{
AL_PROFILE_SCOPE("inner_loop");
// ... code ...
}
}
Supported Backends:
- ProfilerType::None - Manual profiling only
- ProfilerType::Tracy - Tracy profiler integration
- ProfilerType::Perf - Linux perf integration
- ProfilerType::VTune - Intel VTune integration
- ProfilerType::Instruments - macOS Instruments integration
Building¶
Requirements¶
- CMake 3.20+
- C++20 compiler
- Catch2 (via vcpkg)
Compile¶
cd 4 - INTEGRATION/08_PLUGINS/08_05_optimization_pipeline/08_05_00_analysis_tools
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake
cmake --build . --config Release
Run Tests¶
Testing¶
Test Coverage¶
- ✅ StaticAnalyzer - RT safety violations (malloc, new, locks)
- ✅ StaticAnalyzer - Performance warnings (division in loops, push_back)
- ✅ StaticAnalyzer - SIMD alignment detection
- ✅ StaticAnalyzer - Report generation (text, JSON)
- ✅ ComplexityMetrics - Cyclomatic complexity calculation
- ✅ ComplexityMetrics - Cognitive complexity calculation
- ✅ ComplexityMetrics - Nesting depth analysis
- ✅ ComplexityMetrics - Module-level analysis
- ✅ ComplexityMetrics - Maintainability index
- ✅ ProfilingIntegration - Session management
- ✅ ProfilingIntegration - RAII profiling scopes
- ✅ ProfilingIntegration - Manual zones
- ✅ ProfilingIntegration - Statistics calculation
- ✅ ProfilingIntegration - Hotspot analysis
- ✅ ProfilingIntegration - Export formats (Chrome Trace, Flamegraph)
Examples¶
Example 1: Pre-commit Hook¶
// check_rt_safety.cpp
#include "StaticAnalyzer.hpp"
#include <iostream>
int main(int argc, char* argv[]) {
if (argc < 2) {
std::cerr << "Usage: check_rt_safety <file.cpp>\n";
return 1;
}
audiolab::plugins::optimization::StaticAnalyzer analyzer;
if (!analyzer.analyzeFile(argv[1])) {
std::cerr << analyzer.generateReport();
return 1;
}
if (!analyzer.passed()) {
std::cerr << "RT-safety violations found!\n";
std::cerr << analyzer.generateReport();
return 1;
}
std::cout << "✓ RT-safety check passed\n";
return 0;
}
Example 2: Complexity Monitoring¶
// check_complexity.cpp
#include "ComplexityMetrics.hpp"
#include <iostream>
int main(int argc, char* argv[]) {
if (argc < 2) {
std::cerr << "Usage: check_complexity <directory>\n";
return 1;
}
audiolab::plugins::optimization::ComplexityMetrics metrics;
auto project = metrics.analyzeDirectory(argv[1]);
std::cout << "Project Metrics:\n";
std::cout << " Files: " << project.totalFiles << "\n";
std::cout << " Functions: " << project.totalFunctions << "\n";
std::cout << " Avg Complexity: " << project.avgComplexity << "\n";
std::cout << " Max Complexity: " << project.maxComplexity << "\n";
if (project.maxComplexity > 20) {
std::cerr << "Warning: High complexity detected!\n";
return 1;
}
return 0;
}
Example 3: Performance Profiling¶
// profile_dsp.cpp
#include "ProfilingIntegration.hpp"
#include <iostream>
void processDSP(float* buffer, int samples) {
AL_PROFILE_FUNCTION();
{
AL_PROFILE_SCOPE("envelope");
// envelope processing
}
{
AL_PROFILE_SCOPE("filter");
// filter processing
}
}
int main() {
auto& profiler = audiolab::plugins::optimization::ProfilingIntegration::instance();
profiler.initialize();
profiler.startSession("dsp_profiling");
// Run DSP processing
float buffer[512];
for (int i = 0; i < 1000; ++i) {
processDSP(buffer, 512);
}
profiler.stopSession();
// Analyze results
std::cout << profiler.generateReport();
auto hotspots = profiler.analyzeHotspots(5);
std::cout << "\nTop 5 Hotspots:\n";
for (const auto& [name, pct] : hotspots) {
std::cout << " " << name << ": " << pct << "%\n";
}
profiler.exportToChromeTrace("dsp_profile.json");
return 0;
}
Integration with CI/CD¶
GitHub Actions¶
Pre-commit Hook¶
#!/bin/bash
for file in $(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(cpp|hpp)$'); do
./check_rt_safety "$file" || exit 1
done
Performance¶
- StaticAnalyzer: ~10ms per 1000 LOC
- ComplexityMetrics: ~5ms per 1000 LOC
- ProfilingIntegration: <10ns overhead per zone (RAII)
Limitations¶
- StaticAnalyzer: Pattern-based detection (not full AST parsing)
- ComplexityMetrics: Simplified function extraction (regex-based)
- ProfilingIntegration: Backend integration requires external libraries
Future Enhancements¶
- Full AST parsing for StaticAnalyzer (Clang LibTooling)
- Halstead complexity metrics
- Data flow analysis
- Tracy backend implementation
- Perf integration for hardware counters
Dependencies¶
- Internal: None (standalone module)
- External: Catch2 (testing only)
- Optional: Tracy, perf, VTune, Instruments (runtime backends)
API Stability¶
Stable - API is considered stable for v1.0.0
License¶
Part of AudioLab framework - Internal use only
✅ Phase 1 Complete - Ready for integration with Phase 2 (Complexity Scoring)