From 7946fba19c74ad4ed7a543ddeb0337d5dcf19359 Mon Sep 17 00:00:00 2001 From: Florian Forster Date: Fri, 19 Oct 2018 14:38:27 +0200 Subject: [PATCH] docs/review_comments.md: Start document with frequent review comments. --- docs/review_comments.md | 67 +++++++++++++++++++++++++++++++++++++++ docs/review_comments_example.png | Bin 0 -> 19101 bytes 2 files changed, 67 insertions(+) create mode 100644 docs/review_comments.md create mode 100644 docs/review_comments_example.png diff --git a/docs/review_comments.md b/docs/review_comments.md new file mode 100644 index 00000000..bcb6fc0c --- /dev/null +++ b/docs/review_comments.md @@ -0,0 +1,67 @@ +# Code Review Comments + +This is a collection of frequent code review comments, collected here for +reference and discussed in more depth than a typical code review would allow. + +The intended use for this document is to point to it from a code review to make +a point quickly while still providing the contributor with enough information +to resolve the issue. For example, a good review comment would be: + +![Please initialize variables at declaration. Link to comment.](review_comments_example.png) + +A link to each paragraph is provided at the beginning for easy copy'n'pasting. + +## Initialize variables + +→ [https://collectd.org/review-comments#initialize-variables](https://collectd.org/review-comments#initialize-variables) + +Initialize variables when declaring them. By default, C does not initialize +variables when they are declared. If a code path ends up reading the variable +before it is initialized, for example because a loop body is never +executed, it will read random data, causing undefined behavior. Worst case, +pointers will point to random memory causing a segmentation fault. + +**Examples:** + +```c +/* Initialize scalar with to literal: */ +int status = 0; + +/* Initialize pointer with function call: */ +char *buffer = calloc(1, buffer_size); + +/* Initialize struct with struct initializer: */ +struct addrinfo ai = { + .ai_family = AF_UNSPEC, + .ai_flags = AI_ADDRCONFIG, + .ai_socktype = SOCK_STREAM, +}; + +/* Initialize struct with zero: */ +struct stat statbuf = {0}; +``` + +In the last example, `{0}` is the universal struct initializer that, in theory, +should be able to zero-initialize any struct. In practise, however, some +compilers don't implement this correctly and will get confused when the first +member is a struct or a union. Our *continuous integration* framework will +catch these cases. + +In many cases, this means declaring variables later. For example, this *bad* +example: + +```c +int status; /* BAD */ + +/* other code */ + +status = function_call(); +``` + +Would become: + +```c +/* other code */ + +int status = function_call(); /* GOOD */ +``` diff --git a/docs/review_comments_example.png b/docs/review_comments_example.png new file mode 100644 index 0000000000000000000000000000000000000000..81eb4582b4e58c9b58fbdf37a6a4c5127d0f9262 GIT binary patch literal 19101 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 QzyJUM07*qoM6N<$f**4LIsgCw literal 0 HcmV?d00001 -- 2.11.0