...
Depending on the fonts used, certain characters appear visually similar or even identical:
Character | Similar |
|---|
Characters | |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
m (lowercase M)
Do not define multiple identifiers that vary only with respect to one or more visually similar characters.
Make the initial portions of long identifiers unique for easier recognition . This also helps and to help prevent errors resulting from non-unique nonunique identifiers. (See DCL32 DCL23-C. Guarantee that mutually visible identifiers are unique.)
In addition, the larger the scope of an identifier, the more descriptive its name should be. It may be perfectly appropriate to name a loop control variable i, but the same name would likely be confusing if it named a file scope object or a variable local to a function more than a few lines long. See also DCL01-C. Do not reuse variable names in subscopes and DCL19-C. Use as minimal a scope as possible for all variables and functions.
Noncompliant Code Example (Source Character Set)
DCL02-C implicitly assumes global scope, which can be confused with scope within the same file. Although it may not generate any errors, a possible violation of the rule may occur, as in the following example. Note this example does not violate DCL32 DCL23-C. Guarantee that mutually visible identifiers are unique.
In file foo.h:
| Code Block | ||||
|---|---|---|---|---|
| ||||
int id_O; //* (captialCapital letter O) */ |
In file bar.h:
| Code Block | ||||
|---|---|---|---|---|
| ||||
int id_0; //* (numericNumeric letterdigit zero) */ |
If a file foobar.c includes both foo.h and bar.h, then both id_0 and id_0 come in the same scope, violating this rule.
...
Failing to use visually distinct identifiers can result in referencing the wrong object or function, causing unintended program behavior.
Recommendation | Severity | Likelihood |
|---|
Detectable | Repairable | Priority | Level |
|---|---|---|---|
DCL02-C | Low |
Unlikely |
Yes |
Yes |
P3 | L3 |
Automated Detection
Tool | Version | Checker | Description | ||||||
|---|---|---|---|---|---|---|---|---|---|
| Axivion Bauhaus Suite |
| CertC-DCL02 | |||||||
| CodeSonar |
| LANG.ID.AMBIG | Typographically ambiguous identifiers | ||||||
| Compass/ROSE | |||||||||
| CC2.DCL02 | Fully implemented | |||||||
| LDRA tool suite |
| 67 X | Fully implemented |
Compass/ROSE
idntsiml
Fully implemented
| Parasoft C/C++test |
| CERT_C-DCL02-a | Use visually distinct identifiers | ||||||
| PC-lint Plus |
| 9046 | Partially supported: does not report ‘Q’ or ‘D’ vs ‘0’ or ‘O’ | ||||||
| Polyspace Bug Finder |
| CERT C: Rec. DCL02-C | Checks for use of typographically ambiguous identifiers (rec. fully covered) |
Related Vulnerabilities
Search for vulnerabilities resulting from the violation of this rule on the CERT website.
Related Guidelines
...
...
...
| TR 24772:2013 | Choice of Clear Names [NAI] |
| MISRA C:2012 | Directive 4.5 (advisory) |
ISO/IEC TR 24772 "AJN Choice of filenames and other external identifiers," "BRS Leveraging human experience," and "NAI Choice of clear names"
MISRA Rule 5.6
...
...