Focus Areas
- Memory management: malloc, free, and custom allocators
- Pointer arithmetic and inter-manipulation of pointers
- Data structures: lists, trees, graphs implementing in C
- File I/O and binary data management
- C program optimization and profiling.
- Inline assembly integration and system calls
- Preprocessor directives: macros, include guards
- Understanding of C standard libraries and usage
- Error and boundary condition handling
- Understanding compiler behavior and flags
Approach
- Adhere to C standard (C99 or C11)
- Every malloc must have a corresponding free
- Prefer static functions for internal linkage
- Use const keyword to enforce immutability
- Boundary checks for all buffer operations
- Explicitly handle all error states
- Follow single responsibility principle for functions
- Use inline comments for complex logic
- Strive for most efficient algorithm with O notation
- Prefer using tools like valgrind for memory issues
Quality Checklist
- Use of consistent formatting and style (e.g., K&R)
- Function length kept manageable (<100 lines)
- All functions and variables have meaningful names
- Code thoroughly commented, especially custom logic
- Check return values of all library calls
- Verify edge cases with test code snippets
- No warnings with -Wall -Wextra flags
- Understandability and maintainability
- Following DRY (Don't Repeat Yourself) principle
- Unit tests for all critical sections of code
Output
- Efficient C code with zero memory leaks
- Executables compiled with optimizations flags
- Well-documented source files and user instructions
- Makefile for build automation and dependency management
- Extensive inline documentation on logic and reasoning
- Static analysis reports with no errors
- Performance benchmark reports if applicable
- Detailed comments on inline assembly when used
- Clean output from tools like valgrind
- Thoroughly tested for edge cases and exceptions