Add a fuzzer for HTTP CONNECT
[tor.git] / doc / HACKING / CodingStandards.md
blob55c23a7df528e3c49788dc5e478a519c5e61d030
1 Coding conventions for Tor
2 ==========================
4 tl;dr:
6    - Run configure with `--enable-fatal-warnings`
7    - Document your functions
8    - Write unit tests
9    - Run `make check` before submitting a patch
10    - Run `make distcheck` if you have made changes to build system components
11    - Add a file in `changes` for your branch.
13 Patch checklist
14 ---------------
16 If possible, send your patch as one of these (in descending order of
17 preference)
19    - A git branch we can pull from
20    - Patches generated by git format-patch
21    - A unified diff
23 Did you remember...
25    - To build your code while configured with `--enable-fatal-warnings`?
26    - To run `make check-docs` to see whether all new options are on
27      the manpage?
28    - To write unit tests, as possible?
29    - To run `make test-full` to test against all unit and integration tests (or
30      `make test-full-online` if you have a working connection to the internet)?
31    - To test that the distribution will actually work via `make distcheck`?
32    - To base your code on the appropriate branch?
33    - To include a file in the `changes` directory as appropriate?
35 If you are submitting a major patch or new feature, or want to in the future...
37    - Set up Chutney and Stem, see HACKING/WritingTests.md
38    - Run `make test-full` to test against all unit and integration tests.
40 If you have changed build system components:
41    - Please run `make distcheck`
42    - For example, if you have changed Makefiles, autoconf files, or anything
43      else that affects the build system.
45 How we use Git branches
46 =======================
48 Each main development series (like 0.2.1, 0.2.2, etc) has its main work
49 applied to a single branch.  At most one series can be the development series
50 at a time; all other series are maintenance series that get bug-fixes only.
51 The development series is built in a git branch called "master"; the
52 maintenance series are built in branches called "maint-0.2.0", "maint-0.2.1",
53 and so on.  We regularly merge the active maint branches forward.
55 For all series except the development series, we also have a "release" branch
56 (as in "release-0.2.1").  The release series is based on the corresponding
57 maintenance series, except that it deliberately lags the maint series for
58 most of its patches, so that bugfix patches are not typically included in a
59 maintenance release until they've been tested for a while in a development
60 release.  Occasionally, we'll merge an urgent bugfix into the release branch
61 before it gets merged into maint, but that's rare.
63 If you're working on a bugfix for a bug that occurs in a particular version,
64 base your bugfix branch on the "maint" branch for the first supported series
65 that has that bug.  (As of June 2013, we're supporting 0.2.3 and later.)
67 If you're working on a new feature, base it on the master branch. If you're
68 working on a new feature and it will take a while to implement and/or you'd
69 like to avoid the possibility of unrelated bugs in Tor while you're
70 implementing your feature, consider branching off of the latest maint- branch.
71 _Never_ branch off a relase- branch. Don't branch off a tag either: they come
72 from release branches. Doing so will likely produce a nightmare of merge
73 conflicts in the ChangeLog when it comes time to merge your branch into Tor.
74 Best advice: don't try to keep an independent branch forked for more than 6
75 months and expect it to merge cleanly. Try to merge pieces early and often.
78 How we log changes
79 ==================
81 When you do a commit that needs a ChangeLog entry, add a new file to
82 the `changes` toplevel subdirectory.  It should have the format of a
83 one-entry changelog section from the current ChangeLog file, as in
85 - Major bugfixes:
86     - Fix a potential buffer overflow. Fixes bug 99999; bugfix on
87       0.3.1.4-beta.
89 To write a changes file, first categorize the change.  Some common categories
90 are: Minor bugfixes, Major bugfixes, Minor features, Major features, Code
91 simplifications and refactoring.  Then say what the change does.  If
92 it's a bugfix, mention what bug it fixes and when the bug was
93 introduced.  To find out which Git tag the change was introduced in,
94 you can use `git describe --contains <sha1 of commit>`.
96 If at all possible, try to create this file in the same commit where you are
97 making the change.  Please give it a distinctive name that no other branch will
98 use for the lifetime of your change. To verify the format of the changes file,
99 you can use `make check-changes`.
101 When we go to make a release, we will concatenate all the entries
102 in changes to make a draft changelog, and clear the directory. We'll
103 then edit the draft changelog into a nice readable format.
105 To make sure that stuff is in the right format, we use
106 scripts/maint/lintChanges.py to check the changes files for
107 (superficial) validity.  You can run this script on your own changes
108 files!
110 What needs a changes file?
112    * A not-exhaustive list: Anything that might change user-visible
113    behavior. Anything that changes internals, documentation, or the build
114    system enough that somebody could notice.  Big or interesting code
115    rewrites.  Anything about which somebody might plausibly wonder "when
116    did that happen, and/or why did we do that" 6 months down the line.
118 What does not need a changes file?
120    * Bugfixes for code that hasn't shipped in any released version of Tor
122 Why use changes files instead of Git commit messages?
124    * Git commit messages are written for developers, not users, and they
125    are nigh-impossible to revise after the fact.
127 Why use changes files instead of entries in the ChangeLog?
129    * Having every single commit touch the ChangeLog file tended to create
130    zillions of merge conflicts.
132 Whitespace and C conformance
133 ----------------------------
135 Invoke `make check-spaces` from time to time, so it can tell you about
136 deviations from our C whitespace style.  Generally, we use:
138    - Unix-style line endings
139    - K&R-style indentation
140    - No space before newlines
141    - A blank line at the end of each file
142    - Never more than one blank line in a row
143    - Always spaces, never tabs
144    - No more than 79-columns per line.
145    - Two spaces per indent.
146    - A space between control keywords and their corresponding paren
147      `if (x)`, `while (x)`, and `switch (x)`, never `if(x)`, `while(x)`, or
148      `switch(x)`.
149    - A space between anything and an open brace.
150    - No space between a function name and an opening paren. `puts(x)`, not
151      `puts (x)`.
152    - Function declarations at the start of the line.
154 We try hard to build without warnings everywhere.  In particular, if
155 you're using gcc, you should invoke the configure script with the
156 option `--enable-fatal-warnings`.  This will tell the compiler
157 to make all warnings into errors.
159 Functions to use; functions not to use
160 --------------------------------------
162 We have some wrapper functions like `tor_malloc`, `tor_free`, `tor_strdup`, and
163 `tor_gettimeofday;` use them instead of their generic equivalents.  (They
164 always succeed or exit.)
166 You can get a full list of the compatibility functions that Tor provides by
167 looking through `src/common/util*.h` and `src/common/compat*.h`.  You can see the
168 available containers in `src/common/containers*.h`.  You should probably
169 familiarize yourself with these modules before you write too much code, or
170 else you'll wind up reinventing the wheel.
172 We don't use `strcat` or `strcpy` or `sprintf` of any of those notoriously broken
173 old C functions.  Use `strlcat`, `strlcpy`, or `tor_snprintf/tor_asprintf` instead.
175 We don't call `memcmp()` directly.  Use `fast_memeq()`, `fast_memneq()`,
176 `tor_memeq()`, or `tor_memneq()` for most purposes.
178 Also see a longer list of functions to avoid in:
179 https://people.torproject.org/~nickm/tor-auto/internal/this-not-that.html
181 Other C conventions
182 -------------------
184 The `a ? b : c` trinary operator only goes inside other expressions;
185 don't use it as a replacement for if. (You can ignore this inside macro
186 definitions when necessary.)
188 Assignment operators shouldn't nest inside other expressions.  (You can
189 ignore this inside macro definitions when necessary.)
191 Functions not to write
192 ----------------------
194 Try to never hand-write new code to parse or generate binary
195 formats. Instead, use trunnel if at all possible.  See
197     https://gitweb.torproject.org/trunnel.git/tree
199 for more information about trunnel.
201 For information on adding new trunnel code to Tor, see src/trunnel/README
204 Calling and naming conventions
205 ------------------------------
207 Whenever possible, functions should return -1 on error and 0 on success.
209 For multi-word identifiers, use lowercase words combined with
210 underscores. (e.g., `multi_word_identifier`).  Use ALL_CAPS for macros and
211 constants.
213 Typenames should end with `_t`.
215 Function names should be prefixed with a module name or object name.  (In
216 general, code to manipulate an object should be a module with the same name
217 as the object, so it's hard to tell which convention is used.)
219 Functions that do things should have imperative-verb names
220 (e.g. `buffer_clear`, `buffer_resize`); functions that return booleans should
221 have predicate names (e.g. `buffer_is_empty`, `buffer_needs_resizing`).
223 If you find that you have four or more possible return code values, it's
224 probably time to create an enum.  If you find that you are passing three or
225 more flags to a function, it's probably time to create a flags argument that
226 takes a bitfield.
228 What To Optimize
229 ----------------
231 Don't optimize anything if it's not in the critical path.  Right now, the
232 critical path seems to be AES, logging, and the network itself.  Feel free to
233 do your own profiling to determine otherwise.
235 Log conventions
236 ---------------
238 `https://www.torproject.org/docs/faq#LogLevel`
240 No error or warning messages should be expected during normal OR or OP
241 operation.
243 If a library function is currently called such that failure always means ERR,
244 then the library function should log WARN and let the caller log ERR.
246 Every message of severity INFO or higher should either (A) be intelligible
247 to end-users who don't know the Tor source; or (B) somehow inform the
248 end-users that they aren't expected to understand the message (perhaps
249 with a string like "internal error"). Option (A) is to be preferred to
250 option (B).
254 Doxygen comment conventions
255 ---------------------------
257 Say what functions do as a series of one or more imperative sentences, as
258 though you were telling somebody how to be the function.  In other words, DO
259 NOT say:
261      /** The strtol function parses a number.
262       *
263       * nptr -- the string to parse.  It can include whitespace.
264       * endptr -- a string pointer to hold the first thing that is not part
265       *    of the number, if present.
266       * base -- the numeric base.
267       * returns: the resulting number.
268       */
269      long strtol(const char *nptr, char **nptr, int base);
271 Instead, please DO say:
273      /** Parse a number in radix <b>base</b> from the string <b>nptr</b>,
274       * and return the result.  Skip all leading whitespace.  If
275       * <b>endptr</b> is not NULL, set *<b>endptr</b> to the first character
276       * after the number parsed.
277       **/
278      long strtol(const char *nptr, char **nptr, int base);
280 Doxygen comments are the contract in our abstraction-by-contract world: if
281 the functions that call your function rely on it doing something, then your
282 function should mention that it does that something in the documentation.  If
283 you rely on a function doing something beyond what is in its documentation,
284 then you should watch out, or it might do something else later.