diff --git a/C/imageViewer/.clang-format b/C/imageViewer/.clang-format new file mode 100644 index 0000000..3c687ec --- /dev/null +++ b/C/imageViewer/.clang-format @@ -0,0 +1,61 @@ +# Clang-format configuration for imageViewer project +--- +Language: C +# Base style +BasedOnStyle: LLVM + +# Indentation +IndentWidth: 4 +TabWidth: 4 +UseTab: Never +IndentCaseLabels: true + +# Braces +BreakBeforeBraces: Attach +Cpp11BracedListStyle: true + +# Line length and breaking +ColumnLimit: 100 +BreakBeforeBinaryOperators: None +BreakBeforeTernaryOperators: true +AlwaysBreakAfterReturnType: None + +# Spacing +SpaceBeforeParens: ControlStatements +SpaceInEmptyParentheses: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +SpaceAfterCStyleCast: false +SpaceBeforeAssignmentOperators: true + +# Alignment +AlignOperands: true +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AlignTrailingComments: true + +# Function parameters +AllowAllParametersOfDeclarationOnNextLine: false +BinPackParameters: false +BinPackArguments: false + +# Includes +SortIncludes: true +IncludeBlocks: Preserve + +# Comments +ReflowComments: true + +# Pointers and references +PointerAlignment: Right +DerivePointerAlignment: false + +# Control statements +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +AllowShortFunctionsOnASingleLine: None +AllowShortCaseLabelsOnASingleLine: false + +# Misc +KeepEmptyLinesAtTheStartOfBlocks: false +MaxEmptyLinesToKeep: 1 diff --git a/C/imageViewer/.clang-tidy b/C/imageViewer/.clang-tidy new file mode 100644 index 0000000..5e52277 --- /dev/null +++ b/C/imageViewer/.clang-tidy @@ -0,0 +1,38 @@ +# Clang-tidy configuration for imageViewer project +Checks: > + clang-diagnostic-*, + clang-analyzer-*, + bugprone-*, + cert-*, + misc-*, + modernize-*, + performance-*, + portability-*, + readability-*, + -readability-magic-numbers, + -modernize-use-trailing-return-type, + -cert-err33-c, + -misc-unused-parameters, + -readability-isolate-declaration + +WarningsAsErrors: '' +HeaderFilterRegex: '.*\.h$' +AnalyzeTemporaryDtors: false +FormatStyle: file +CheckOptions: + - key: readability-identifier-naming.VariableCase + value: snake_case + - key: readability-identifier-naming.FunctionCase + value: snake_case + - key: readability-identifier-naming.MacroCase + value: UPPER_CASE + - key: readability-identifier-naming.TypedefCase + value: CamelCase + - key: readability-identifier-naming.StructCase + value: CamelCase + - key: readability-function-size.LineThreshold + value: 100 + - key: readability-function-size.StatementThreshold + value: 50 + - key: misc-non-private-member-variables-in-classes.IgnoreClassesWithAllMemberVariablesBeingPublic + value: true diff --git a/C/imageViewer/.vscode/settings.json b/C/imageViewer/.vscode/settings.json new file mode 100644 index 0000000..80ef480 --- /dev/null +++ b/C/imageViewer/.vscode/settings.json @@ -0,0 +1,43 @@ +{ + "C_Cpp.default.cStandard": "c99", + "C_Cpp.default.intelliSenseMode": "linux-gcc-x64", + "C_Cpp.default.includePath": [ + "${workspaceFolder}/**", + "/usr/include/SDL2" + ], + "C_Cpp.default.defines": [ + "_REENTRANT" + ], + "C_Cpp.default.compilerPath": "/usr/bin/gcc", + "C_Cpp.clang_format_style": "file", + "C_Cpp.clang_format_fallbackStyle": "LLVM", + + "files.associations": { + "*.h": "c", + "*.c": "c" + }, + + "editor.formatOnSave": true, + "editor.tabSize": 4, + "editor.insertSpaces": true, + "editor.rulers": [100], + + "clang-tidy.executable": "clang-tidy", + "clang-tidy.checks": [ + "clang-diagnostic-*", + "clang-analyzer-*", + "bugprone-*", + "cert-*", + "misc-*", + "performance-*", + "portability-*", + "readability-*" + ], + + "cppcheck.enable": true, + "cppcheck.standard": ["c99"], + "cppcheck.suppress": [ + "missingIncludeSystem", + "unusedFunction" + ] +} diff --git a/C/imageViewer/LINTING.md b/C/imageViewer/LINTING.md new file mode 100644 index 0000000..7b6ab07 --- /dev/null +++ b/C/imageViewer/LINTING.md @@ -0,0 +1,124 @@ +# C Language Linter Setup for imageViewer Project + +This directory contains a comprehensive linting setup for the imageViewer C project. + +## Tools Included + +### 1. **clang-tidy** - Static Analysis +- Configuration: `.clang-tidy` +- Checks for bugs, performance issues, and style violations +- Enforces modern C coding standards + +### 2. **clang-format** - Code Formatting +- Configuration: `.clang-format` +- Automatically formats code to consistent style +- 100-character line limit, 4-space indentation + +### 3. **cppcheck** - Additional Static Analysis +- Detects memory leaks, null pointer dereferences +- Checks for undefined behavior + +### 4. **gcc with warnings** - Compiler Analysis +- Comprehensive warning flags +- Standards compliance checking + +## Usage + +### Quick Start +```bash +# Install dependencies (Arch Linux) +make deps-arch + +# Run all lint checks +make lint + +# Format code +make format + +# Run all checks +make check + +# Check for memory leaks +make memcheck +``` + +### Individual Commands +```bash +# Manual linting +./lint.sh + +# Format specific file +clang-format -i main.c + +# Run clang-tidy +clang-tidy main.c -- -I/usr/include/SDL2 -D_REENTRANT + +# Run cppcheck +cppcheck --enable=all main.c +``` + +## VS Code Integration + +The `.vscode/settings.json` file provides: +- Automatic formatting on save +- C99 standard compliance +- IntelliSense configuration for SDL2 +- Integrated linting with clang-tidy and cppcheck + +## Recommended Extensions for VS Code +- C/C++ (Microsoft) +- clang-tidy (mine-cetinkaya-fianso) +- cppcheck (unixwrapped) + +## Linting Rules + +### Enabled Checks +- **clang-diagnostic-***: Compiler diagnostics +- **clang-analyzer-***: Static analysis +- **bugprone-***: Bug-prone patterns +- **cert-***: CERT secure coding standards +- **misc-***: Miscellaneous checks +- **performance-***: Performance improvements +- **portability-***: Cross-platform issues +- **readability-***: Code readability + +### Disabled Checks +- `readability-magic-numbers`: Allows constants like window dimensions +- `cert-err33-c`: Allows ignoring some function return values +- `misc-unused-parameters`: Common in callback functions + +## Code Quality Workflow + +1. **Write Code**: Develop features in `main.c` +2. **Lint**: Run `make lint` to check for issues +3. **Format**: Run `make format` to fix formatting +4. **Build**: Run `make` to compile +5. **Test**: Run `make test` with sample images +6. **Memory Check**: Run `make memcheck` for leak detection + +## Configuration Files + +- `.clang-tidy`: Static analysis rules +- `.clang-format`: Code formatting style +- `.vscode/settings.json`: VS Code integration +- `lint.sh`: Comprehensive linting script +- `Makefile`: Build and quality targets + +## Installation on Different Systems + +### Arch Linux +```bash +sudo pacman -S clang cppcheck valgrind +``` + +### Ubuntu/Debian +```bash +sudo apt install clang-tidy cppcheck clang-format valgrind +``` + +### Fedora/RHEL +```bash +sudo dnf install clang-tools-extra cppcheck clang valgrind +``` + +This setup ensures high code quality, consistency, and helps catch potential issues early in development. diff --git a/C/imageViewer/Makefile b/C/imageViewer/Makefile index a26df9c..aac38ec 100644 --- a/C/imageViewer/Makefile +++ b/C/imageViewer/Makefile @@ -14,7 +14,7 @@ ifneq ($(SDL2_CFLAGS),) LIBS = $(SDL2_LIBS) -lSDL2_image -lm endif -.PHONY: all clean install deps help +.PHONY: all clean install deps help lint format check memcheck all: $(TARGET) @@ -24,18 +24,44 @@ $(TARGET): $(SOURCE) clean: rm -f $(TARGET) +# Linting and code quality targets +lint: + @echo "Running comprehensive lint checks..." + @./lint.sh + +format: + @echo "Formatting code..." + @if command -v clang-format >/dev/null 2>&1; then \ + clang-format -i $(SOURCE); \ + echo "Code formatted successfully"; \ + else \ + echo "clang-format not found. Install it with: sudo pacman -S clang"; \ + fi + +check: lint + @echo "Running extended checks..." + @if command -v valgrind >/dev/null 2>&1; then \ + echo "Memory leak check available. Run: make memcheck"; \ + else \ + echo "Install valgrind for memory leak detection: sudo pacman -S valgrind"; \ + fi + +memcheck: $(TARGET) + @echo "Running memory leak check..." + @valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./$(TARGET) 2>&1 | head -50 + # Install dependencies on Ubuntu/Debian deps-debian: sudo apt-get update - sudo apt-get install libsdl2-dev libsdl2-image-dev + sudo apt-get install libsdl2-dev libsdl2-image-dev clang-tidy cppcheck clang-format valgrind # Install dependencies on Fedora/RHEL/CentOS deps-fedora: - sudo dnf install SDL2-devel SDL2_image-devel + sudo dnf install SDL2-devel SDL2_image-devel clang-tools-extra cppcheck clang valgrind # Install dependencies on Arch Linux deps-arch: - sudo pacman -S sdl2 sdl2_image + sudo pacman -S sdl2 sdl2_image clang cppcheck valgrind # Run with a test image test: @@ -52,21 +78,24 @@ test: fi help: - @echo "JPG Image Viewer - Makefile targets:" + @echo "imageViewer - Makefile targets:" @echo " all - Build the image viewer" @echo " clean - Remove built files" @echo " test - Run with a test image (if available)" + @echo " lint - Run comprehensive code linting" + @echo " format - Format code with clang-format" + @echo " check - Run all code quality checks" + @echo " memcheck - Run memory leak detection" @echo " deps-debian - Install dependencies on Ubuntu/Debian" @echo " deps-fedora - Install dependencies on Fedora/RHEL/CentOS" @echo " deps-arch - Install dependencies on Arch Linux" @echo " help - Show this help" @echo "" - @echo "Usage: ./$(TARGET) " + @echo "Code Quality Workflow:" + @echo " 1. make lint - Check for issues" + @echo " 2. make format - Fix formatting" + @echo " 3. make check - Run all checks" + @echo " 4. make - Build project" + @echo " 5. make memcheck - Check for memory leaks" @echo "" - @echo "Controls:" - @echo " Mouse wheel / +/- : Zoom in/out" - @echo " Mouse drag : Pan image" - @echo " R : Reset zoom and position" - @echo " F : Fit image to window" - @echo " H : Show help" - @echo " ESC/Q : Quit" + @echo "Usage: ./$(TARGET) " diff --git a/C/imageViewer/lint.sh b/C/imageViewer/lint.sh new file mode 100755 index 0000000..c3a3750 --- /dev/null +++ b/C/imageViewer/lint.sh @@ -0,0 +1,200 @@ +# Lint script for imageViewer project +#!/bin/bash + +set -e + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +print_step() { + echo -e "${BLUE}==>${NC} ${1}" +} + +print_success() { + echo -e "${GREEN}✓${NC} ${1}" +} + +print_warning() { + echo -e "${YELLOW}⚠${NC} ${1}" +} + +print_error() { + echo -e "${RED}✗${NC} ${1}" +} + +# Check if required tools are installed +check_tools() { + print_step "Checking required tools..." + + local missing_tools=() + + if ! command -v clang-tidy &> /dev/null; then + missing_tools+=("clang-tidy") + fi + + if ! command -v cppcheck &> /dev/null; then + missing_tools+=("cppcheck") + fi + + if ! command -v clang-format &> /dev/null; then + missing_tools+=("clang-format") + fi + + if [ ${#missing_tools[@]} -ne 0 ]; then + print_error "Missing required tools: ${missing_tools[*]}" + print_step "Installing missing tools..." + + # Check if we're on Arch Linux + if command -v pacman &> /dev/null; then + sudo pacman -S --needed clang cppcheck + elif command -v apt &> /dev/null; then + sudo apt update && sudo apt install -y clang-tidy cppcheck clang-format + elif command -v dnf &> /dev/null; then + sudo dnf install -y clang-tools-extra cppcheck clang + else + print_error "Please install the following tools manually: ${missing_tools[*]}" + exit 1 + fi + fi + + print_success "All required tools are available" +} + +# Run clang-tidy +run_clang_tidy() { + print_step "Running clang-tidy analysis..." + + if [ -f ".clang-tidy" ]; then + clang-tidy main.c -- -I/usr/include/SDL2 -D_REENTRANT 2>/dev/null || { + print_warning "clang-tidy found issues (see output above)" + } + else + print_warning ".clang-tidy config not found, using default settings" + clang-tidy main.c -- -I/usr/include/SDL2 -D_REENTRANT 2>/dev/null || { + print_warning "clang-tidy found issues (see output above)" + } + fi + + print_success "clang-tidy analysis completed" +} + +# Run cppcheck +run_cppcheck() { + print_step "Running cppcheck analysis..." + + cppcheck --enable=all --suppress=missingIncludeSystem --suppress=unusedFunction \ + --suppress=constParameter --quiet --std=c99 main.c || { + print_warning "cppcheck found issues (see output above)" + } + + print_success "cppcheck analysis completed" +} + +# Check code formatting +check_formatting() { + print_step "Checking code formatting..." + + if [ -f ".clang-format" ]; then + if clang-format --dry-run --Werror main.c 2>/dev/null; then + print_success "Code formatting is correct" + else + print_warning "Code formatting issues found" + echo "Run 'clang-format -i main.c' to fix formatting" + fi + else + print_warning ".clang-format config not found, skipping format check" + fi +} + +# Run basic compile check +compile_check() { + print_step "Running compile check..." + + # Try to compile with extra warnings + if gcc -Wall -Wextra -Wpedantic -std=c99 -O2 \ + $(pkg-config --cflags sdl2 2>/dev/null || echo "-I/usr/include/SDL2") \ + -c main.c -o /tmp/main.o 2>/dev/null; then + print_success "Compile check passed" + rm -f /tmp/main.o + else + print_error "Compile check failed" + print_step "Trying compile with detailed errors..." + gcc -Wall -Wextra -Wpedantic -std=c99 -O2 \ + $(pkg-config --cflags sdl2 2>/dev/null || echo "-I/usr/include/SDL2") \ + -c main.c -o /tmp/main.o + fi +} + +# Check for common C issues +check_common_issues() { + print_step "Checking for common C issues..." + + local issues=0 + + # Check for TODO/FIXME comments + if grep -n "TODO\|FIXME\|XXX\|HACK" main.c 2>/dev/null; then + print_warning "Found TODO/FIXME comments" + issues=$((issues + 1)) + fi + + # Check for potential buffer overflows + if grep -n "strcpy\|strcat\|sprintf\|gets" main.c 2>/dev/null; then + print_warning "Found potentially unsafe string functions" + issues=$((issues + 1)) + fi + + # Check for magic numbers (basic check) + if grep -E "\b[0-9]{3,}\b" main.c | grep -v "printf\|#define" 2>/dev/null; then + print_warning "Found potential magic numbers" + issues=$((issues + 1)) + fi + + if [ $issues -eq 0 ]; then + print_success "No common issues found" + fi +} + +# Main execution +main() { + echo -e "${BLUE}C Language Linter for imageViewer Project${NC}" + echo "==========================================" + echo + + # Check if we're in the right directory + if [ ! -f "main.c" ]; then + print_error "main.c not found. Please run this script from the imageViewer directory." + exit 1 + fi + + check_tools + echo + + compile_check + echo + + run_clang_tidy + echo + + run_cppcheck + echo + + check_formatting + echo + + check_common_issues + echo + + print_success "Linting completed!" + echo + echo -e "${BLUE}Available commands:${NC}" + echo " ./lint.sh - Run all checks" + echo " clang-format -i main.c - Fix formatting" + echo " clang-tidy main.c --fix - Apply clang-tidy fixes" +} + +# Run main function +main "$@"