blob: 05bbb8564c96a76421a7f3fb82a6b3e2e07512dd [file] [view] [edit]
OpenSSL Documentation Policy
============================
This document describes the code documentation and commenting requirements
for the OpenSSL project.
The project's documentation is about making the libraries and tools more
accessible to our users and making the code more maintainable. This policy
applies to new submissions; existing code does not uniformly conform to it
and will be brought up to standard gradually.
Any non-trivial change to existing code must bring the affected code into
conformance with this policy as part of the same change. In particular,
renaming or relocating functions, changes to public APIs, and any change
that would render an existing POD page or in-source comment inaccurate
require the corresponding documentation to be updated. This includes
adding documentation that was previously absent where the change brings
the affected code within the scope of this policy.
The form and style of code comments themselves -- comment markers, layout,
the use of `/**` and `/*-` blocks, doxygen markup, the structure of the
sample multi-line comment, and similar -- are described in
[STYLE.md](STYLE.md). This file describes what *must* be documented and
where; [STYLE.md](STYLE.md) describes how code comments look.
Command line commands and arguments
-----------------------------------
All new commands, as well as new or modified arguments to existing
commands, must be documented in the `doc/man1` directory. This
documentation is in POD format.
Public symbols in the libraries
-------------------------------
All new public symbols must be documented in a POD manual page in the
`doc/man3` directory. This includes types, macros, and functions.
The allowed exceptions are:
- guard macros preventing a header file being included twice
- new symbols generated automatically via `make update` (errors, objects, etc.)
Each public function's declaration in its public header must carry a
doxygen comment block. The block's `@see` must include the function's
own manual page (`name(3)`) and may include additional manual pages
that a caller needs to use the function correctly. The doxygen block
is a navigation aid pointing to the canonical reference documentation
in the corresponding POD file; see [STYLE.md](STYLE.md) for the
doxygen form.
Overviews, conventions, et al
-----------------------------
Where additional user-facing information is required, it should be
included in the `doc/man7` section. This includes, but is not limited to:
- algorithm descriptions and parameters
- architectural and subsystem overviews
- user guides and tutorials
- conventions and reference material (environment variables, glossary,
threading rules, file format conventions)
Internal functions, structures, globals and macros
--------------------------------------------------
Internal functions, structures, globals and macros are non-public
items declared in any header that is not part of the public API.
These include items declared in:
- `include/internal/` (shared across subsystems);
- `include/crypto/` (cryptographic internals);
- per-directory local headers (for example, `crypto/asn1/asn1_local.h`)
shared between source files in a single subdirectory.
These should all be documented at the declaration site -- that is,
in the header that declares them -- using a doxygen-style comment
block. For functions, this places the comment at the prototype,
where editor tooling (clangd and similar) can surface it to readers
at every call site. The comment should describe the purpose and,
for functions, the input and output arguments and the return value.
See [STYLE.md](STYLE.md) for the doxygen conventions used by OpenSSL.
For *trivial* items, where their operation is obvious from their
implementation, the documentation requirement is not mandated. The
following are generally representative of trivial items, however it is
quite possible for any of these to be non-trivial in specific instances
and therefore require documentation:
- `OSSL_DISPATCH` tables
- upref functions
- free functions
- simple getter/setter functions
- wrappers for other functions (a function that calls a more recent
`_ex` variant or a group of functions that call a common internal
routine)
For structures, each of the fields should be commented stating its
purpose. Again, a *trivial* exception applies where the purpose is
obvious. Some representative examples:
- `OSSL_LIB_CTX *ctx;` where there is only one library context referenced
in the structure.
- `struct *next;` in a linked list implementation.
- `CRYPTO_REF_COUNT refcnt;`
File-local items
----------------
These are functions, structures, globals, and macros that are local
to a single C file: `static` functions, file-scope variables,
structures, and macros defined inside a `.c` file with no declaration
in any header.
These should all be documented at the point of definition. Follow the
same rules and exceptions as for internal items above. In some cases
slightly more leniency with respect to *trivial* can be tolerated.
Code comments
-------------
The form, style, and content guidance for code comments are described in
[STYLE.md](STYLE.md). Comments are required at the points described in
the internal and static sections above, subject to the *trivial*
exception, and at the additional points described in
[STYLE.md](STYLE.md).
Assembly code
-------------
Assembly code should include a good description of the algorithm and
approach being used. This should be followed by a performance comparison
and then the assembly code itself. The assembly code should be well
commented, but it is not necessary to comment every line. A comment
describing each block of code suffices.
For pure-assembly modules (`.s` files and the perlasm scripts that
generate them), comments use the native syntax of the assembler or
generator (typically `#`). Doxygen-style markup does not apply here;
the algorithm description, performance comparison, and per-block
comments described above are still required.
For assembly that appears inline inside a C file (within an `asm()`
statement, for example), the surrounding C function is documented
with doxygen-style C comments as for any other C code; see
[STYLE.md](STYLE.md). Comments inside the `asm()` body itself use
plain C `/* */` comments.
There are no *trivial* exceptions for assembly code.
Configure options
-----------------
New options added to the configuration scripts must be documented in the
[INSTALL.md](INSTALL.md) file.
Changes and news
----------------
Significant modifications should be documented in the
[CHANGES.md](CHANGES.md) file.
Very significant features and changes should be documented in the
[NEWS.md](NEWS.md) file.
In both cases, the added note should be short and to the point, and
should be written for users of the library, focusing on impact rather
than implementation details.
Automated sanity checking
-------------------------
The `make doc-nits` command should be run before submitting a pull
request and any problems it locates must be addressed.
Language
--------
The language used for documentation shall be *British English*.
In general the language, abbreviations, layout and formatting should also
correspond to the
[LDP](https://openssl-library.org/policies/general/glossary/#ldp)
guidelines.
Common sense
------------
Comments and documentation are to improve readability and comprehension.
Where the code is obvious, there is no need to include a comment.
However, common sense applies: always err in favour of including more
comments than less or none. Code that you have just written that is
*obvious* will not necessarily be to someone else two years later. See
[STYLE.md](STYLE.md) for the form and content of code comments.