VirtualBox

source: vbox/trunk/doc/VBox-CodingGuidelines.cpp@ 69703

Last change on this file since 69703 was 69500, checked in by vboxsync, 7 years ago

*: scm --update-copyright-year

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 30.4 KB
Line 
1/* $Id: VBox-CodingGuidelines.cpp 69500 2017-10-28 15:14:05Z vboxsync $ */
2/** @file
3 * VBox - Coding Guidelines.
4 */
5
6/*
7 * Copyright (C) 2006-2017 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18/** @page pg_vbox_guideline VBox Coding Guidelines
19 *
20 * The VBox Coding guidelines are followed by all of VBox with the exception of
21 * qemu. Qemu is using whatever the frenchman does.
22 *
23 * There are a few compulsory rules and a bunch of optional ones. The following
24 * sections will describe these in details. In addition there is a section of
25 * Subversion 'rules'.
26 *
27 *
28 *
29 * @section sec_vbox_guideline_compulsory Compulsory
30 *
31 * <ul>
32 *
33 * <li> The indentation size is 4 chars.
34 *
35 * <li> Tabs are only ever used in makefiles.
36 *
37 * <li> Use RT and VBOX types.
38 *
39 * <li> Use Runtime functions.
40 *
41 * <li> Use the standard bool, uintptr_t, intptr_t and [u]int[1-9+]_t types.
42 *
43 * <li> Avoid using plain unsigned and int.
44 *
45 * <li> Use static wherever possible. This makes the namespace less polluted
46 * and avoids nasty name clash problems which can occur, especially on
47 * Unix-like systems. (1) It also simplifies locating callers when
48 * changing it (single source file vs entire VBox tree).
49 *
50 * <li> Public names are of the form Domain[Subdomain[]]Method, using mixed
51 * casing to mark the words. The main domain is all uppercase.
52 * (Think like java, mapping domain and subdomain to packages/classes.)
53 *
54 * <li> Public names are always declared using the appropriate DECL macro. (2)
55 *
56 * <li> Internal names starts with a lowercased main domain.
57 *
58 * <li> Defines are all uppercase and separate words with underscore.
59 * This applies to enum values too.
60 *
61 * <li> Typedefs are all uppercase and contain no underscores to distinguish
62 * them from defines.
63 *
64 * <li> Pointer typedefs start with 'P'. If pointer to const then 'PC'.
65 *
66 * <li> Function typedefs start with 'FN'. If pointer to FN then 'PFN'.
67 *
68 * <li> All files are case sensitive.
69 *
70 * <li> Slashes are unix slashes ('/') runtime converts when necessary.
71 *
72 * <li> char strings are UTF-8.
73 *
74 * <li> Strings from any external source must be treated with utmost care as
75 * they do not have to be valid UTF-8. Only trust internal strings.
76 *
77 * <li> All functions return VBox status codes. There are three general
78 * exceptions from this:
79 *
80 * <ol>
81 * <li>Predicate functions. These are function which are boolean in
82 * nature and usage. They return bool. The function name will
83 * include 'Has', 'Is' or similar.
84 * <li>Functions which by nature cannot possibly fail.
85 * These return void.
86 * <li>"Get"-functions which return what they ask for.
87 * A get function becomes a "Query" function if there is any
88 * doubt about getting what is ask for.
89 * </ol>
90 *
91 * <li> VBox status codes have three subdivisions:
92 * <ol>
93 * <li> Errors, which are VERR_ prefixed and negative.
94 * <li> Warnings, which are VWRN_ prefixed and positive.
95 * <li> Informational, which are VINF_ prefixed and positive.
96 * </ol>
97 *
98 * <li> Platform/OS operation are generalized and put in the IPRT.
99 *
100 * <li> Other useful constructs are also put in the IPRT.
101 *
102 * <li> The code shall not cause compiler warnings. Check this on ALL
103 * the platforms.
104 *
105 * <li> The use of symbols leading with single or double underscores is
106 * forbidden as that intrudes on reserved compiler/system namespace. (3)
107 *
108 * <li> All files have file headers with $Id and a file tag which describes
109 * the file in a sentence or two.
110 * Note: Use the svn-ps.cmd/svn-ps.sh utility with the -a option to add
111 * new sources with keyword expansion and exporting correctly
112 * configured.
113 *
114 * <li> All public functions are fully documented in Doxygen style using the
115 * javadoc dialect (using the 'at' instead of the 'slash' as
116 * commandprefix.)
117 *
118 * <li> All structures in header files are described, including all their
119 * members. (Doxygen style, of course.)
120 *
121 * <li> All modules have a documentation '\@page' in the main source file
122 * which describes the intent and actual implementation.
123 *
124 * <li> Code which is doing things that are not immediately comprehensible
125 * shall include explanatory comments.
126 *
127 * <li> Documentation and comments are kept up to date.
128 *
129 * <li> Headers in /include/VBox shall not contain any slash-slash C++
130 * comments, only ANSI C comments!
131 *
132 * <li> Comments on \#else indicates what begins while the comment on a
133 * \#endif indicates what ended. Only add these when there are more than
134 * a few lines (6-10) of \#ifdef'ed code, otherwise they're just clutter.
135 * </ul>
136 *
137 * (1) It is common practice on Unix to have a single symbol namespace for an
138 * entire process. If one is careless symbols might be resolved in a
139 * different way that one expects, leading to weird problems.
140 *
141 * (2) This is common practice among most projects dealing with modules in
142 * shared libraries. The Windows / PE __declspect(import) and
143 * __declspect(export) constructs are the main reason for this.
144 * OTOH, we do perhaps have a bit too detailed graining of this in VMM...
145 *
146 * (3) There are guys out there grepping public sources for symbols leading with
147 * single and double underscores as well as gotos and other things
148 * considered bad practice. They'll post statistics on how bad our sources
149 * are on some mailing list, forum or similar.
150 *
151 *
152 * @subsection sec_vbox_guideline_compulsory_sub64 64-bit and 32-bit
153 *
154 * Here are some amendments which address 64-bit vs. 32-bit portability issues.
155 *
156 * Some facts first:
157 *
158 * <ul>
159 *
160 * <li> On 64-bit Windows the type long remains 32-bit. On nearly all other
161 * 64-bit platforms long is 64-bit.
162 *
163 * <li> On all 64-bit platforms we care about, int is 32-bit, short is 16 bit
164 * and char is 8-bit.
165 * (I don't know about any platforms yet where this isn't true.)
166 *
167 * <li> size_t, ssize_t, uintptr_t, ptrdiff_t and similar are all 64-bit on
168 * 64-bit platforms. (These are 32-bit on 32-bit platforms.)
169 *
170 * <li> There is no inline assembly support in the 64-bit Microsoft compilers.
171 *
172 * </ul>
173 *
174 * Now for the guidelines:
175 *
176 * <ul>
177 *
178 * <li> Never, ever, use int, long, ULONG, LONG, DWORD or similar to cast a
179 * pointer to integer. Use uintptr_t or intptr_t. If you have to use
180 * NT/Windows types, there is the choice of ULONG_PTR and DWORD_PTR.
181 *
182 * <li> Avoid where ever possible the use of the types 'long' and 'unsigned
183 * long' as these differs in size between windows and the other hosts
184 * (see above).
185 *
186 * <li> RT_OS_WINDOWS is defined to indicate Windows. Do not use __WIN32__,
187 * __WIN64__ and __WIN__ because they are all deprecated and scheduled
188 * for removal (if not removed already). Do not use the compiler
189 * defined _WIN32, _WIN64, or similar either. The bitness can be
190 * determined by testing ARCH_BITS.
191 * Example:
192 * @code
193 * #ifdef RT_OS_WINDOWS
194 * // call win32/64 api.
195 * #endif
196 * #ifdef RT_OS_WINDOWS
197 * # if ARCH_BITS == 64
198 * // call win64 api.
199 * # else // ARCH_BITS == 32
200 * // call win32 api.
201 * # endif // ARCH_BITS == 32
202 * #else // !RT_OS_WINDOWS
203 * // call posix api
204 * #endif // !RT_OS_WINDOWS
205 * @endcode
206 *
207 * <li> There are RT_OS_xxx defines for each OS, just like RT_OS_WINDOWS
208 * mentioned above. Use these defines instead of any predefined
209 * compiler stuff or defines from system headers.
210 *
211 * <li> RT_ARCH_X86 is defined when compiling for the x86 the architecture.
212 * Do not use __x86__, __X86__, __[Ii]386__, __[Ii]586__, or similar
213 * for this purpose.
214 *
215 * <li> RT_ARCH_AMD64 is defined when compiling for the AMD64 architecture.
216 * Do not use __AMD64__, __amd64__ or __x64_86__.
217 *
218 * <li> Take care and use size_t when you have to, esp. when passing a pointer
219 * to a size_t as a parameter.
220 *
221 * <li> Be wary of type promotion to (signed) integer. For example the
222 * following will cause u8 to be promoted to int in the shift, and then
223 * sign extended in the assignment 64-bit:
224 * @code
225 * uint8_t u8 = 0xfe;
226 * uint64_t u64 = u8 << 24;
227 * // u64 == 0xfffffffffe000000
228 * @endcode
229 *
230 * </ul>
231 *
232 * @subsection sec_vbox_guideline_compulsory_cppmain C++ guidelines for Main
233 *
234 * Main is currently (2009) full of hard-to-maintain code that uses complicated
235 * templates. The new mid-term goal for Main is to have less custom templates
236 * instead of more for the following reasons:
237 *
238 * <ul>
239 *
240 * <li> Template code is harder to read and understand. Custom templates create
241 * territories which only the code writer understands.
242 *
243 * <li> Errors in using templates create terrible C++ compiler messages.
244 *
245 * <li> Template code is really hard to look at in a debugger.
246 *
247 * <li> Templates slow down the compiler a lot.
248 *
249 * </ul>
250 *
251 * In particular, the following bits should be considered deprecated and should
252 * NOT be used in new code:
253 *
254 * <ul>
255 *
256 * <li> everything in include/iprt/cpputils.h (auto_ref_ptr, exception_trap_base,
257 * char_auto_ptr and friends)
258 *
259 * </ul>
260 *
261 * Generally, in many cases, a simple class with a proper destructor can achieve
262 * the same effect as a 1,000-line template include file, and the code is
263 * much more accessible that way.
264 *
265 * Using standard STL templates like std::list, std::vector and std::map is OK.
266 * Exceptions are:
267 *
268 * <ul>
269 *
270 * <li> Guest Additions because we don't want to link against libstdc++ there.
271 *
272 * <li> std::string should not be used because we have iprt::MiniString and
273 * com::Utf8Str which can convert efficiently with COM's UTF-16 strings.
274 *
275 * <li> std::auto_ptr<> in general; that part of the C++ standard is just broken.
276 * Write a destructor that calls delete.
277 *
278 * </ul>
279 *
280 * @subsection sec_vbox_guideline_compulsory_cppqtgui C++ guidelines for the Qt GUI
281 *
282 * The Qt GUI is currently (2010) on its way to become more compatible to the
283 * rest of VirtualBox coding style wise. From now on, all the coding style
284 * rules described in this file are also mandatory for the Qt GUI. Additionally
285 * the following rules should be respected:
286 *
287 * <ul>
288 *
289 * <li> GUI classes which correspond to GUI tasks should be prefixed by UI (no VBox anymore)
290 *
291 * <li> Classes which extents some of the Qt classes should be prefix by QI
292 *
293 * <li> General task classes should be prefixed by C
294 *
295 * <li> Slots are prefixed by slt -> sltName
296 *
297 * <li> Signals are prefixed by sig -> sigName
298 *
299 * <li> Use Qt classes for lists, strings and so on, the use of STL classes should
300 * be avoided
301 *
302 * <li> All files like .cpp, .h, .ui, which belong together are located in the
303 * same directory and named the same
304 *
305 * </ul>
306 *
307 *
308 * @subsection sec_vbox_guideline_compulsory_xslt XSLT
309 *
310 * XSLT (eXtensible Stylesheet Language Transformations) is used quite a bit in
311 * the Main API area of VirtualBox to generate sources and bindings to that API.
312 * There are a couple of common pitfalls worth mentioning:
313 *
314 * <ul>
315 *
316 * <li> Never do repeated //interface[\@name=...] and //enum[\@name=...] lookups
317 * because they are expensive. Instead delcare xsl:key elements for these
318 * searches and do the lookup using the key() function. xsltproc uses
319 * (per current document) hash tables for each xsl:key, i.e. very fast.
320 *
321 * <li> When output type is 'text' make sure to call xsltprocNewlineOutputHack
322 * from typemap-shared.inc.xsl every few KB of output, or xsltproc will
323 * end up wasting all the time reallocating the output buffer.
324 *
325 * </ul>
326 *
327 * @subsection sec_vbox_guideline_compulsory_doxygen Doxygen Comments
328 *
329 * As mentioned above, we shall use doxygen/javadoc style commenting of public
330 * functions, typedefs, classes and such. It is preferred to use this style in
331 * as many places as possible.
332 *
333 * A couple of hints on how to best write doxygen comments:
334 *
335 * <ul>
336 *
337 * <li> A good class, method, function, structure or enum doxygen comment
338 * starts with a one line sentence giving a brief description of the
339 * item. Details comes in a new paragraph (after blank line).
340 *
341 * <li> Except for list generators like \@todo, \@cfgm, \@gcfgm and others,
342 * all doxygen comments are related to things in the code. So, for
343 * instance you DO NOT add a doxygen \@note comment in the middle of a
344 * because you've got something important to note, you add a normal
345 * comment like 'Note! blah, very importan blah!'
346 *
347 * <li> We do NOT use TODO/XXX/BUGBUG or similar markers in the code to flag
348 * things needing fixing later, we always use \@todo doxygen comments.
349 *
350 * <li> There is no colon after the \@todo. And it is ALWAYS in a doxygen
351 * comment.
352 *
353 * <li> The \@retval tag is used to explain status codes a method/function may
354 * returns. It is not used to describe output parameters, that is done
355 * using the \@param or \@param[out] tag.
356 *
357 * </ul>
358 *
359 * See https://www.stack.nl/~dimitri/doxygen/manual/index.html for the official
360 * doxygen documention.
361 *
362 *
363 * @section sec_vbox_guideline_optional Optional
364 *
365 * First part is the actual coding style and all the prefixes. The second part
366 * is a bunch of good advice.
367 *
368 *
369 * @subsection sec_vbox_guideline_optional_layout The code layout
370 *
371 * <ul>
372 *
373 * <li> Max line length is 130 chars. Exceptions are table-like
374 * code/initializers and Log*() statements (don't waste unnecessary
375 * vertical space on debug logging).
376 *
377 * <li> Comments should try stay within the usual 80 columns as these are
378 * denser and too long lines may be harder to read.
379 *
380 * <li> Curly brackets are not indented. Example:
381 * @code
382 * if (true)
383 * {
384 * Something1();
385 * Something2();
386 * }
387 * else
388 * {
389 * SomethingElse1().
390 * SomethingElse2().
391 * }
392 * @endcode
393 *
394 * <li> Space before the parentheses when it comes after a C keyword.
395 *
396 * <li> No space between argument and parentheses. Exception for complex
397 * expression. Example:
398 * @code
399 * if (PATMR3IsPatchGCAddr(pVM, GCPtr))
400 * @endcode
401 *
402 * <li> The else of an if is always the first statement on a line. (No curly
403 * stuff before it!)
404 *
405 * <li> else and if go on the same line if no { compound statement }
406 * follows the if. Example:
407 * @code
408 * if (fFlags & MYFLAGS_1)
409 * fFlags &= ~MYFLAGS_10;
410 * else if (fFlags & MYFLAGS_2)
411 * {
412 * fFlags &= ~MYFLAGS_MASK;
413 * fFlags |= MYFLAGS_5;
414 * }
415 * else if (fFlags & MYFLAGS_3)
416 * @endcode
417 *
418 * <li> Slightly complex boolean expressions are split into multiple lines,
419 * putting the operators first on the line and indenting it all according
420 * to the nesting of the expression. The purpose is to make it as easy as
421 * possible to read. Example:
422 * @code
423 * if ( RT_SUCCESS(rc)
424 * || (fFlags & SOME_FLAG))
425 * @endcode
426 *
427 * <li> When 'if' or 'while' statements gets long, the closing parentheses
428 * goes right below the opening parentheses. This may be applied to
429 * sub-expression. Example:
430 * @code
431 * if ( RT_SUCCESS(rc)
432 * || ( fSomeStuff
433 * && fSomeOtherStuff
434 * && fEvenMoreStuff
435 * )
436 * || SomePredicateFunction()
437 * )
438 * {
439 * ...
440 * }
441 * @endcode
442 *
443 * <li> The case is indented from the switch (to avoid having the braces for
444 * the 'case' at the same level as the 'switch' statement).
445 *
446 * <li> If a case needs curly brackets they contain the entire case, are not
447 * indented from the case, and the break or return is placed inside them.
448 * Example:
449 * @code
450 * switch (pCur->eType)
451 * {
452 * case PGMMAPPINGTYPE_PAGETABLES:
453 * {
454 * unsigned iPDE = pCur->GCPtr >> PGDIR_SHIFT;
455 * unsigned iPT = (pCur->GCPtrEnd - pCur->GCPtr) >> PGDIR_SHIFT;
456 * while (iPT-- > 0)
457 * if (pPD->a[iPDE + iPT].n.u1Present)
458 * return VERR_HYPERVISOR_CONFLICT;
459 * break;
460 * }
461 * }
462 * @endcode
463 *
464 * <li> In a do while construction, the while is on the same line as the
465 * closing "}" if any are used.
466 * Example:
467 * @code
468 * do
469 * {
470 * stuff;
471 * i--;
472 * } while (i > 0);
473 * @endcode
474 *
475 * <li> Comments are in C style. C++ style comments are used for temporary
476 * disabling a few lines of code.
477 *
478 * <li> No unnecessary parentheses in expressions (just don't over do this
479 * so that gcc / msc starts bitching). Find a correct C/C++ operator
480 * precedence table if needed.
481 *
482 * <li> 'for (;;)' is preferred over 'while (true)' and 'while (1)'.
483 *
484 * <li> Parameters are indented to the start parentheses when breaking up
485 * function calls, declarations or prototypes. (This is in line with
486 * how 'if', 'for' and 'while' statements are done as well.) Example:
487 * @code
488 * RTPROCESS hProcess;
489 * int rc = RTProcCreateEx(papszArgs[0],
490 * papszArgs,
491 * RTENV_DEFAULT,
492 * fFlags,
493 * NULL, // phStdIn
494 * NULL, // phStdOut
495 * NULL, // phStdErr
496 * NULL, // pszAsUser
497 * NULL, // pszPassword
498 * &hProcess);
499 * @endcode
500 *
501 * <li> That Dijkstra is dead is no excuse for using gotos.
502 *
503 * <li> Using do-while-false loops to avoid gotos is considered very bad form.
504 * They create hard to read code. They tend to be either too short (i.e.
505 * pointless) or way to long (split up the function already), making
506 * tracking the state is difficult and prone to bugs. Also, they cause
507 * the compiler to generate suboptimal code, because the break branches
508 * are by preferred over the main code flow (MSC has no branch hinting!).
509 * Instead, do make use the 130 columns (i.e. nested ifs) and split
510 * the code up into more functions!
511 *
512 * <li> Avoid code like
513 * @code
514 * int foo;
515 * int rc;
516 * ...
517 * rc = FooBar();
518 * if (RT_SUCCESS(rc))
519 * {
520 * foo = getFoo();
521 * ...
522 * pvBar = RTMemAlloc(sizeof(*pvBar));
523 * if (!pvBar)
524 * rc = VERR_NO_MEMORY;
525 * }
526 * if (RT_SUCCESS(rc))
527 * {
528 * buzz = foo;
529 * ...
530 * }
531 * @endcode
532 * The intention of such code is probably to save some horizontal space
533 * but unfortunately it's hard to read and the scope of certain varables
534 * (e.g. foo in this example) is not optimal. Better use the following
535 * style:
536 * @code
537 * int rc;
538 * ...
539 * rc = FooBar();
540 * if (RT_SUCCESS(rc))
541 * {
542 * int foo = getFoo();
543 * ...
544 * pvBar = RTMemAlloc(sizeof(*pvBar));
545 * if (pvBar)
546 * {
547 * buzz = foo;
548 * ...
549 * }
550 * else
551 * rc = VERR_NO_MEMORY;
552 * }
553 * @endcode
554 *
555 * </ul>
556 *
557 * @subsection sec_vbox_guideline_optional_prefix Variable / Member Prefixes
558 *
559 * Prefixes are meant to provide extra context clues to a variable/member, we
560 * therefore avoid using prefixes that just indicating the type if a better
561 * choice is available.
562 *
563 *
564 * The prefixes:
565 *
566 * <ul>
567 *
568 * <li> The 'g_' (or 'g') prefix means a global variable, either on file or module level.
569 *
570 * <li> The 's_' (or 's') prefix means a static variable inside a function or
571 * class. This is not used for static variables on file level, use 'g_'
572 * for those (logical, right).
573 *
574 * <li> The 'm_' (or 'm') prefix means a class data member.
575 *
576 * In new code in Main, use "m_" (and common sense). As an exception,
577 * in Main, if a class encapsulates its member variables in an anonymous
578 * structure which is declared in the class, but defined only in the
579 * implementation (like this: 'class X { struct Data; Data *m; }'), then
580 * the pointer to that struct is called 'm' itself and its members then
581 * need no prefix, because the members are accessed with 'm->member'
582 * already which is clear enough.
583 *
584 * <li> The 'a_' prefix means a parameter (argument) variable. This is
585 * sometimes written 'a' in parts of the source code that does not use
586 * the array prefix.
587 *
588 * <li> The 'p' prefix means pointer. For instance 'pVM' is pointer to VM.
589 *
590 * <li> The 'r' prefix means that something is passed by reference.
591 *
592 * <li> The 'k' prefix means that something is a constant. For instance
593 * 'enum { kStuff };'. This is usually not used in combination with
594 * 'p', 'r' or any such thing, it's main main use is to make enums
595 * easily identifiable.
596 *
597 * <li> The 'a' prefix means array. For instance 'aPages' could be read as
598 * array of pages.
599 *
600 * <li> The 'c' prefix means count. For instance 'cbBlock' could be read,
601 * count of bytes in block. (1)
602 *
603 * <li> The 'cx' prefix means width (count of 'x' units).
604 *
605 * <li> The 'cy' prefix means height (count of 'y' units).
606 *
607 * <li> The 'x', 'y' and 'z' prefix refers to the x-, y- , and z-axis
608 * respectively.
609 *
610 * <li> The 'off' prefix means offset.
611 *
612 * <li> The 'i' or 'idx' prefixes usually means index. Although the 'i' one
613 * can sometimes just mean signed integer.
614 *
615 * <li> The 'i[1-9]+' prefix means a fixed bit size variable. Frequently
616 * used with the int[1-9]+_t types where the width is really important.
617 * In most cases 'i' is more appropriate. [type]
618 *
619 * <li> The 'e' (or 'enm') prefix means enum.
620 *
621 * <li> The 'u' prefix usually means unsigned integer. Exceptions follows.
622 *
623 * <li> The 'u[1-9]+' prefix means a fixed bit size variable. Frequently
624 * used with the uint[1-9]+_t types and with bitfields where the width is
625 * really important. In most cases 'u' or 'b' (byte) would be more
626 * appropriate. [type]
627 *
628 * <li> The 'b' prefix means byte or bytes. [type]
629 *
630 * <li> The 'f' prefix means flags. Flags are unsigned integers of some kind
631 * or booleans.
632 *
633 * <li> TODO: need prefix for real float. [type]
634 *
635 * <li> The 'rd' prefix means real double and is used for 'double' variables.
636 * [type]
637 *
638 * <li> The 'lrd' prefix means long real double and is used for 'long double'
639 * variables. [type]
640 *
641 * <li> The 'ch' prefix means a char, the (signed) char type. [type]
642 *
643 * <li> The 'wc' prefix means a wide/windows char, the RTUTF16 type. [type]
644 *
645 * <li> The 'uc' prefix means a Unicode Code point, the RTUNICP type. [type]
646 *
647 * <li> The 'uch' prefix means unsigned char. It's rarely used. [type]
648 *
649 * <li> The 'sz' prefix means zero terminated character string (array of
650 * chars). (UTF-8)
651 *
652 * <li> The 'wsz' prefix means zero terminated wide/windows character string
653 * (array of RTUTF16).
654 *
655 * <li> The 'usz' prefix means zero terminated Unicode string (array of
656 * RTUNICP).
657 *
658 * <li> The 'str' prefix means C++ string; either a std::string or, in Main,
659 * a Utf8Str or, in Qt, a QString. When used with 'p', 'r', 'a' or 'c'
660 * the first letter should be capitalized.
661 *
662 * <li> The 'bstr' prefix, in Main, means a UTF-16 Bstr. When used with 'p',
663 * 'r', 'a' or 'c' the first letter should be capitalized.
664 *
665 * <li> The 'pfn' prefix means pointer to function. Common usage is 'pfnCallback'
666 * and such like.
667 *
668 * <li> The 'psz' prefix is a combination of 'p' and 'sz' and thus means
669 * pointer to a zero terminated character string. (UTF-8)
670 *
671 * <li> The 'pcsz' prefix is used to indicate constant string pointers in
672 * parts of the code. Most code uses 'psz' for const and non-const
673 * string pointers, so please ignore this one.
674 *
675 * <li> The 'l' prefix means (signed) long. We try avoid using this,
676 * expecially with the 'LONG' types in Main as these are not 'long' on
677 * 64-bit non-Windows platforms and can cause confusion. Alternatives:
678 * 'i' or 'i32'. [type]
679 *
680 * <li> The 'ul' prefix means unsigned long. We try avoid using this,
681 * expecially with the 'ULONG' types in Main as these are not 'unsigned
682 * long' on 64-bit non-Windows platforms and can cause confusion.
683 * Alternatives: 'u' or 'u32'. [type]
684 *
685 * </ul>
686 *
687 * (1) Except in the occasional 'pcsz' prefix, the 'c' prefix is never ever
688 * used in the meaning 'const'.
689 *
690 *
691 * @subsection sec_vbox_guideline_optional_misc Misc / Advice / Stuff
692 *
693 * <ul>
694 *
695 * <li> When writing code think as the reader.
696 *
697 * <li> When writing code think as the compiler. (2)
698 *
699 * <li> When reading code think as if it's full of bugs - find them and fix them.
700 *
701 * <li> Pointer within range tests like:
702 * @code
703 * if ((uintptr_t)pv >= (uintptr_t)pvBase && (uintptr_t)pv < (uintptr_t)pvBase + cbRange)
704 * @endcode
705 * Can also be written as (assuming cbRange unsigned):
706 * @code
707 * if ((uintptr_t)pv - (uintptr_t)pvBase < cbRange)
708 * @endcode
709 * Which is shorter and potentially faster. (1)
710 *
711 * <li> Avoid unnecessary casting. All pointers automatically cast down to
712 * void *, at least for non class instance pointers.
713 *
714 * <li> It's very very bad practise to write a function larger than a
715 * screen full (1024x768) without any comprehensibility and explaining
716 * comments.
717 *
718 * <li> More to come....
719 *
720 * </ul>
721 *
722 * (1) Important, be very careful with the casting. In particular, note that
723 * a compiler might treat pointers as signed (IIRC).
724 *
725 * (2) "A really advanced hacker comes to understand the true inner workings of
726 * the machine - he sees through the language he's working in and glimpses
727 * the secret functioning of the binary code - becomes a Ba'al Shem of
728 * sorts." (Neal Stephenson "Snow Crash")
729 *
730 *
731 *
732 * @section sec_vbox_guideline_warnings Compiler Warnings
733 *
734 * The code should when possible compile on all platforms and compilers without any
735 * warnings. That's a nice idea, however, if it means making the code harder to read,
736 * less portable, unreliable or similar, the warning should not be fixed.
737 *
738 * Some of the warnings can seem kind of innocent at first glance. So, let's take the
739 * most common ones and explain them.
740 *
741 *
742 * @subsection sec_vbox_guideline_warnings_signed_unsigned_compare Signed / Unsigned Compare
743 *
744 * GCC says: "warning: comparison between signed and unsigned integer expressions"
745 * MSC says: "warning C4018: '<|<=|==|>=|>' : signed/unsigned mismatch"
746 *
747 * The following example will not output what you expect:
748@code
749#include <stdio.h>
750int main()
751{
752 signed long a = -1;
753 unsigned long b = 2294967295;
754 if (a < b)
755 printf("%ld < %lu: true\n", a, b);
756 else
757 printf("%ld < %lu: false\n", a, b);
758 return 0;
759}
760@endcode
761 * If I understood it correctly, the compiler will convert a to an
762 * unsigned long before doing the compare.
763 *
764 *
765 *
766 * @section sec_vbox_guideline_svn Subversion Commit Rules
767 *
768 *
769 * Before checking in:
770 *
771 * <ul>
772 *
773 * <li> Check Tinderbox and make sure the tree is green across all platforms. If it's
774 * red on a platform, don't check in. If you want, warn in the \#vbox channel and
775 * help make the responsible person fix it.
776 * NEVER CHECK IN TO A BROKEN BUILD.
777 *
778 * <li> When checking in keep in mind that a commit is atomic and that the Tinderbox and
779 * developers are constantly checking out the tree. Therefore do not split up the
780 * commit unless it's into 100% independent parts. If you need to split it up in order
781 * to have sensible commit comments, make the sub-commits as rapid as possible.
782 *
783 * <li> If you make a user visible change, such as fixing a reported bug,
784 * make sure you add an entry to doc/manual/user_ChangeLogImpl.xml.
785 *
786 * <li> If you are adding files make sure set the right attributes.
787 * svn-ps.sh/cmd was created for this purpose, please make use of it.
788 *
789 * </ul>
790 *
791 * After checking in:
792 *
793 * <ul>
794 *
795 * <li> After checking-in, you watch Tinderbox until your check-ins clear. You do not
796 * go home. You do not sleep. You do not log out or experiment with drugs. You do
797 * not become unavailable. If you break the tree, add a comment saying that you're
798 * fixing it. If you can't fix it and need help, ask in the \#innotek channel or back
799 * out the change.
800 *
801 * </ul>
802 *
803 * (Inspired by mozilla tree rules.)
804 */
805
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette