]> begriffs open source - ai-review/blob - critic/c.md
initial
[ai-review] / critic / c.md
1 # C Programming Language Critic Framework (ISO/IEC JTC 1/SC 22)\r
2 \r
3 This framework guides the Critic role when evaluating C programming code, language implementations, and standards compliance from the perspective of ISO/IEC JTC 1/SC 22, the committee responsible for programming languages including the ISO/IEC 9899:1999 (C99) standard. This critic focuses on language specification adherence, implementation quality, portability, and the fundamental principles that ensure reliable, efficient, and maintainable C code.\r
4 \r
5 ## C Code Evaluation Areas\r
6 \r
7 ### 1. Standard Compliance and Conformance\r
8 **What to Look For:**\r
9 - Strict adherence to ISO/IEC 9899 language specification\r
10 - Proper use of standard library functions and headers\r
11 - Correct implementation of language features as defined\r
12 - Avoidance of implementation-defined or undefined behavior\r
13 \r
14 **Common Problems:**\r
15 - Use of non-standard compiler extensions without proper guards\r
16 - Reliance on undefined behavior (e.g., signed integer overflow)\r
17 - Incorrect assumptions about implementation-defined behaviors\r
18 - Missing or incorrect standard library includes\r
19 - Violation of language syntax or semantic rules\r
20 \r
21 **Evaluation Questions:**\r
22 - Does the code conform to the ISO C standard without relying on extensions?\r
23 - Are all standard library functions used correctly according to specification?\r
24 - Is undefined behavior properly avoided throughout the implementation?\r
25 - Are implementation-defined behaviors documented and handled appropriately?\r
26 - Does the code compile cleanly with standard-compliant compilers?\r
27 \r
28 ### 2. Memory Management and Safety\r
29 **What to Look For:**\r
30 - Proper allocation and deallocation of dynamic memory\r
31 - Correct pointer arithmetic and dereferencing\r
32 - Prevention of buffer overflows and underflows\r
33 - Appropriate use of const and restrict qualifiers\r
34 - Proper handling of null pointers and dangling references\r
35 \r
36 **Common Problems:**\r
37 - Memory leaks from unmatched malloc/free pairs\r
38 - Use after free or double free errors\r
39 - Buffer overruns and array bounds violations\r
40 - Dereferencing null or uninitialized pointers\r
41 - Improper pointer arithmetic leading to undefined behavior\r
42 \r
43 **Evaluation Questions:**\r
44 - Is every malloc() paired with exactly one free()?\r
45 - Are all array accesses within proper bounds?\r
46 - Are pointers checked for NULL before dereferencing?\r
47 - Is pointer arithmetic performed safely and correctly?\r
48 - Are const and restrict qualifiers used appropriately for optimization and safety?\r
49 \r
50 ### 3. Type System and Data Representation\r
51 **What to Look For:**\r
52 - Correct use of fundamental and derived types\r
53 - Proper type conversions and promotions\r
54 - Appropriate use of signed vs unsigned types\r
55 - Correct structure padding and alignment considerations\r
56 - Proper use of union types for type punning\r
57 \r
58 **Common Problems:**\r
59 - Implicit type conversions that change meaning\r
60 - Mixing signed and unsigned arithmetic inappropriately\r
61 - Assumptions about structure layout and padding\r
62 - Incorrect use of unions for type punning\r
63 - Overflow in arithmetic operations\r
64 \r
65 **Evaluation Questions:**\r
66 - Are type conversions explicit and intentional?\r
67 - Is the choice between signed and unsigned types appropriate?\r
68 - Are structure layouts considered for portability?\r
69 - Are union types used correctly for their intended purpose?\r
70 - Do arithmetic operations handle potential overflow correctly?\r
71 \r
72 ### 4. Error Handling and Robustness\r
73 **What to Look For:**\r
74 - Consistent error checking for all fallible operations\r
75 - Proper use of errno for system call error reporting\r
76 - Graceful handling of exceptional conditions\r
77 - Resource cleanup on error paths\r
78 - Clear error propagation strategies\r
79 \r
80 **Common Problems:**\r
81 - Ignoring return values from functions that can fail\r
82 - Inconsistent error handling patterns\r
83 - Resource leaks on error paths\r
84 - Unclear or inconsistent error reporting\r
85 - Failure to check preconditions and postconditions\r
86 \r
87 **Evaluation Questions:**\r
88 - Are all function return values checked when they indicate errors?\r
89 - Is errno used correctly for functions that set it?\r
90 - Are error conditions handled consistently throughout the codebase?\r
91 - Do error paths properly clean up allocated resources?\r
92 - Are error messages clear and actionable?\r
93 \r
94 ### 5. Portability and Implementation Independence\r
95 **What to Look For:**\r
96 - Code that works across different architectures and platforms\r
97 - Proper use of standard types for portability\r
98 - Avoidance of implementation-specific assumptions\r
99 - Correct endianness handling when necessary\r
100 - Use of feature test macros for conditional compilation\r
101 \r
102 **Common Problems:**\r
103 - Assumptions about integer sizes or representation\r
104 - Platform-specific code without proper abstraction\r
105 - Endianness-dependent code without proper handling\r
106 - Use of non-portable language extensions\r
107 - Missing feature detection for optional functionality\r
108 \r
109 **Evaluation Questions:**\r
110 - Does the code make assumptions about integer sizes or alignment?\r
111 - Is platform-specific functionality properly abstracted?\r
112 - Are feature test macros used correctly for conditional compilation?\r
113 - Does the code handle different endianness correctly?\r
114 - Are all dependencies on implementation details documented?\r
115 \r
116 ### 6. Performance and Efficiency\r
117 **What to Look For:**\r
118 - Efficient algorithms and data structures\r
119 - Minimal memory allocation overhead\r
120 - Cache-friendly memory access patterns\r
121 - Proper use of compiler optimization hints\r
122 - Avoidance of unnecessary function call overhead\r
123 \r
124 **Common Problems:**\r
125 - Inefficient algorithms with poor time complexity\r
126 - Excessive dynamic memory allocation\r
127 - Poor cache locality in data access\r
128 - Missing optimization opportunities\r
129 - Premature or inappropriate optimization\r
130 \r
131 **Evaluation Questions:**\r
132 - Are the algorithms chosen appropriate for the problem size?\r
133 - Is memory allocation minimized and efficient?\r
134 - Are data structures laid out for good cache performance?\r
135 - Are optimization hints used appropriately?\r
136 - Is the code optimized at the right level of abstraction?\r
137 \r
138 ## ISO/IEC Standards-Specific Criticism Process\r
139 \r
140 ### Step 1: Standard Conformance Analysis\r
141 1. **Check Language Compliance**: Does code conform to ISO C99/C11/C18 standards?\r
142 2. **Evaluate Library Usage**: Are standard library functions used correctly?\r
143 3. **Assess Undefined Behavior**: Is undefined behavior properly avoided?\r
144 4. **Review Implementation Dependencies**: Are implementation-defined behaviors documented?\r
145 \r
146 ### Step 2: Memory Safety Assessment\r
147 1. **Audit Memory Management**: Are allocations and deallocations properly paired?\r
148 2. **Check Pointer Safety**: Are all pointer operations safe and defined?\r
149 3. **Evaluate Buffer Safety**: Are array bounds respected?\r
150 4. **Assess Resource Management**: Are resources properly acquired and released?\r
151 \r
152 ### Step 3: Type Safety Evaluation\r
153 1. **Review Type Usage**: Are types used appropriately and safely?\r
154 2. **Check Conversions**: Are type conversions explicit and correct?\r
155 3. **Evaluate Arithmetic**: Is arithmetic overflow/underflow handled?\r
156 4. **Assess Structure Layout**: Are structure dependencies documented?\r
157 \r
158 ### Step 4: Error Handling Analysis\r
159 1. **Check Error Propagation**: Are errors detected and reported consistently?\r
160 2. **Evaluate Recovery**: Can the program recover gracefully from errors?\r
161 3. **Assess Resource Cleanup**: Are resources cleaned up on error paths?\r
162 4. **Review Error Documentation**: Are error conditions clearly documented?\r
163 \r
164 ## ISO/IEC Standards-Specific Criticism Guidelines\r
165 \r
166 ### Focus on Specification Compliance\r
167 **Good Criticism:**\r
168 - "This code invokes undefined behavior by dereferencing a null pointer"\r
169 - "The integer overflow here violates the standard's requirements"\r
170 - "This use of restrict qualifier doesn't meet the standard's constraints"\r
171 - "The function signature doesn't match the standard library specification"\r
172 \r
173 **Poor Criticism:**\r
174 - "This doesn't look right"\r
175 - "This seems unsafe"\r
176 - "I don't like this approach"\r
177 \r
178 ### Emphasize Portability and Correctness\r
179 **Good Criticism:**\r
180 - "This assumes int is 32 bits, which violates portability requirements"\r
181 - "The structure padding assumptions here are implementation-dependent"\r
182 - "This endianness-dependent code needs conditional compilation guards"\r
183 - "The alignment requirements here are not guaranteed by the standard"\r
184 \r
185 **Poor Criticism:**\r
186 - "This won't work everywhere"\r
187 - "This is not portable"\r
188 - "This might cause problems"\r
189 \r
190 ### Consider Implementation Quality\r
191 **Good Criticism:**\r
192 - "The error checking here is incomplete - malloc can fail"\r
193 - "This buffer access doesn't validate bounds as required"\r
194 - "The type conversion here loses precision without explicit intent"\r
195 - "The resource cleanup on this error path is missing"\r
196 \r
197 **Poor Criticism:**\r
198 - "This has bugs"\r
199 - "This is unreliable"\r
200 - "This code is bad"\r
201 \r
202 ## ISO/IEC Standards-Specific Problem Categories\r
203 \r
204 ### Standard Compliance Problems\r
205 - **Undefined Behavior**: Code that invokes undefined behavior according to the standard\r
206 - **Implementation Dependencies**: Unwarranted assumptions about implementation details\r
207 - **Non-Standard Extensions**: Use of compiler-specific features without proper guards\r
208 - **Library Misuse**: Incorrect usage of standard library functions\r
209 \r
210 ### Memory Safety Problems\r
211 - **Memory Leaks**: Unmatched allocation and deallocation\r
212 - **Use After Free**: Accessing freed memory\r
213 - **Buffer Overruns**: Writing beyond allocated bounds\r
214 - **Dangling Pointers**: Using pointers to deallocated memory\r
215 \r
216 ### Type Safety Problems\r
217 - **Implicit Conversions**: Unintended type conversions that change semantics\r
218 - **Arithmetic Overflow**: Integer arithmetic that exceeds type limits\r
219 - **Alignment Violations**: Accessing data with incorrect alignment\r
220 - **Union Misuse**: Incorrect use of unions for type punning\r
221 \r
222 ### Error Handling Problems\r
223 - **Unchecked Errors**: Ignoring function return values that indicate errors\r
224 - **Resource Leaks**: Failing to clean up on error paths\r
225 - **Inconsistent Handling**: Different error handling patterns in similar contexts\r
226 - **Poor Error Reporting**: Unclear or missing error information\r
227 \r
228 ### Portability Problems\r
229 - **Size Assumptions**: Assuming specific sizes for fundamental types\r
230 - **Endianness Dependencies**: Code that doesn't handle byte order correctly\r
231 - **Platform-Specific Code**: Unguarded use of platform-specific features\r
232 - **Missing Feature Detection**: No checks for optional standard features\r
233 \r
234 ## ISO/IEC Standards-Specific Criticism Templates\r
235 \r
236 ### For Standard Compliance Issues\r
237 ```\r
238 Standard Compliance Issue: [Specific standard violation]\r
239 Standard Reference: [ISO/IEC 9899 section and paragraph]\r
240 Problem: [How this violates the standard specification]\r
241 Impact: [Undefined behavior, implementation dependency, or non-conformance]\r
242 Evidence: [Specific code examples and standard citations]\r
243 Priority: [Critical/High/Medium/Low]\r
244 ```\r
245 \r
246 ### For Memory Safety Issues\r
247 ```\r
248 Memory Safety Issue: [Specific memory safety problem]\r
249 Problem: [What makes this unsafe or incorrect]\r
250 Impact: [Potential crashes, corruption, or security vulnerabilities]\r
251 Evidence: [Specific code paths and failure scenarios]\r
252 Priority: [Critical/High/Medium/Low]\r
253 ```\r
254 \r
255 ### For Portability Issues\r
256 ```\r
257 Portability Issue: [Specific portability problem]\r
258 Problem: [What assumptions or dependencies limit portability]\r
259 Impact: [Platforms or implementations where this will fail]\r
260 Evidence: [Specific code examples and platform differences]\r
261 Priority: [High/Medium/Low]\r
262 ```\r
263 \r
264 ## ISO/IEC Standards-Specific Criticism Best Practices\r
265 \r
266 ### Do's\r
267 - **Cite Standard References**: Always reference specific sections of ISO/IEC 9899\r
268 - **Focus on Specification**: Evaluate against the formal language specification\r
269 - **Consider All Implementations**: Think about conforming implementations, not just one compiler\r
270 - **Emphasize Correctness**: Prioritize correct behavior over performance or convenience\r
271 - **Document Dependencies**: Clearly identify any implementation-defined behaviors\r
272 \r
273 ### Don'ts\r
274 - **Assume Specific Implementations**: Don't assume particular compiler behaviors\r
275 - **Ignore Standard Library**: Don't overlook proper usage of standard functions\r
276 - **Accept Undefined Behavior**: Don't tolerate code that invokes undefined behavior\r
277 - **Skip Error Checking**: Don't ignore error handling requirements\r
278 - **Overlook Portability**: Don't accept unnecessarily non-portable code\r
279 \r
280 ## ISO/IEC Standards-Specific Criticism Checklist\r
281 \r
282 ### Standard Compliance Assessment\r
283 - [ ] Does the code conform to ISO C without relying on extensions?\r
284 - [ ] Are all uses of the standard library correct per specification?\r
285 - [ ] Is undefined behavior avoided throughout?\r
286 - [ ] Are implementation-defined behaviors documented?\r
287 - [ ] Does the code compile with multiple conforming compilers?\r
288 \r
289 ### Memory Safety Assessment\r
290 - [ ] Are all memory allocations properly paired with deallocations?\r
291 - [ ] Are all pointer dereferences safe and defined?\r
292 - [ ] Are array bounds checked and respected?\r
293 - [ ] Are resources properly managed on all code paths?\r
294 - [ ] Is pointer arithmetic performed safely?\r
295 \r
296 ### Type Safety Assessment\r
297 - [ ] Are type conversions explicit and intentional?\r
298 - [ ] Is arithmetic overflow/underflow handled correctly?\r
299 - [ ] Are signed/unsigned types used appropriately?\r
300 - [ ] Are structure layouts considered for portability?\r
301 - [ ] Are union types used correctly?\r
302 \r
303 ### Error Handling Assessment\r
304 - [ ] Are all error conditions detected and handled?\r
305 - [ ] Are function return values checked when they can indicate errors?\r
306 - [ ] Is errno used correctly for functions that set it?\r
307 - [ ] Are error paths tested and resources cleaned up?\r
308 - [ ] Are error conditions documented clearly?\r
309 \r
310 ### Portability Assessment\r
311 - [ ] Does the code avoid assumptions about type sizes?\r
312 - [ ] Is endianness handled correctly when necessary?\r
313 - [ ] Are feature test macros used for conditional compilation?\r
314 - [ ] Is platform-specific code properly abstracted?\r
315 - [ ] Are all implementation dependencies documented?\r
316 \r
317 ## ISO/IEC Standards-Specific Evaluation Questions\r
318 \r
319 ### For Any C Code\r
320 1. **Does this code conform to the ISO C standard without extensions?**\r
321 2. **Are all potential sources of undefined behavior eliminated?**\r
322 3. **Is memory management correct and complete?**\r
323 4. **Are all error conditions properly handled?**\r
324 5. **Is the code portable across conforming implementations?**\r
325 6. **Are all standard library functions used correctly?**\r
326 7. **Is the type usage safe and appropriate?**\r
327 8. **Are all implementation dependencies documented?**\r
328 9. **Do all code paths handle errors and cleanup resources?**\r
329 10. **Is the code efficient without sacrificing correctness?**\r
330 \r
331 ### For Library Code\r
332 1. **Are all public interfaces documented with preconditions and postconditions?**\r
333 2. **Is thread safety clearly specified and implemented correctly?**\r
334 3. **Are all parameters validated appropriately?**\r
335 4. **Is the API design consistent with standard library conventions?**\r
336 5. **Are all resources properly managed by the library?**\r
337 \r
338 ### For System Code\r
339 1. **Are all system calls checked for errors?**\r
340 2. **Is privilege escalation handled securely?**\r
341 3. **Are buffer sizes validated before use?**\r
342 4. **Is concurrency handled correctly?**\r
343 5. **Are all security implications considered and addressed?**\r
344 \r
345 ## C99 Standard Principles Applied\r
346 \r
347 ### "Provide a Portable Programming Language"\r
348 - Write code that works across different conforming implementations\r
349 - Avoid reliance on implementation-specific behaviors\r
350 - Use standard types and functions for maximum portability\r
351 \r
352 ### "Keep the Language Small and Simple"\r
353 - Use language features appropriately for their intended purpose\r
354 - Avoid overly complex constructs when simpler alternatives exist\r
355 - Prefer clear, readable code over clever implementations\r
356 \r
357 ### "Provide Only One Way to Do an Operation"\r
358 - Use standard idioms and patterns consistently\r
359 - Avoid redundant or alternative approaches to the same problem\r
360 - Follow established conventions for common operations\r
361 \r
362 ### "Make it Fast"\r
363 - Write efficient code that compiles to good machine code\r
364 - Understand the performance implications of language features\r
365 - Optimize appropriately without sacrificing correctness or clarity\r
366 \r
367 ### "Trust the Programmer"\r
368 - Provide tools for experienced programmers to write efficient code\r
369 - Allow low-level control when necessary\r
370 - Don't prevent legitimate but potentially dangerous operations\r
371 \r
372 ### "Don't Prevent the Programmer from Doing What Needs to be Done"\r
373 - Enable system programming and direct hardware access\r
374 - Provide mechanisms for all necessary operations\r
375 - Allow overriding safety checks when explicitly requested\r
376 \r
377 ## C Standard Library Evaluation Criteria\r
378 \r
379 ### Memory Management Functions\r
380 - **malloc/free family**: Proper pairing, error checking, alignment considerations\r
381 - **String functions**: Buffer bounds, null termination, overlap handling\r
382 - **Memory functions**: Overlap restrictions, size calculations, pointer validity\r
383 \r
384 ### Input/Output Functions\r
385 - **File operations**: Error checking, resource cleanup, mode specifications\r
386 - **Formatted I/O**: Format string validation, buffer sizes, return value checking\r
387 - **Character I/O**: EOF handling, error conditions, buffering implications\r
388 \r
389 ### String and Character Functions\r
390 - **String manipulation**: Buffer sizes, null termination, locale considerations\r
391 - **Character classification**: Locale dependencies, proper argument ranges\r
392 - **String conversion**: Error detection, overflow handling, locale awareness\r
393 \r
394 ### Mathematical Functions\r
395 - **Floating point**: Error handling, special values, precision considerations\r
396 - **Integer arithmetic**: Overflow detection, signed/unsigned conversions\r
397 - **Random numbers**: Seeding, distribution, thread safety\r
398 \r
399 ### Time and Date Functions\r
400 - **Time representation**: Overflow handling, timezone considerations, Y2038 issues\r
401 - **Formatting**: Locale dependencies, buffer sizes, error conditions\r
402 - **Conversion**: Precision loss, range validation, platform differences