Naming
Be descriptive (descriptive-names)
Choose names that convey meaning at the point of use. Avoid single-letter names and ambiguous abbreviations. Prefer full words over cryptic shorthand so that readers do not need surrounding context to understand a variable’s purpose. Prefer names that are as short as possible while still being unambiguous at the point of use.
Be accurate (accurate-names)
Avoid confusing names. If a name can be misread to imply the wrong meaning, behavior, or side effects, it must be corrected immediately.
// Good — clearly a count
nr_deleted_watches: usize,
// Bad — looks like a collection
// rather than a numeric counter
deleted_watches: usize
Choose verbs that reflect the actual work being done.
impl PciCommonDevice {
// Good — implies an MMIO read is involved
pub fn read_command(&self) -> Command { /* .. */ }
// Bad — looks like a plain field access
pub fn command(&self) -> Command { /* .. */ }
}
mod char_device {
// Good — implies an O(n) collection pass
pub fn collect_all() -> Vec<Arc<dyn Device>> { /* .. */ }
// Bad — sounds like an accessor returning a reference
pub fn get_all() -> Vec<Arc<dyn Device>> { /* .. */ }
}
Encode units and important attributes in names (encode-units)
When the type does not encode the unit, the name must. Kernel code deals with bytes, pages, frames, nanoseconds, ticks, and sectors — ambiguous units are a source of real bugs.
// Good — unit is unambiguous
timeout_ns
offset_bytes
size_pages
delay_ms
// Bad — unit is ambiguous
timeout
offset
size
delay
Where the language’s type system can enforce units (e.g., newtypes), prefer that. Where it cannot, the name must carry the information.
See also: PR #2796.
Use assertion-style boolean names (bool-names)
Boolean variables and functions
should read as assertions of fact.
Use is_, has_, can_, should_, was_,
or needs_ prefixes.
Never use negated names
(is_not_empty, no_error);
prefer the positive form
(is_empty, ok or succeeded).
A bare name like found, done, or ready
is acceptable when the context is unambiguous.
// Good — reads as an assertion
fn is_page_aligned(&self) -> bool { ... }
fn has_permission(&self, perm: Permission) -> bool { ... }
let can_read = mode.is_readable();
// Bad — verb suggests an action, not a query
fn check_permission(&self, perm: Permission) -> bool { ... }
// Bad — negated name
let is_not_empty = !buf.is_empty();
See also: PR #1488.
Format error messages consistently (error-message-format)
Start with a lowercase letter
(unless the first word is a proper noun or identifier).
Be specific:
prefer “len is too large” over “the argument is invalid”.
For system call errors, follow the style and descriptions in Linux man pages.