1Coding Style 2============ 3 4The following sections outline the |TF-A| coding style for *C* code. The style 5is based on the `Linux kernel coding style`_, with a few modifications. 6 7The style should not be considered *set in stone*. Feel free to provide feedback 8and suggestions. 9 10.. note:: 11 You will almost certainly find code in the |TF-A| repository that does not 12 follow the style. The intent is for all code to do so eventually. 13 14File Encoding 15------------- 16 17The source code must use the **UTF-8** character encoding. Comments and 18documentation may use non-ASCII characters when required (e.g. Greek letters 19used for units) but code itself is still limited to ASCII characters. 20 21Newlines must be in **Unix** style, which means that only the Line Feed (``LF``) 22character is used to break a line and reset to the first column. 23 24Language 25-------- 26 27The primary language for comments and naming must be International English. In 28cases where there is a conflict between the American English and British English 29spellings of a word, the American English spelling is used. 30 31Exceptions are made when referring directly to something that does not use 32international style, such as the name of a company. In these cases the existing 33name should be used as-is. 34 35C Language Standard 36------------------- 37 38The C language mode used for TF-A is *GNU99*. This is the "GNU dialect of ISO 39C99", which implies the *ISO C99* standard with GNU extensions. 40 41Both GCC and Clang compiler toolchains have support for *GNU99* mode, though 42Clang does lack support for a small number of GNU extensions. These 43missing extensions are rarely used, however, and should not pose a problem. 44 45.. _misra-compliance: 46 47MISRA Compliance 48---------------- 49 50TF-A attempts to comply with the `MISRA C:2012 Guidelines`_. `ECLAIR` static 51analysis is used to regularly generate a report of current MISRA defects and to 52prevent the addition of new ones. 53 54It is not possible for the project to follow all MISRA guidelines. Table 1 55below lists all rules and directives and whether we aim to comply with them or 56not. A rationale is given for each deviation. 57 58.. note:: 59 Enforcing a rule does not mean that the codebase is free of defects 60 of that rule, only that they would ideally be removed. 61 62.. note:: 63 Third-party libraries are not considered in our MISRA analysis and we do not 64 intend to modify them to make them MISRA compliant. 65 66.. csv-table:: Table 1: MISRA compliance in TF-A code base 67 :file: misra-compliance.csv 68 69Indentation 70----------- 71 72Use **tabs** for indentation. The use of spaces for indentation is forbidden 73except in the case where a term is being indented to a boundary that cannot be 74achieved using tabs alone. 75 76Tab spacing should be set to **8 characters**. 77 78Trailing whitespace is not allowed and must be trimmed. 79 80Spacing 81------- 82 83Single spacing should be used around most operators, including: 84 85- Arithmetic operators (``+``, ``-``, ``/``, ``*``) 86- Assignment operators (``=``, ``+=``, etc) 87- Boolean operators (``&&``, ``||``) 88- Comparison operators (``<``, ``>``, ``==``, etc) 89 90A space should also be used to separate parentheses and braces when they are not 91already separated by a newline, such as for the ``if`` statement in the 92following example: 93 94.. code:: c 95 96 int function_foo(bool bar) 97 { 98 if (bar) { 99 function_baz(); 100 } 101 } 102 103Note that there is no space between the name of a function and the following 104parentheses. 105 106Control statements (``if``, ``for``, ``switch``, ``while``, etc) must be 107separated from the following open parenthesis by a single space. The previous 108example illustrates this for an ``if`` statement. 109 110Line Length 111----------- 112 113Line length *should* be at most **80 characters**. This limit does not include 114non-printing characters such as the line feed. 115 116This rule is a *should*, not a must, and it is acceptable to exceed the limit 117**slightly** where the readability of the code would otherwise be significantly 118reduced. Use your judgement in these cases. 119 120Blank Lines 121----------- 122 123Functions are usually separated by a single blank line. In certain cases it is 124acceptable to use additional blank lines for clarity, if required. 125 126The file must end with a single newline character. Many editors have the option 127to insert this automatically and to trim multiple blank lines at the end of the 128file. 129 130Braces 131------ 132 133Opening Brace Placement 134^^^^^^^^^^^^^^^^^^^^^^^ 135 136Braces follow the **Kernighan and Ritchie (K&R)** style, where the opening brace 137is **not** placed on a new line. 138 139Example for a ``while`` loop: 140 141.. code:: c 142 143 while (condition) { 144 foo(); 145 bar(); 146 } 147 148This style applies to all blocks except for functions which, following the Linux 149style, **do** place the opening brace on a new line. 150 151Example for a function: 152 153.. code:: c 154 155 int my_function(void) 156 { 157 int a; 158 159 a = 1; 160 return a; 161 } 162 163Conditional Statement Bodies 164^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 165 166Where conditional statements (such as ``if``, ``for``, ``while`` and ``do``) are 167used, braces must be placed around the statements that form the body of the 168conditional. This is the case regardless of the number of statements in the 169body. 170 171.. note:: 172 This is a notable departure from the Linux coding style that has been 173 adopted to follow MISRA guidelines more closely and to help prevent errors. 174 175For example, use the following style: 176 177.. code:: c 178 179 if (condition) { 180 foo++; 181 } 182 183instead of omitting the optional braces around a single statement: 184 185.. code:: c 186 187 /* This is violating MISRA C 2012: Rule 15.6 */ 188 if (condition) 189 foo++; 190 191The reason for this is to prevent accidental changes to control flow when 192modifying the body of the conditional. For example, at a quick glance it is easy 193to think that the value of ``bar`` is only incremented if ``condition`` 194evaluates to ``true`` but this is not the case - ``bar`` will always be 195incremented regardless of the condition evaluation. If the developer forgets to 196add braces around the conditional body when adding the ``bar++;`` statement then 197the program execution will not proceed as intended. 198 199.. code:: c 200 201 /* This is violating MISRA C 2012: Rule 15.6 */ 202 if (condition) 203 foo++; 204 bar++; 205 206Naming 207------ 208 209Functions 210^^^^^^^^^ 211 212Use lowercase for function names, separating multiple words with an underscore 213character (``_``). This is sometimes referred to as *Snake Case*. An example is 214given below: 215 216.. code:: c 217 218 void bl2_arch_setup(void) 219 { 220 ... 221 } 222 223Local Variables and Parameters 224^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 225 226Local variables and function parameters use the same format as function names: 227lowercase with underscore separation between multiple words. An example is 228given below: 229 230.. code:: c 231 232 static void set_scr_el3_from_rm(uint32_t type, 233 uint32_t interrupt_type_flags, 234 uint32_t security_state) 235 { 236 uint32_t flag, bit_pos; 237 238 ... 239 240 } 241 242Preprocessor Macros 243^^^^^^^^^^^^^^^^^^^ 244 245Identifiers that are defined using preprocessor macros are written in all 246uppercase text. 247 248.. code:: c 249 250 #define BUFFER_SIZE_BYTES 64 251 252Function Attributes 253------------------- 254 255Place any function attributes after the function type and before the function 256name. 257 258.. code:: c 259 260 void __init plat_arm_interconnect_init(void); 261 262Alignment 263--------- 264 265Alignment should be performed primarily with tabs, adding spaces if required to 266achieve a granularity that is smaller than the tab size. For example, with a tab 267size of eight columns it would be necessary to use one tab character and two 268spaces to indent text by ten columns. 269 270Switch Statement Alignment 271^^^^^^^^^^^^^^^^^^^^^^^^^^ 272 273When using ``switch`` statements, align each ``case`` statement with the 274``switch`` so that they are in the same column. 275 276.. code:: c 277 278 switch (condition) { 279 case A: 280 foo(); 281 case B: 282 bar(); 283 default: 284 baz(); 285 } 286 287Pointer Alignment 288^^^^^^^^^^^^^^^^^ 289 290The reference and dereference operators (ampersand and *pointer star*) must be 291aligned with the name of the object on which they are operating, as opposed to 292the type of the object. 293 294.. code:: c 295 296 uint8_t *foo; 297 298 foo = &bar; 299 300 301Comments 302-------- 303 304The general rule for comments is that the double-slash style of comment (``//``) 305is not allowed. Examples of the allowed comment formats are shown below: 306 307.. code:: c 308 309 /* 310 * This example illustrates the first allowed style for multi-line comments. 311 * 312 * Blank lines within multi-lines are allowed when they add clarity or when 313 * they separate multiple contexts. 314 * 315 */ 316 317.. code:: c 318 319 /************************************************************************** 320 * This is the second allowed style for multi-line comments. 321 * 322 * In this style, the first and last lines use asterisks that run the full 323 * width of the comment at its widest point. 324 * 325 * This style can be used for additional emphasis. 326 * 327 *************************************************************************/ 328 329.. code:: c 330 331 /* Single line comments can use this format */ 332 333.. code:: c 334 335 /*************************************************************************** 336 * This alternative single-line comment style can also be used for emphasis. 337 **************************************************************************/ 338 339Headers and inclusion 340--------------------- 341 342Header guards 343^^^^^^^^^^^^^ 344 345For a header file called "some_driver.h" the style used by |TF-A| is: 346 347.. code:: c 348 349 #ifndef SOME_DRIVER_H 350 #define SOME_DRIVER_H 351 352 <header content> 353 354 #endif /* SOME_DRIVER_H */ 355 356Include statement ordering 357^^^^^^^^^^^^^^^^^^^^^^^^^^ 358 359All header files that are included by a source file must use the following, 360grouped ordering. This is to improve readability (by making it easier to quickly 361read through the list of headers) and maintainability. 362 363#. *System* includes: Header files from the standard *C* library, such as 364 ``stddef.h`` and ``string.h``. 365 366#. *Project* includes: Header files under the ``include/`` directory within 367 |TF-A| are *project* includes. 368 369#. *Platform* includes: Header files relating to a single, specific platform, 370 and which are located under the ``plat/<platform_name>`` directory within 371 |TF-A|, are *platform* includes. 372 373Within each group, ``#include`` statements must be in alphabetical order, 374taking both the file and directory names into account. 375 376Groups must be separated by a single blank line for clarity. 377 378The example below illustrates the ordering rules using some contrived header 379file names; this type of name reuse should be otherwise avoided. 380 381.. code:: c 382 383 #include <string.h> 384 385 #include <a_dir/example/a_header.h> 386 #include <a_dir/example/b_header.h> 387 #include <a_dir/test/a_header.h> 388 #include <b_dir/example/a_header.h> 389 390 #include "a_header.h" 391 392The preferred approach for third-party headers is to include them immediately 393following system header files like in the example below, where the 394``version.h`` header from the Mbed TLS library immediately follows the 395``stddef.h`` system header. 396 397.. code:: c 398 399 /* system header files */ 400 #include <stddef.h> 401 402 /* Mbed TLS header files */ 403 #include <mbedtls/version.h> 404 405 /* project header files */ 406 #include <drivers/auth/auth_mod.h> 407 #include <drivers/auth/tbbr_cot_common.h> 408 409 /* platform header files */ 410 #include <platform_def.h> 411 412 413Include statement variants 414^^^^^^^^^^^^^^^^^^^^^^^^^^ 415 416Two variants of the ``#include`` directive are acceptable in the |TF-A| 417codebase. Correct use of the two styles improves readability by suggesting the 418location of the included header and reducing ambiguity in cases where generic 419and platform-specific headers share a name. 420 421For header files that are in the same directory as the source file that is 422including them, use the ``"..."`` variant. 423 424For header files that are **not** in the same directory as the source file that 425is including them, use the ``<...>`` variant. 426 427Example (bl1_fwu.c): 428 429.. code:: c 430 431 #include <assert.h> 432 #include <errno.h> 433 #include <string.h> 434 435 #include "bl1_private.h" 436 437Typedefs 438-------- 439 440Avoid anonymous typedefs of structs/enums in headers 441^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 442 443For example, the following definition: 444 445.. code:: c 446 447 typedef struct { 448 int arg1; 449 int arg2; 450 } my_struct_t; 451 452 453is better written as: 454 455.. code:: c 456 457 struct my_struct { 458 int arg1; 459 int arg2; 460 }; 461 462This allows function declarations in other header files that depend on the 463struct/enum to forward declare the struct/enum instead of including the 464entire header: 465 466.. code:: c 467 468 struct my_struct; 469 void my_func(struct my_struct *arg); 470 471instead of: 472 473.. code:: c 474 475 #include <my_struct.h> 476 void my_func(my_struct_t *arg); 477 478Some TF definitions use both a struct/enum name **and** a typedef name. This 479is discouraged for new definitions as it makes it difficult for TF to comply 480with MISRA rule 8.3, which states that "All declarations of an object or 481function shall use the same names and type qualifiers". 482 483The Linux coding standards also discourage new typedefs and checkpatch emits 484a warning for this. 485 486Existing typedefs will be retained for compatibility. 487 488-------------- 489 490*Copyright (c) 2020-2023, Arm Limited. All rights reserved.* 491 492.. _`Linux kernel coding style`: https://www.kernel.org/doc/html/latest/process/coding-style.html 493.. _`MISRA C:2012 Guidelines`: https://en.wikipedia.org/wiki/MISRA_C#MISRA_C:2012 494