DATASHEET
CERT C Recommendations Enforcement
(Website 7 December 2023)
POSIX Recommendations are listed separately and not included in total
(Some Recommendations may not be statically enforceable)
ENFORCEMENT HELIX QAC 2024.2
|
| Total |
---|---|---|
a | Total Number of Recommendations (not including POSIX and WIN) | 177 |
b | Total Number of Enforced Recommendations | 85 |
c | Total Number of Unenforced Recommendations | 92 |
d | Enforce Recommendations Percentage (b/a) | 48% |
e | Unenforced Recommendations Percentage (c/a) | 52% |
Rec ID | Description | Level | Enforced |
---|---|---|---|
Rec 01. Preprocessors (PRE) | |||
PRE00-C | Prefer inline or static functions to function-like macros | L3 | Yes |
PRE01-C | Use parentheses within macros around parameter names | L1 | Yes |
PRE02-C | Macro replacement lists should be parenthesized | L1 | Yes |
PRE03-C | Prefer typedefs to defines for encoding non-pointer types | L3 | Yes |
PRE04-C | Do not reuse a standard header file name | L3 | Yes |
PRE05-C | Understand macro replacement when concatenating tokens or performing stringification | L3 | Yes |
PRE06-C | Enclose header files in an inclusion guard | L3 | Yes |
PRE07-C | Avoid using repeated question marks | L3 | Yes |
PRE08-C | Guarantee that header file names are unique | L3 | Yes |
PRE09-C | Do not replace secure functions with deprecated or obsolescent functions | L1 | Yes |
PRE10-C | Wrap multi-statement macros in a do-while loop | L1 | Yes |
PRE11-C | Do not conclude macro definitions with a semicolon | L1 | Yes |
PRE12-C | Do not define unsafe macros | L2 | Yes |
PRE13-C | Use the Standard predefined macros to test for versions and features. | L2 | No |
Rec 02. Declarations and Initialization(DCL) | |||
DCL00-C | Const-qualify immutable objects | L3 | Yes |
DCL01-C | Do not reuse variable names in subscopes | L3 | Yes |
DCL02-C | Use visually distinct identifiers | L3 | No |
DCL03-C | Use a static assertion to test the value of a constant expression | L3 | No |
DCL04-C | Do not declare more than one variable per declaration | L3 | No |
DCL05-C | Use typedefs of non-pointer types only | L3 | Yes |
DCL06-C | Use meaningful symbolic constants to represent literal values | L3 | Yes |
DCL07-C | Include the appropriate type information in function declarators | L3 | Yes |
DCL08-C | Properly encode relationships in constant definitions | L3 | No |
DCL09-C | Declare functions that return errno with a return type of errno_t | L3 | No |
DCL10-C | Maintain the contract between the writer and caller of variadic functions | L2 | Yes |
DCL11-C | Understand the type issues associated with variadic functions | L2 | Yes |
DCL12-C | Implement abstract data types using opaque types | L3 | No |
DCL13-C | Declare function parameters that are pointers to values not changed by the function as const | L3 | Yes |
DCL15-C | Declare file-scope objects or functions that do not need external linkage as static | L3 | Yes |
DCL16-C | Use 'L', not 'l', to indicate a long value | L3 | Yes |
DCL17-C | Beware of miscompiled volatile-qualified variables | L3 | No |
DCL18-C | Do not begin integer constants with 0 when specifying a decimal value | L3 | Yes |
DCL19-C | Minimize the scope of variables and functions | L3 | Yes |
DCL20-C | Explicitly specify void when a function accepts no arguments | L1 | Yes |
DCL21-C | Understand the storage of compound literals | L3 | Yes |
DCL22-C | Use volatile for data that cannot be cached | L3 | No |
DCL23-C | Guarantee that mutually visible identifiers are unique | L2 | Yes |
Rec 03. Expressions (EXP) | |||
EXP00-C | Use parentheses for precedence of operation | L3 | Yes |
EXP02-C | Be aware of the short-circuit behavior of the logical AND and OR operators | L3 | Yes |
EXP03-C | Do not assume the size of a structure is the sum of the sizes of its members | L3 | Yes |
EXP05-C | Do not cast away a const qualification | L2 | Yes |
EXP07-C | Do not diminish the benefits of constants by assuming their values in expressions | L3 | Yes |
EXP08-C | Ensure pointer arithmetic is used correctly | L2 | Yes |
EXP09-C | Use sizeof to determine the size of a type or variable | L2 | No |
EXP10-C | Do not depend on the order of evaluation of subexpressions or the order in which side effects take place | L2 | Yes |
EXP11-C | Do not make assumptions regarding the layout of structures with bit-fields | L2 | Yes |
EXP12-C | Do not ignore values returned by functions | L3 | Yes |
EXP13-C | Treat relational and equality operators as if they were nonassociative | L3 | Yes |
EXP14-C | Beware of integer promotion when performing bitwise operations on integer types smaller than int | L3 | No |
EXP15-C | Do not place a semicolon on the same line as an if, for, or while statement | L1 | Yes |
EXP16-C | Do not compare function pointers to constant values | L2 | Yes |
EXP19-C | Use braces for the body of an if, for, or while statement | L2 | Yes |
EXP20-C | Perform explicit tests to determine success, true and false, and equality | L1 | Yes |
Rec 04. Integers (INT) | |||
INT00-C | Understand the data model used by your implementation(s) | L3 | No |
INT01-C | Use rsize_t or size_t for all integer values representing the size of an object | L2 | No |
INT02-C | Understand integer conversion rules | L2 | Yes |
INT04-C | Enforce limits on integer values originating from tainted sources | L2 | Yes |
INT05-C | Do not use input functions to convert character data if they cannot handle all possible inputs | L3 | Yes |
INT07-C | Use only explicitly signed or unsigned char type for numeric values | L2 | Yes |
INT08-C | Verify that all integer values are in range | L3 | Yes |
INT09-C | Ensure enumeration constants map to unique values | L3 | Yes |
INT10-C | Do not assume a positive remainder when using the % operator | L3 | Yes |
INT12-C | Do not make assumptions about the type of a plain int bit-field when used in an expression | L3 | Yes |
INT13-C | Use bitwise operators only on unsigned operands | L2 | Yes |
INT14-C | Avoid performing bitwise and arithmetic operations on the same data | L3 | No |
INT15-C | Use intmax_t or uintmax_t for formatted IO on programmer-defined integer types | L2 | No |
INT16-C | Do not make assumptions about representation of signed integers | L3 | Yes |
INT17-C | Define integer constants in an implementation-independent manner | L1 | No |
INT18-C | Evaluate integer expressions in a larger size before comparing or assigning to that size | L1 | Yes |
Rec 05. Floating Point (FLP) | |||
FLP00-C | Understand the limitations of floating-point numbers | L3 | Yes |
FLP01-C | Take care in rearranging floating-point expressions | L3 | No |
FLP02-C | Avoid using floating-point numbers when precise computation is needed | L3 | Yes |
FLP03-C | Detect and handle floating-point errors | L3 | No |
FLP04-C | Check floating-point inputs for exceptional values | L3 | No |
FLP05-C | Do not use denormalized numbers | L3 | No |
FLP06-C | Convert integers to floating point for floating point operations | L2 | Yes |
FLP07-C | Cast the return value of a function that returns a floating-point type | L3 | No |
Rec 06. Arrays(ARR) | |||
ARR00-C | Understand how arrays work | L2 | No |
ARR01-C | Do not apply the sizeof operator to a pointer when taking the size of an array | L1 | No |
ARR02-C | Explicitly specify array bounds, even if implicitly defined by an initializer | L2 | Yes |
Rec 07. Characters and String (STR) | |||
STR00-C | Represent characters using an appropriate type | L1 | No |
STR01-C | Adopt and implement a consistent plan for managing strings | L3 | No |
STR02-C | Sanitize data passed to complex subsystems | L1 | No |
STR03-C | Do not inadvertently truncate a string | L2 | No |
STR04-C | Use plain char for characters in the basic character set | L3 | Yes |
STR05-C | Use pointers to const when referring to string literals | L3 | Yes |
STR06-C | Do not assume that strtok() leaves the parse string unchanged | L1 | Yes |
STR07-C | Use the bounds-checking interfaces for string manipulation | L1 | Yes |
STR08-C | Use managed strings for development of new string manipulation code | L2 | No |
STR09-C | Don't assume numeric values for expressions with type plain character | L3 | Yes |
STR10-C | Do not concatenate different type of string literals | L3 | Yes |
STR11-C | Do not specify the bound of a character array initialized with a string literal | L2 | Yes |
Rec 08. Memory management (MEM) | |||
MEM00-C | Allocate and free memory in the same module, at the same level of abstraction | L1 | No |
MEM01-C | Store a new value in pointers immediately after free() | L2 | No |
MEM02-C | Immediately cast the result of a memory allocation function call into a pointer to the allocated type | L3 | Yes |
MEM03-C | Clear sensitive information stored in reusable resources | L3 | Yes |
MEM04-C | Beware of zero-length allocations | L2 | No |
MEM05-C | Avoid large stack allocations | L2 | Yes |
MEM06-C | Ensure that sensitive data is not written out to disk | L3 | No |
MEM07-C | Ensure that the arguments to calloc(), when multiplied, do not wrap | L2 | No |
MEM10-C | Define and use a pointer validation function | L3 | No |
MEM11-C | Do not assume infinite heap space | L3 | No |
MEM12-C | Consider using a goto chain when leaving a function on error when using and releasing resources | L3 | No |
Rec 09. Input Output (FIO) | |||
FIO01-C | Be careful using functions that use file names for identification | L1 | Yes |
FIO02-C | Consider using a goto chain when leaving a function on error when using and releasing resources | L2 | No |
FIO03-C | Do not make assumptions about fopen() and file creation | L3 | Yes |
FIO05-C | Identify files using multiple file attributes | L2 | No |
FIO06-C | Create files with appropriate access permissions | L3 | Yes |
FIO08-C | Take care when calling remove() on an open file | L3 | Yes |
FIO09-C | Be careful with binary data when transferring data across systems | L3 | No |
FIO10-C | Take care when using the rename() function | L2 | Yes |
FIO11-C | Take care when specifying the mode parameter of fopen() | L2 | No |
FIO13-C | Never push back anything other than one read character | L3 | No |
FIO14-C | Understand the difference between text mode and binary mode with file streams | L3 | No |
FIO15-C | Ensure that file operations are performed in a secure directory | L3 | No |
FIO17-C | Do not rely on an ending null character when using fread() | L2 | No |
FIO18-C | Never expect fwrite() to terminate the writing process at a null character | L2 | No |
FIO19-C | Do not use fseek() and ftell() to compute the size of a regular file | L3 | No |
FIO20-C | Avoid unintentional truncation when using fgets() or fgetws() | L1 | No |
FIO21-C | Do not create temporary files in shared directories | L2 | Yes |
FIO22-C | Close files before spawning processes | L3 | No |
FIO23-C | Do not exit with unflushed data in stdout or stderr | L3 | No |
FIO24-C | Do not open a file that is already open | L3 | No |
Rec 10. Environment (ENV) | |||
ENV01-C | Do not make assumptions about the size of an environment variable | L1 | No |
ENV02-C | Beware of multiple environment variables with the same effective name | L3 | No |
ENV03-C | Sanitize the environment when invoking external programs | L2 | Yes |
Rec 11. Signals (SIG) | |||
SIG00-C | Mask signals handled by noninterruptible signal handlers | L2 | Yes |
SIG01-C | Understand implementation-specific details regarding signal handler persistence | L3 | Yes |
SIG02-C | Avoid using signals to implement normal functionality | L1 | No |
Rec 12. Error Handling (ERR) | |||
ERR00-C | Adopt and implement a consistent and comprehensive error-handling policy | L3 | No |
ERR01-C | Use ferror() rather than errno to check for FILE stream errors | L2 | No |
ERR02-C | Avoid in-band error indicators | L3 | No |
ERR03-C | Use runtime-constraint handlers when calling the bounds-checking interfaces | L3 | No |
ERR04-C | Choose an appropriate termination strategy | L3 | No |
ERR05-C | Application-independent code should provide error detection without dictating error handling | L3 | No |
ERR06-C | Understand the termination behavior of assert() and abort() | L3 | No |
ERR07-C | Prefer functions that support error checking over equivalent functions that don't | L2 | No |
Rec 13. Application Programming Interfaces (API) | |||
API00-C | Functions should validate their parameters | L3 | No |
API01-C | Avoid laying out strings in memory directly before sensitive data | L2 | No |
API02-C | Functions that read or write to or from an array should take an argument to specify the source or target size | L2 | No |
API03-C | Create consistent interfaces and capabilities across related functions | L3 | No |
API04-C | Provide a consistent and usable error-checking mechanism | L3 | No |
API05-C | Use conformant array parameters | L1 | No |
API07-C | Enforce type safety | L3 | No |
API09-C | Compatible values should have the same type | L3 | No |
API10-C | APIs should have security options enabled by default | L1 | No |
Rec 14. Concurrency (CON) | |||
CON01-C | Acquire and release synchronization primitives in the same module, at the same level of abstraction | L3 | No |
CON02-C | Do not use volatile as a synchronization primitive | L2 | No |
CON03-C | Ensure visibility when accessing shared variables | L2 | No |
CON04-C | Join or detach threads even if their exit status is unimportant | L3 | No |
CON05-C | Do not perform operations that can block while holding a lock | L3 | No |
CON06-C | Ensure that every mutex outlives the data it protects | L2 | No |
CON07-C | Ensure that compound operations on shared variables are atomic | L2 | No |
CON08-C | Do not assume that a group of calls to independently atomic methods is atomic | L3 | No |
CON09-C | Avoid the ABA problem when using lock-free algorithms | L3 | No |
Rec 48. Miscellaneous (MISC) | |||
MSC00-C | Compile cleanly at high warning levels | L2 | No |
MSC01-C | Strive for logical completeness | L2 | Yes |
MSC04-C | Use comments consistently and in a readable fashion | L3 | Yes |
MSC05-C | Do not manipulate time_t typed values directly | L3 | No |
MSC06-C | Beware of compiler optimizations | L2 | No |
MSC07-C | Detect and remove dead code | L3 | No |
MSC09-C | Character encoding: Use subset of ASCII for safety | L3 | Yes |
MSC10-C | Character encoding: UTF8-related issues | L3 | No |
MSC11-C | Incorporate diagnostic tests using assertions | L3 | No |
MSC12-C | Detect and remove code that has no effect or is never executed | L3 | Yes |
MSC13-C | Detect and remove unused values | L3 | Yes |
MSC14-C | Do not introduce unnecessary platform dependencies | L3 | Yes |
MSC15-C | Do not depend on undefined behavior | L1 | Yes |
MSC17-C | Finish every set of statements associated with a case label with a break statement | L1 | Yes |
MSC18-C | Be careful while handling sensitive data, such as passwords, in program code | L2 | No |
MSC19-C | For functions that return an array, prefer returning an empty array over a null value | L3 | No |
MSC20-C | Do not use a switch statement to transfer control into a complex block | L2 | Yes |
MSC21-C | Use robust loop termination conditions | L3 | No |
MSC22-C | Use the setjmp(), longjmp() facility securely | L3 | No |
MSC23-C | Beware of vendor-specific library and language differences | L1 | No |
MSC24-C | Do not use deprecated or obsolescent functions | L1 | No |
MSC25-C | Do not use insecure or weak cryptographic algorithms | L3 | No |
POSIX
Rule ID | Description | Level | Enforced |
---|---|---|---|
Rec 50. POSIX (POS) | |||
POS01-C | Check for the existence of links when dealing with files | L2 | No |
POS02-C | Follow the principle of least privilege | L2 | No |
POS04-C | Avoid using PTHREAD_MUTEX_NORMAL type mutex locks | L3 | No |
POS05-C | Limit access to files by creating a jail | L3 | No |
Microsoft Windows
Rule ID | Description | Level | Enforced |
---|---|---|---|
Rec 51. Microsoft Windows (WIN) | |||
WIN00-C | Be specific when dynamically loading libraries | L2 | No |
WIN01-C | Do not forcibly terminate execution | L2 | No |
WIN02-C | Restrict privileges when spawning child processes | L2 | No |
WIN03-C | Understand HANDLE inheritance | L2 | No |
WIN04-C | Consider encrypting function pointers | L2 | No |