Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / clang / docs / analyzer / checkers.rst
blob43137f4b020f9f79835215529398a3566eab8ac5
1 ==================
2 Available Checkers
3 ==================
5 The analyzer performs checks that are categorized into families or "checkers".
7 The default set of checkers covers a variety of checks targeted at finding security and API usage bugs,
8 dead code, and other logic errors. See the :ref:`default-checkers` checkers list below.
10 In addition to these, the analyzer contains a number of :ref:`alpha-checkers` (aka *alpha* checkers).
11 These checkers are under development and are switched off by default. They may crash or emit a higher number of false positives.
13 The :ref:`debug-checkers` package contains checkers for analyzer developers for debugging purposes.
15 .. contents:: Table of Contents
16    :depth: 4
19 .. _default-checkers:
21 Default Checkers
22 ----------------
24 .. _core-checkers:
26 core
27 ^^^^
28 Models core language features and contains general-purpose checkers such as division by zero,
29 null pointer dereference, usage of uninitialized values, etc.
30 *These checkers must be always switched on as other checker rely on them.*
32 .. _core-BitwiseShift:
34 core.BitwiseShift (C, C++)
35 """"""""""""""""""""""""""
37 Finds undefined behavior caused by the bitwise left- and right-shift operator
38 operating on integer types.
40 By default, this checker only reports situations when the right operand is
41 either negative or larger than the bit width of the type of the left operand;
42 these are logically unsound.
44 Moreover, if the pedantic mode is activated by
45 ``-analyzer-config core.BitwiseShift:Pedantic=true``, then this checker also
46 reports situations where the _left_ operand of a shift operator is negative or
47 overflow occurs during the right shift of a signed value. (Most compilers
48 handle these predictably, but the C standard and the C++ standards before C++20
49 say that they're undefined behavior. In the C++20 standard these constructs are
50 well-defined, so activating pedantic mode in C++20 has no effect.)
52 **Examples**
54 .. code-block:: cpp
56  static_assert(sizeof(int) == 4, "assuming 32-bit int")
58  void basic_examples(int a, int b) {
59    if (b < 0) {
60      b = a << b; // warn: right operand is negative in left shift
61    } else if (b >= 32) {
62      b = a >> b; // warn: right shift overflows the capacity of 'int'
63    }
64  }
66  int pedantic_examples(int a, int b) {
67    if (a < 0) {
68      return a >> b; // warn: left operand is negative in right shift
69    }
70    a = 1000u << 31; // OK, overflow of unsigned value is well-defined, a == 0
71    if (b > 10) {
72      a = b << 31; // this is undefined before C++20, but the checker doesn't
73                   // warn because it doesn't know the exact value of b
74    }
75    return 1000 << 31; // warn: this overflows the capacity of 'int'
76  }
78 **Solution**
80 Ensure the shift operands are in proper range before shifting.
82 .. _core-CallAndMessage:
84 core.CallAndMessage (C, C++, ObjC)
85 """"""""""""""""""""""""""""""""""
86  Check for logical errors for function calls and Objective-C message expressions (e.g., uninitialized arguments, null function pointers).
88 .. literalinclude:: checkers/callandmessage_example.c
89     :language: objc
91 .. _core-DivideZero:
93 core.DivideZero (C, C++, ObjC)
94 """"""""""""""""""""""""""""""
95  Check for division by zero.
97 .. literalinclude:: checkers/dividezero_example.c
98     :language: c
100 .. _core-NonNullParamChecker:
102 core.NonNullParamChecker (C, C++, ObjC)
103 """""""""""""""""""""""""""""""""""""""
104 Check for null pointers passed as arguments to a function whose arguments are references or marked with the 'nonnull' attribute.
106 .. code-block:: cpp
108  int f(int *p) __attribute__((nonnull));
110  void test(int *p) {
111    if (!p)
112      f(p); // warn
115 .. _core-NullDereference:
117 core.NullDereference (C, C++, ObjC)
118 """""""""""""""""""""""""""""""""""
119 Check for dereferences of null pointers.
121 This checker specifically does
122 not report null pointer dereferences for x86 and x86-64 targets when the
123 address space is 256 (x86 GS Segment), 257 (x86 FS Segment), or 258 (x86 SS
124 segment). See `X86/X86-64 Language Extensions
125 <https://clang.llvm.org/docs/LanguageExtensions.html#memory-references-to-specified-segments>`__
126 for reference.
128 The ``SuppressAddressSpaces`` option suppresses
129 warnings for null dereferences of all pointers with address spaces. You can
130 disable this behavior with the option
131 ``-analyzer-config core.NullDereference:SuppressAddressSpaces=false``.
132 *Defaults to true*.
134 .. code-block:: objc
136  // C
137  void test(int *p) {
138    if (p)
139      return;
141    int x = p[0]; // warn
144  // C
145  void test(int *p) {
146    if (!p)
147      *p = 0; // warn
150  // C++
151  class C {
152  public:
153    int x;
154  };
156  void test() {
157    C *pc = 0;
158    int k = pc->x; // warn
161  // Objective-C
162  @interface MyClass {
163  @public
164    int x;
166  @end
168  void test() {
169    MyClass *obj = 0;
170    obj->x = 1; // warn
173 .. _core-StackAddressEscape:
175 core.StackAddressEscape (C)
176 """""""""""""""""""""""""""
177 Check that addresses to stack memory do not escape the function.
179 .. code-block:: c
181  char const *p;
183  void test() {
184    char const str[] = "string";
185    p = str; // warn
188  void* test() {
189     return __builtin_alloca(12); // warn
192  void test() {
193    static int *x;
194    int y;
195    x = &y; // warn
199 .. _core-UndefinedBinaryOperatorResult:
201 core.UndefinedBinaryOperatorResult (C)
202 """"""""""""""""""""""""""""""""""""""
203 Check for undefined results of binary operators.
205 .. code-block:: c
207  void test() {
208    int x;
209    int y = x + 1; // warn: left operand is garbage
212 .. _core-VLASize:
214 core.VLASize (C)
215 """"""""""""""""
216 Check for declarations of Variable Length Arrays of undefined or zero size.
218  Check for declarations of VLA of undefined or zero size.
220 .. code-block:: c
222  void test() {
223    int x;
224    int vla1[x]; // warn: garbage as size
227  void test() {
228    int x = 0;
229    int vla2[x]; // warn: zero size
232 .. _core-uninitialized-ArraySubscript:
234 core.uninitialized.ArraySubscript (C)
235 """""""""""""""""""""""""""""""""""""
236 Check for uninitialized values used as array subscripts.
238 .. code-block:: c
240  void test() {
241    int i, a[10];
242    int x = a[i]; // warn: array subscript is undefined
245 .. _core-uninitialized-Assign:
247 core.uninitialized.Assign (C)
248 """""""""""""""""""""""""""""
249 Check for assigning uninitialized values.
251 .. code-block:: c
253  void test() {
254    int x;
255    x |= 1; // warn: left expression is uninitialized
258 .. _core-uninitialized-Branch:
260 core.uninitialized.Branch (C)
261 """""""""""""""""""""""""""""
262 Check for uninitialized values used as branch conditions.
264 .. code-block:: c
266  void test() {
267    int x;
268    if (x) // warn
269      return;
272 .. _core-uninitialized-CapturedBlockVariable:
274 core.uninitialized.CapturedBlockVariable (C)
275 """"""""""""""""""""""""""""""""""""""""""""
276 Check for blocks that capture uninitialized values.
278 .. code-block:: c
280  void test() {
281    int x;
282    ^{ int y = x; }(); // warn
285 .. _core-uninitialized-UndefReturn:
287 core.uninitialized.UndefReturn (C)
288 """"""""""""""""""""""""""""""""""
289 Check for uninitialized values being returned to the caller.
291 .. code-block:: c
293  int test() {
294    int x;
295    return x; // warn
298 .. _core-uninitialized-NewArraySize:
300 core.uninitialized.NewArraySize (C++)
301 """""""""""""""""""""""""""""""""""""
303 Check if the element count in new[] is garbage or undefined.
305 .. code-block:: cpp
307   void test() {
308     int n;
309     int *arr = new int[n]; // warn: Element count in new[] is a garbage value
310     delete[] arr;
311   }
314 .. _cplusplus-checkers:
317 cplusplus
318 ^^^^^^^^^
320 C++ Checkers.
322 .. _cplusplus-InnerPointer:
324 cplusplus.InnerPointer (C++)
325 """"""""""""""""""""""""""""
326 Check for inner pointers of C++ containers used after re/deallocation.
328 Many container methods in the C++ standard library are known to invalidate
329 "references" (including actual references, iterators and raw pointers) to
330 elements of the container. Using such references after they are invalidated
331 causes undefined behavior, which is a common source of memory errors in C++ that
332 this checker is capable of finding.
334 The checker is currently limited to ``std::string`` objects and doesn't
335 recognize some of the more sophisticated approaches to passing unowned pointers
336 around, such as ``std::string_view``.
338 .. code-block:: cpp
340  void deref_after_assignment() {
341    std::string s = "llvm";
342    const char *c = s.data(); // note: pointer to inner buffer of 'std::string' obtained here
343    s = "clang"; // note: inner buffer of 'std::string' reallocated by call to 'operator='
344    consume(c); // warn: inner pointer of container used after re/deallocation
347  const char *return_temp(int x) {
348    return std::to_string(x).c_str(); // warn: inner pointer of container used after re/deallocation
349    // note: pointer to inner buffer of 'std::string' obtained here
350    // note: inner buffer of 'std::string' deallocated by call to destructor
353 .. _cplusplus-NewDelete:
355 cplusplus.NewDelete (C++)
356 """""""""""""""""""""""""
357 Check for double-free and use-after-free problems. Traces memory managed by new/delete.
359 .. literalinclude:: checkers/newdelete_example.cpp
360     :language: cpp
362 .. _cplusplus-NewDeleteLeaks:
364 cplusplus.NewDeleteLeaks (C++)
365 """"""""""""""""""""""""""""""
366 Check for memory leaks. Traces memory managed by new/delete.
368 .. code-block:: cpp
370  void test() {
371    int *p = new int;
372  } // warn
374 .. _cplusplus-PlacementNew:
376 cplusplus.PlacementNew (C++)
377 """"""""""""""""""""""""""""
378 Check if default placement new is provided with pointers to sufficient storage capacity.
380 .. code-block:: cpp
382  #include <new>
384  void f() {
385    short s;
386    long *lp = ::new (&s) long; // warn
389 .. _cplusplus-SelfAssignment:
391 cplusplus.SelfAssignment (C++)
392 """"""""""""""""""""""""""""""
393 Checks C++ copy and move assignment operators for self assignment.
395 .. _cplusplus-StringChecker:
397 cplusplus.StringChecker (C++)
398 """""""""""""""""""""""""""""
399 Checks std::string operations.
401 Checks if the cstring pointer from which the ``std::string`` object is
402 constructed is ``NULL`` or not.
403 If the checker cannot reason about the nullness of the pointer it will assume
404 that it was non-null to satisfy the precondition of the constructor.
406 This checker is capable of checking the `SEI CERT C++ coding rule STR51-CPP.
407 Do not attempt to create a std::string from a null pointer
408 <https://wiki.sei.cmu.edu/confluence/x/E3s-BQ>`__.
410 .. code-block:: cpp
412  #include <string>
414  void f(const char *p) {
415    if (!p) {
416      std::string msg(p); // warn: The parameter must not be null
417    }
420 .. _deadcode-checkers:
422 deadcode
423 ^^^^^^^^
425 Dead Code Checkers.
427 .. _deadcode-DeadStores:
429 deadcode.DeadStores (C)
430 """""""""""""""""""""""
431 Check for values stored to variables that are never read afterwards.
433 .. code-block:: c
435  void test() {
436    int x;
437    x = 1; // warn
440 The ``WarnForDeadNestedAssignments`` option enables the checker to emit
441 warnings for nested dead assignments. You can disable with the
442 ``-analyzer-config deadcode.DeadStores:WarnForDeadNestedAssignments=false``.
443 *Defaults to true*.
445 Would warn for this e.g.:
446 if ((y = make_int())) {
449 .. _nullability-checkers:
451 nullability
452 ^^^^^^^^^^^
454 Objective C checkers that warn for null pointer passing and dereferencing errors.
456 .. _nullability-NullPassedToNonnull:
458 nullability.NullPassedToNonnull (ObjC)
459 """"""""""""""""""""""""""""""""""""""
460 Warns when a null pointer is passed to a pointer which has a _Nonnull type.
462 .. code-block:: objc
464  if (name != nil)
465    return;
466  // Warning: nil passed to a callee that requires a non-null 1st parameter
467  NSString *greeting = [@"Hello " stringByAppendingString:name];
469 .. _nullability-NullReturnedFromNonnull:
471 nullability.NullReturnedFromNonnull (ObjC)
472 """"""""""""""""""""""""""""""""""""""""""
473 Warns when a null pointer is returned from a function that has _Nonnull return type.
475 .. code-block:: objc
477  - (nonnull id)firstChild {
478    id result = nil;
479    if ([_children count] > 0)
480      result = _children[0];
482    // Warning: nil returned from a method that is expected
483    // to return a non-null value
484    return result;
487 .. _nullability-NullableDereferenced:
489 nullability.NullableDereferenced (ObjC)
490 """""""""""""""""""""""""""""""""""""""
491 Warns when a nullable pointer is dereferenced.
493 .. code-block:: objc
495  struct LinkedList {
496    int data;
497    struct LinkedList *next;
498  };
500  struct LinkedList * _Nullable getNext(struct LinkedList *l);
502  void updateNextData(struct LinkedList *list, int newData) {
503    struct LinkedList *next = getNext(list);
504    // Warning: Nullable pointer is dereferenced
505    next->data = 7;
508 .. _nullability-NullablePassedToNonnull:
510 nullability.NullablePassedToNonnull (ObjC)
511 """"""""""""""""""""""""""""""""""""""""""
512 Warns when a nullable pointer is passed to a pointer which has a _Nonnull type.
514 .. code-block:: objc
516  typedef struct Dummy { int val; } Dummy;
517  Dummy *_Nullable returnsNullable();
518  void takesNonnull(Dummy *_Nonnull);
520  void test() {
521    Dummy *p = returnsNullable();
522    takesNonnull(p); // warn
525 .. _nullability-NullableReturnedFromNonnull:
527 nullability.NullableReturnedFromNonnull (ObjC)
528 """"""""""""""""""""""""""""""""""""""""""""""
529 Warns when a nullable pointer is returned from a function that has _Nonnull return type.
531 .. _optin-checkers:
533 optin
534 ^^^^^
536 Checkers for portability, performance or coding style specific rules.
538 .. _optin-cplusplus-UninitializedObject:
540 optin.cplusplus.UninitializedObject (C++)
541 """""""""""""""""""""""""""""""""""""""""
543 This checker reports uninitialized fields in objects created after a constructor
544 call. It doesn't only find direct uninitialized fields, but rather makes a deep
545 inspection of the object, analyzing all of its fields' subfields.
546 The checker regards inherited fields as direct fields, so one will receive
547 warnings for uninitialized inherited data members as well.
549 .. code-block:: cpp
551  // With Pedantic and CheckPointeeInitialization set to true
553  struct A {
554    struct B {
555      int x; // note: uninitialized field 'this->b.x'
556      // note: uninitialized field 'this->bptr->x'
557      int y; // note: uninitialized field 'this->b.y'
558      // note: uninitialized field 'this->bptr->y'
559    };
560    int *iptr; // note: uninitialized pointer 'this->iptr'
561    B b;
562    B *bptr;
563    char *cptr; // note: uninitialized pointee 'this->cptr'
565    A (B *bptr, char *cptr) : bptr(bptr), cptr(cptr) {}
566  };
568  void f() {
569    A::B b;
570    char c;
571    A a(&b, &c); // warning: 6 uninitialized fields
572   //          after the constructor call
575  // With Pedantic set to false and
576  // CheckPointeeInitialization set to true
577  // (every field is uninitialized)
579  struct A {
580    struct B {
581      int x;
582      int y;
583    };
584    int *iptr;
585    B b;
586    B *bptr;
587    char *cptr;
589    A (B *bptr, char *cptr) : bptr(bptr), cptr(cptr) {}
590  };
592  void f() {
593    A::B b;
594    char c;
595    A a(&b, &c); // no warning
598  // With Pedantic set to true and
599  // CheckPointeeInitialization set to false
600  // (pointees are regarded as initialized)
602  struct A {
603    struct B {
604      int x; // note: uninitialized field 'this->b.x'
605      int y; // note: uninitialized field 'this->b.y'
606    };
607    int *iptr; // note: uninitialized pointer 'this->iptr'
608    B b;
609    B *bptr;
610    char *cptr;
612    A (B *bptr, char *cptr) : bptr(bptr), cptr(cptr) {}
613  };
615  void f() {
616    A::B b;
617    char c;
618    A a(&b, &c); // warning: 3 uninitialized fields
619   //          after the constructor call
623 **Options**
625 This checker has several options which can be set from command line (e.g.
626 ``-analyzer-config optin.cplusplus.UninitializedObject:Pedantic=true``):
628 * ``Pedantic`` (boolean). If to false, the checker won't emit warnings for
629   objects that don't have at least one initialized field. Defaults to false.
631 * ``NotesAsWarnings``  (boolean). If set to true, the checker will emit a
632   warning for each uninitialized field, as opposed to emitting one warning per
633   constructor call, and listing the uninitialized fields that belongs to it in
634   notes. *Defaults to false*.
636 * ``CheckPointeeInitialization`` (boolean). If set to false, the checker will
637   not analyze the pointee of pointer/reference fields, and will only check
638   whether the object itself is initialized. *Defaults to false*.
640 * ``IgnoreRecordsWithField`` (string). If supplied, the checker will not analyze
641   structures that have a field with a name or type name that matches  the given
642   pattern. *Defaults to ""*.
644 .. _optin-cplusplus-VirtualCall:
646 optin.cplusplus.VirtualCall (C++)
647 """""""""""""""""""""""""""""""""
648 Check virtual function calls during construction or destruction.
650 .. code-block:: cpp
652  class A {
653  public:
654    A() {
655      f(); // warn
656    }
657    virtual void f();
658  };
660  class A {
661  public:
662    ~A() {
663      this->f(); // warn
664    }
665    virtual void f();
666  };
668 .. _optin-mpi-MPI-Checker:
670 optin.mpi.MPI-Checker (C)
671 """""""""""""""""""""""""
672 Checks MPI code.
674 .. code-block:: c
676  void test() {
677    double buf = 0;
678    MPI_Request sendReq1;
679    MPI_Ireduce(MPI_IN_PLACE, &buf, 1, MPI_DOUBLE, MPI_SUM,
680        0, MPI_COMM_WORLD, &sendReq1);
681  } // warn: request 'sendReq1' has no matching wait.
683  void test() {
684    double buf = 0;
685    MPI_Request sendReq;
686    MPI_Isend(&buf, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &sendReq);
687    MPI_Irecv(&buf, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &sendReq); // warn
688    MPI_Isend(&buf, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &sendReq); // warn
689    MPI_Wait(&sendReq, MPI_STATUS_IGNORE);
692  void missingNonBlocking() {
693    int rank = 0;
694    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
695    MPI_Request sendReq1[10][10][10];
696    MPI_Wait(&sendReq1[1][7][9], MPI_STATUS_IGNORE); // warn
699 .. _optin-osx-cocoa-localizability-EmptyLocalizationContextChecker:
701 optin.osx.cocoa.localizability.EmptyLocalizationContextChecker (ObjC)
702 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
703 Check that NSLocalizedString macros include a comment for context.
705 .. code-block:: objc
707  - (void)test {
708    NSString *string = NSLocalizedString(@"LocalizedString", nil); // warn
709    NSString *string2 = NSLocalizedString(@"LocalizedString", @" "); // warn
710    NSString *string3 = NSLocalizedStringWithDefaultValue(
711      @"LocalizedString", nil, [[NSBundle alloc] init], nil,@""); // warn
714 .. _optin-osx-cocoa-localizability-NonLocalizedStringChecker:
716 optin.osx.cocoa.localizability.NonLocalizedStringChecker (ObjC)
717 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
718 Warns about uses of non-localized NSStrings passed to UI methods expecting localized NSStrings.
720 .. code-block:: objc
722  NSString *alarmText =
723    NSLocalizedString(@"Enabled", @"Indicates alarm is turned on");
724  if (!isEnabled) {
725    alarmText = @"Disabled";
727  UILabel *alarmStateLabel = [[UILabel alloc] init];
729  // Warning: User-facing text should use localized string macro
730  [alarmStateLabel setText:alarmText];
732 .. _optin-performance-GCDAntipattern:
734 optin.performance.GCDAntipattern
735 """"""""""""""""""""""""""""""""
736 Check for performance anti-patterns when using Grand Central Dispatch.
738 .. _optin-performance-Padding:
740 optin.performance.Padding
741 """""""""""""""""""""""""
742 Check for excessively padded structs.
744 .. _optin-portability-UnixAPI:
746 optin.portability.UnixAPI
747 """""""""""""""""""""""""
748 Finds implementation-defined behavior in UNIX/Posix functions.
751 .. _security-checkers:
753 security
754 ^^^^^^^^
756 Security related checkers.
758 .. _security-FloatLoopCounter:
760 security.FloatLoopCounter (C)
761 """""""""""""""""""""""""""""
762 Warn on using a floating point value as a loop counter (CERT: FLP30-C, FLP30-CPP).
764 .. code-block:: c
766  void test() {
767    for (float x = 0.1f; x <= 1.0f; x += 0.1f) {} // warn
770 .. _security-insecureAPI-UncheckedReturn:
772 security.insecureAPI.UncheckedReturn (C)
773 """"""""""""""""""""""""""""""""""""""""
774 Warn on uses of functions whose return values must be always checked.
776 .. code-block:: c
778  void test() {
779    setuid(1); // warn
782 .. _security-insecureAPI-bcmp:
784 security.insecureAPI.bcmp (C)
785 """""""""""""""""""""""""""""
786 Warn on uses of the 'bcmp' function.
788 .. code-block:: c
790  void test() {
791    bcmp(ptr0, ptr1, n); // warn
794 .. _security-insecureAPI-bcopy:
796 security.insecureAPI.bcopy (C)
797 """"""""""""""""""""""""""""""
798 Warn on uses of the 'bcopy' function.
800 .. code-block:: c
802  void test() {
803    bcopy(src, dst, n); // warn
806 .. _security-insecureAPI-bzero:
808 security.insecureAPI.bzero (C)
809 """"""""""""""""""""""""""""""
810 Warn on uses of the 'bzero' function.
812 .. code-block:: c
814  void test() {
815    bzero(ptr, n); // warn
818 .. _security-insecureAPI-getpw:
820 security.insecureAPI.getpw (C)
821 """"""""""""""""""""""""""""""
822 Warn on uses of the 'getpw' function.
824 .. code-block:: c
826  void test() {
827    char buff[1024];
828    getpw(2, buff); // warn
831 .. _security-insecureAPI-gets:
833 security.insecureAPI.gets (C)
834 """""""""""""""""""""""""""""
835 Warn on uses of the 'gets' function.
837 .. code-block:: c
839  void test() {
840    char buff[1024];
841    gets(buff); // warn
844 .. _security-insecureAPI-mkstemp:
846 security.insecureAPI.mkstemp (C)
847 """"""""""""""""""""""""""""""""
848 Warn when 'mkstemp' is passed fewer than 6 X's in the format string.
850 .. code-block:: c
852  void test() {
853    mkstemp("XX"); // warn
856 .. _security-insecureAPI-mktemp:
858 security.insecureAPI.mktemp (C)
859 """""""""""""""""""""""""""""""
860 Warn on uses of the ``mktemp`` function.
862 .. code-block:: c
864  void test() {
865    char *x = mktemp("/tmp/zxcv"); // warn: insecure, use mkstemp
868 .. _security-insecureAPI-rand:
870 security.insecureAPI.rand (C)
871 """""""""""""""""""""""""""""
872 Warn on uses of inferior random number generating functions (only if arc4random function is available):
873 ``drand48, erand48, jrand48, lcong48, lrand48, mrand48, nrand48, random, rand_r``.
875 .. code-block:: c
877  void test() {
878    random(); // warn
881 .. _security-insecureAPI-strcpy:
883 security.insecureAPI.strcpy (C)
884 """""""""""""""""""""""""""""""
885 Warn on uses of the ``strcpy`` and ``strcat`` functions.
887 .. code-block:: c
889  void test() {
890    char x[4];
891    char *y = "abcd";
893    strcpy(x, y); // warn
897 .. _security-insecureAPI-vfork:
899 security.insecureAPI.vfork (C)
900 """"""""""""""""""""""""""""""
901  Warn on uses of the 'vfork' function.
903 .. code-block:: c
905  void test() {
906    vfork(); // warn
909 .. _security-insecureAPI-DeprecatedOrUnsafeBufferHandling:
911 security.insecureAPI.DeprecatedOrUnsafeBufferHandling (C)
912 """""""""""""""""""""""""""""""""""""""""""""""""""""""""
913  Warn on occurrences of unsafe or deprecated buffer handling functions, which now have a secure variant: ``sprintf, vsprintf, scanf, wscanf, fscanf, fwscanf, vscanf, vwscanf, vfscanf, vfwscanf, sscanf, swscanf, vsscanf, vswscanf, swprintf, snprintf, vswprintf, vsnprintf, memcpy, memmove, strncpy, strncat, memset``
915 .. code-block:: c
917  void test() {
918    char buf [5];
919    strncpy(buf, "a", 1); // warn
922 .. _unix-checkers:
924 unix
925 ^^^^
926 POSIX/Unix checkers.
928 .. _unix-API:
930 unix.API (C)
931 """"""""""""
932 Check calls to various UNIX/Posix functions: ``open, pthread_once, calloc, malloc, realloc, alloca``.
934 .. literalinclude:: checkers/unix_api_example.c
935     :language: c
937 .. _unix-Malloc:
939 unix.Malloc (C)
940 """""""""""""""
941 Check for memory leaks, double free, and use-after-free problems. Traces memory managed by malloc()/free().
943 .. literalinclude:: checkers/unix_malloc_example.c
944     :language: c
946 .. _unix-MallocSizeof:
948 unix.MallocSizeof (C)
949 """""""""""""""""""""
950 Check for dubious ``malloc`` arguments involving ``sizeof``.
952 .. code-block:: c
954  void test() {
955    long *p = malloc(sizeof(short));
956      // warn: result is converted to 'long *', which is
957      // incompatible with operand type 'short'
958    free(p);
961 .. _unix-MismatchedDeallocator:
963 unix.MismatchedDeallocator (C, C++)
964 """""""""""""""""""""""""""""""""""
965 Check for mismatched deallocators.
967 .. literalinclude:: checkers/mismatched_deallocator_example.cpp
968     :language: c
970 .. _unix-Vfork:
972 unix.Vfork (C)
973 """"""""""""""
974 Check for proper usage of ``vfork``.
976 .. code-block:: c
978  int test(int x) {
979    pid_t pid = vfork(); // warn
980    if (pid != 0)
981      return 0;
983    switch (x) {
984    case 0:
985      pid = 1;
986      execl("", "", 0);
987      _exit(1);
988      break;
989    case 1:
990      x = 0; // warn: this assignment is prohibited
991      break;
992    case 2:
993      foo(); // warn: this function call is prohibited
994      break;
995    default:
996      return 0; // warn: return is prohibited
997    }
999    while(1);
1002 .. _unix-cstring-BadSizeArg:
1004 unix.cstring.BadSizeArg (C)
1005 """""""""""""""""""""""""""
1006 Check the size argument passed into C string functions for common erroneous patterns. Use ``-Wno-strncat-size`` compiler option to mute other ``strncat``-related compiler warnings.
1008 .. code-block:: c
1010  void test() {
1011    char dest[3];
1012    strncat(dest, """""""""""""""""""""""""*", sizeof(dest));
1013      // warn: potential buffer overflow
1016 .. _unix-cstring-NullArg:
1018 unix.cstring.NullArg (C)
1019 """"""""""""""""""""""""
1020 Check for null pointers being passed as arguments to C string functions:
1021 ``strlen, strnlen, strcpy, strncpy, strcat, strncat, strcmp, strncmp, strcasecmp, strncasecmp, wcslen, wcsnlen``.
1023 .. code-block:: c
1025  int test() {
1026    return strlen(0); // warn
1029 .. _unix-StdCLibraryFunctions:
1031 unix.StdCLibraryFunctions (C)
1032 """""""""""""""""""""""""""""
1033 Check for calls of standard library functions that violate predefined argument
1034 constraints. For example, according to the C standard the behavior of function
1035 ``int isalnum(int ch)`` is undefined if the value of ``ch`` is not representable
1036 as ``unsigned char`` and is not equal to ``EOF``.
1038 You can think of this checker as defining restrictions (pre- and postconditions)
1039 on standard library functions. Preconditions are checked, and when they are
1040 violated, a warning is emitted. Postconditions are added to the analysis, e.g.
1041 that the return value of a function is not greater than 255. Preconditions are
1042 added to the analysis too, in the case when the affected values are not known
1043 before the call.
1045 For example, if an argument to a function must be in between 0 and 255, but the
1046 value of the argument is unknown, the analyzer will assume that it is in this
1047 interval. Similarly, if a function mustn't be called with a null pointer and the
1048 analyzer cannot prove that it is null, then it will assume that it is non-null.
1050 These are the possible checks on the values passed as function arguments:
1051  - The argument has an allowed range (or multiple ranges) of values. The checker
1052    can detect if a passed value is outside of the allowed range and show the
1053    actual and allowed values.
1054  - The argument has pointer type and is not allowed to be null pointer. Many
1055    (but not all) standard functions can produce undefined behavior if a null
1056    pointer is passed, these cases can be detected by the checker.
1057  - The argument is a pointer to a memory block and the minimal size of this
1058    buffer is determined by another argument to the function, or by
1059    multiplication of two arguments (like at function ``fread``), or is a fixed
1060    value (for example ``asctime_r`` requires at least a buffer of size 26). The
1061    checker can detect if the buffer size is too small and in optimal case show
1062    the size of the buffer and the values of the corresponding arguments.
1064 .. code-block:: c
1066   #define EOF -1
1067   void test_alnum_concrete(int v) {
1068     int ret = isalnum(256); // \
1069     // warning: Function argument outside of allowed range
1070     (void)ret;
1071   }
1073   void buffer_size_violation(FILE *file) {
1074     enum { BUFFER_SIZE = 1024 };
1075     wchar_t wbuf[BUFFER_SIZE];
1077     const size_t size = sizeof(*wbuf);   // 4
1078     const size_t nitems = sizeof(wbuf);  // 4096
1080     // Below we receive a warning because the 3rd parameter should be the
1081     // number of elements to read, not the size in bytes. This case is a known
1082     // vulnerability described by the ARR38-C SEI-CERT rule.
1083     fread(wbuf, size, nitems, file);
1084   }
1086   int test_alnum_symbolic(int x) {
1087     int ret = isalnum(x);
1088     // after the call, ret is assumed to be in the range [-1, 255]
1090     if (ret > 255)      // impossible (infeasible branch)
1091       if (x == 0)
1092         return ret / x; // division by zero is not reported
1093     return ret;
1094   }
1096 Additionally to the argument and return value conditions, this checker also adds
1097 state of the value ``errno`` if applicable to the analysis. Many system
1098 functions set the ``errno`` value only if an error occurs (together with a
1099 specific return value of the function), otherwise it becomes undefined. This
1100 checker changes the analysis state to contain such information. This data is
1101 used by other checkers, for example :ref:`alpha-unix-Errno`.
1103 **Limitations**
1105 The checker can not always provide notes about the values of the arguments.
1106 Without this information it is hard to confirm if the constraint is indeed
1107 violated. The argument values are shown if they are known constants or the value
1108 is determined by previous (not too complicated) assumptions.
1110 The checker can produce false positives in cases such as if the program has
1111 invariants not known to the analyzer engine or the bug report path contains
1112 calls to unknown functions. In these cases the analyzer fails to detect the real
1113 range of the argument.
1115 **Parameters**
1117 The checker models functions (and emits diagnostics) from the C standard by
1118 default. The ``ModelPOSIX`` option enables modeling (and emit diagnostics) of
1119 additional functions that are defined in the POSIX standard. This option is
1120 disabled by default.
1122 .. _osx-checkers:
1126 macOS checkers.
1128 .. _osx-API:
1130 osx.API (C)
1131 """""""""""
1132 Check for proper uses of various Apple APIs.
1134 .. code-block:: objc
1136  void test() {
1137    dispatch_once_t pred = 0;
1138    dispatch_once(&pred, ^(){}); // warn: dispatch_once uses local
1141 .. _osx-NumberObjectConversion:
1143 osx.NumberObjectConversion (C, C++, ObjC)
1144 """""""""""""""""""""""""""""""""""""""""
1145 Check for erroneous conversions of objects representing numbers into numbers.
1147 .. code-block:: objc
1149  NSNumber *photoCount = [albumDescriptor objectForKey:@"PhotoCount"];
1150  // Warning: Comparing a pointer value of type 'NSNumber *'
1151  // to a scalar integer value
1152  if (photoCount > 0) {
1153    [self displayPhotos];
1156 .. _osx-ObjCProperty:
1158 osx.ObjCProperty (ObjC)
1159 """""""""""""""""""""""
1160 Check for proper uses of Objective-C properties.
1162 .. code-block:: objc
1164  NSNumber *photoCount = [albumDescriptor objectForKey:@"PhotoCount"];
1165  // Warning: Comparing a pointer value of type 'NSNumber *'
1166  // to a scalar integer value
1167  if (photoCount > 0) {
1168    [self displayPhotos];
1172 .. _osx-SecKeychainAPI:
1174 osx.SecKeychainAPI (C)
1175 """"""""""""""""""""""
1176 Check for proper uses of Secure Keychain APIs.
1178 .. literalinclude:: checkers/seckeychainapi_example.m
1179     :language: objc
1181 .. _osx-cocoa-AtSync:
1183 osx.cocoa.AtSync (ObjC)
1184 """""""""""""""""""""""
1185 Check for nil pointers used as mutexes for @synchronized.
1187 .. code-block:: objc
1189  void test(id x) {
1190    if (!x)
1191      @synchronized(x) {} // warn: nil value used as mutex
1194  void test() {
1195    id y;
1196    @synchronized(y) {} // warn: uninitialized value used as mutex
1199 .. _osx-cocoa-AutoreleaseWrite:
1201 osx.cocoa.AutoreleaseWrite
1202 """"""""""""""""""""""""""
1203 Warn about potentially crashing writes to autoreleasing objects from different autoreleasing pools in Objective-C.
1205 .. _osx-cocoa-ClassRelease:
1207 osx.cocoa.ClassRelease (ObjC)
1208 """""""""""""""""""""""""""""
1209 Check for sending 'retain', 'release', or 'autorelease' directly to a Class.
1211 .. code-block:: objc
1213  @interface MyClass : NSObject
1214  @end
1216  void test(void) {
1217    [MyClass release]; // warn
1220 .. _osx-cocoa-Dealloc:
1222 osx.cocoa.Dealloc (ObjC)
1223 """"""""""""""""""""""""
1224 Warn about Objective-C classes that lack a correct implementation of -dealloc
1226 .. literalinclude:: checkers/dealloc_example.m
1227     :language: objc
1229 .. _osx-cocoa-IncompatibleMethodTypes:
1231 osx.cocoa.IncompatibleMethodTypes (ObjC)
1232 """"""""""""""""""""""""""""""""""""""""
1233 Warn about Objective-C method signatures with type incompatibilities.
1235 .. code-block:: objc
1237  @interface MyClass1 : NSObject
1238  - (int)foo;
1239  @end
1241  @implementation MyClass1
1242  - (int)foo { return 1; }
1243  @end
1245  @interface MyClass2 : MyClass1
1246  - (float)foo;
1247  @end
1249  @implementation MyClass2
1250  - (float)foo { return 1.0; } // warn
1251  @end
1253 .. _osx-cocoa-Loops:
1255 osx.cocoa.Loops
1256 """""""""""""""
1257 Improved modeling of loops using Cocoa collection types.
1259 .. _osx-cocoa-MissingSuperCall:
1261 osx.cocoa.MissingSuperCall (ObjC)
1262 """""""""""""""""""""""""""""""""
1263 Warn about Objective-C methods that lack a necessary call to super.
1265 .. code-block:: objc
1267  @interface Test : UIViewController
1268  @end
1269  @implementation test
1270  - (void)viewDidLoad {} // warn
1271  @end
1274 .. _osx-cocoa-NSAutoreleasePool:
1276 osx.cocoa.NSAutoreleasePool (ObjC)
1277 """"""""""""""""""""""""""""""""""
1278 Warn for suboptimal uses of NSAutoreleasePool in Objective-C GC mode.
1280 .. code-block:: objc
1282  void test() {
1283    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
1284    [pool release]; // warn
1287 .. _osx-cocoa-NSError:
1289 osx.cocoa.NSError (ObjC)
1290 """"""""""""""""""""""""
1291 Check usage of NSError parameters.
1293 .. code-block:: objc
1295  @interface A : NSObject
1296  - (void)foo:(NSError """""""""""""""""""""""")error;
1297  @end
1299  @implementation A
1300  - (void)foo:(NSError """""""""""""""""""""""")error {
1301    // warn: method accepting NSError"""""""""""""""""""""""" should have a non-void
1302    // return value
1304  @end
1306  @interface A : NSObject
1307  - (BOOL)foo:(NSError """""""""""""""""""""""")error;
1308  @end
1310  @implementation A
1311  - (BOOL)foo:(NSError """""""""""""""""""""""")error {
1312    *error = 0; // warn: potential null dereference
1313    return 0;
1315  @end
1317 .. _osx-cocoa-NilArg:
1319 osx.cocoa.NilArg (ObjC)
1320 """""""""""""""""""""""
1321 Check for prohibited nil arguments to ObjC method calls.
1323  - caseInsensitiveCompare:
1324  - compare:
1325  - compare:options:
1326  - compare:options:range:
1327  - compare:options:range:locale:
1328  - componentsSeparatedByCharactersInSet:
1329  - initWithFormat:
1331 .. code-block:: objc
1333  NSComparisonResult test(NSString *s) {
1334    NSString *aString = nil;
1335    return [s caseInsensitiveCompare:aString];
1336      // warn: argument to 'NSString' method
1337      // 'caseInsensitiveCompare:' cannot be nil
1341 .. _osx-cocoa-NonNilReturnValue:
1343 osx.cocoa.NonNilReturnValue
1344 """""""""""""""""""""""""""
1345 Models the APIs that are guaranteed to return a non-nil value.
1347 .. _osx-cocoa-ObjCGenerics:
1349 osx.cocoa.ObjCGenerics (ObjC)
1350 """""""""""""""""""""""""""""
1351 Check for type errors when using Objective-C generics.
1353 .. code-block:: objc
1355  NSMutableArray *names = [NSMutableArray array];
1356  NSMutableArray *birthDates = names;
1358  // Warning: Conversion from value of type 'NSDate *'
1359  // to incompatible type 'NSString *'
1360  [birthDates addObject: [NSDate date]];
1362 .. _osx-cocoa-RetainCount:
1364 osx.cocoa.RetainCount (ObjC)
1365 """"""""""""""""""""""""""""
1366 Check for leaks and improper reference count management
1368 .. code-block:: objc
1370  void test() {
1371    NSString *s = [[NSString alloc] init]; // warn
1374  CFStringRef test(char *bytes) {
1375    return CFStringCreateWithCStringNoCopy(
1376             0, bytes, NSNEXTSTEPStringEncoding, 0); // warn
1380 .. _osx-cocoa-RunLoopAutoreleaseLeak:
1382 osx.cocoa.RunLoopAutoreleaseLeak
1383 """"""""""""""""""""""""""""""""
1384 Check for leaked memory in autorelease pools that will never be drained.
1386 .. _osx-cocoa-SelfInit:
1388 osx.cocoa.SelfInit (ObjC)
1389 """""""""""""""""""""""""
1390 Check that 'self' is properly initialized inside an initializer method.
1392 .. code-block:: objc
1394  @interface MyObj : NSObject {
1395    id x;
1397  - (id)init;
1398  @end
1400  @implementation MyObj
1401  - (id)init {
1402    [super init];
1403    x = 0; // warn: instance variable used while 'self' is not
1404           // initialized
1405    return 0;
1407  @end
1409  @interface MyObj : NSObject
1410  - (id)init;
1411  @end
1413  @implementation MyObj
1414  - (id)init {
1415    [super init];
1416    return self; // warn: returning uninitialized 'self'
1418  @end
1420 .. _osx-cocoa-SuperDealloc:
1422 osx.cocoa.SuperDealloc (ObjC)
1423 """""""""""""""""""""""""""""
1424 Warn about improper use of '[super dealloc]' in Objective-C.
1426 .. code-block:: objc
1428  @interface SuperDeallocThenReleaseIvarClass : NSObject {
1429    NSObject *_ivar;
1431  @end
1433  @implementation SuperDeallocThenReleaseIvarClass
1434  - (void)dealloc {
1435    [super dealloc];
1436    [_ivar release]; // warn
1438  @end
1440 .. _osx-cocoa-UnusedIvars:
1442 osx.cocoa.UnusedIvars (ObjC)
1443 """"""""""""""""""""""""""""
1444 Warn about private ivars that are never used.
1446 .. code-block:: objc
1448  @interface MyObj : NSObject {
1449  @private
1450    id x; // warn
1452  @end
1454  @implementation MyObj
1455  @end
1457 .. _osx-cocoa-VariadicMethodTypes:
1459 osx.cocoa.VariadicMethodTypes (ObjC)
1460 """"""""""""""""""""""""""""""""""""
1461 Check for passing non-Objective-C types to variadic collection
1462 initialization methods that expect only Objective-C types.
1464 .. code-block:: objc
1466  void test() {
1467    [NSSet setWithObjects:@"Foo", "Bar", nil];
1468      // warn: argument should be an ObjC pointer type, not 'char *'
1471 .. _osx-coreFoundation-CFError:
1473 osx.coreFoundation.CFError (C)
1474 """"""""""""""""""""""""""""""
1475 Check usage of CFErrorRef* parameters
1477 .. code-block:: c
1479  void test(CFErrorRef *error) {
1480    // warn: function accepting CFErrorRef* should have a
1481    // non-void return
1484  int foo(CFErrorRef *error) {
1485    *error = 0; // warn: potential null dereference
1486    return 0;
1489 .. _osx-coreFoundation-CFNumber:
1491 osx.coreFoundation.CFNumber (C)
1492 """""""""""""""""""""""""""""""
1493 Check for proper uses of CFNumber APIs.
1495 .. code-block:: c
1497  CFNumberRef test(unsigned char x) {
1498    return CFNumberCreate(0, kCFNumberSInt16Type, &x);
1499     // warn: 8 bit integer is used to initialize a 16 bit integer
1502 .. _osx-coreFoundation-CFRetainRelease:
1504 osx.coreFoundation.CFRetainRelease (C)
1505 """"""""""""""""""""""""""""""""""""""
1506 Check for null arguments to CFRetain/CFRelease/CFMakeCollectable.
1508 .. code-block:: c
1510  void test(CFTypeRef p) {
1511    if (!p)
1512      CFRetain(p); // warn
1515  void test(int x, CFTypeRef p) {
1516    if (p)
1517      return;
1519    CFRelease(p); // warn
1522 .. _osx-coreFoundation-containers-OutOfBounds:
1524 osx.coreFoundation.containers.OutOfBounds (C)
1525 """""""""""""""""""""""""""""""""""""""""""""
1526 Checks for index out-of-bounds when using 'CFArray' API.
1528 .. code-block:: c
1530  void test() {
1531    CFArrayRef A = CFArrayCreate(0, 0, 0, &kCFTypeArrayCallBacks);
1532    CFArrayGetValueAtIndex(A, 0); // warn
1535 .. _osx-coreFoundation-containers-PointerSizedValues:
1537 osx.coreFoundation.containers.PointerSizedValues (C)
1538 """"""""""""""""""""""""""""""""""""""""""""""""""""
1539 Warns if 'CFArray', 'CFDictionary', 'CFSet' are created with non-pointer-size values.
1541 .. code-block:: c
1543  void test() {
1544    int x[] = { 1 };
1545    CFArrayRef A = CFArrayCreate(0, (const void """""""""""""""""""""""")x, 1,
1546                                 &kCFTypeArrayCallBacks); // warn
1549 Fuchsia
1550 ^^^^^^^
1552 Fuchsia is an open source capability-based operating system currently being
1553 developed by Google. This section describes checkers that can find various
1554 misuses of Fuchsia APIs.
1556 .. _fuchsia-HandleChecker:
1558 fuchsia.HandleChecker
1559 """"""""""""""""""""""""""""
1560 Handles identify resources. Similar to pointers they can be leaked,
1561 double freed, or use after freed. This check attempts to find such problems.
1563 .. code-block:: cpp
1565  void checkLeak08(int tag) {
1566    zx_handle_t sa, sb;
1567    zx_channel_create(0, &sa, &sb);
1568    if (tag)
1569      zx_handle_close(sa);
1570    use(sb); // Warn: Potential leak of handle
1571    zx_handle_close(sb);
1574 WebKit
1575 ^^^^^^
1577 WebKit is an open-source web browser engine available for macOS, iOS and Linux.
1578 This section describes checkers that can find issues in WebKit codebase.
1580 Most of the checkers focus on memory management for which WebKit uses custom implementation of reference counted smartpointers.
1582 Checkers are formulated in terms related to ref-counting:
1583  - *Ref-counted type* is either ``Ref<T>`` or ``RefPtr<T>``.
1584  - *Ref-countable type* is any type that implements ``ref()`` and ``deref()`` methods as ``RefPtr<>`` is a template (i. e. relies on duck typing).
1585  - *Uncounted type* is ref-countable but not ref-counted type.
1587 .. _webkit-RefCntblBaseVirtualDtor:
1589 webkit.RefCntblBaseVirtualDtor
1590 """"""""""""""""""""""""""""""""""""
1591 All uncounted types used as base classes must have a virtual destructor.
1593 Ref-counted types hold their ref-countable data by a raw pointer and allow implicit upcasting from ref-counted pointer to derived type to ref-counted pointer to base type. This might lead to an object of (dynamic) derived type being deleted via pointer to the base class type which C++ standard defines as UB in case the base class doesn't have virtual destructor ``[expr.delete]``.
1595 .. code-block:: cpp
1597  struct RefCntblBase {
1598    void ref() {}
1599    void deref() {}
1600  };
1602  struct Derived : RefCntblBase { }; // warn
1604 .. _webkit-NoUncountedMemberChecker:
1606 webkit.NoUncountedMemberChecker
1607 """""""""""""""""""""""""""""""""""""
1608 Raw pointers and references to uncounted types can't be used as class members. Only ref-counted types are allowed.
1610 .. code-block:: cpp
1612  struct RefCntbl {
1613    void ref() {}
1614    void deref() {}
1615  };
1617  struct Foo {
1618    RefCntbl * ptr; // warn
1619    RefCntbl & ptr; // warn
1620    // ...
1621  };
1623 .. _webkit-UncountedLambdaCapturesChecker:
1625 webkit.UncountedLambdaCapturesChecker
1626 """""""""""""""""""""""""""""""""""""
1627 Raw pointers and references to uncounted types can't be captured in lambdas. Only ref-counted types are allowed.
1629 .. code-block:: cpp
1631  struct RefCntbl {
1632    void ref() {}
1633    void deref() {}
1634  };
1636  void foo(RefCntbl* a, RefCntbl& b) {
1637    [&, a](){ // warn about 'a'
1638      do_something(b); // warn about 'b'
1639    };
1640  };
1642 .. _alpha-checkers:
1644 Experimental Checkers
1645 ---------------------
1647 *These are checkers with known issues or limitations that keep them from being on by default. They are likely to have false positives. Bug reports and especially patches are welcome.*
1649 alpha.clone
1650 ^^^^^^^^^^^
1652 .. _alpha-clone-CloneChecker:
1654 alpha.clone.CloneChecker (C, C++, ObjC)
1655 """""""""""""""""""""""""""""""""""""""
1656 Reports similar pieces of code.
1658 .. code-block:: c
1660  void log();
1662  int max(int a, int b) { // warn
1663    log();
1664    if (a > b)
1665      return a;
1666    return b;
1669  int maxClone(int x, int y) { // similar code here
1670    log();
1671    if (x > y)
1672      return x;
1673    return y;
1676 alpha.core
1677 ^^^^^^^^^^
1679 .. _alpha-core-BoolAssignment:
1681 alpha.core.BoolAssignment (ObjC)
1682 """"""""""""""""""""""""""""""""
1683 Warn about assigning non-{0,1} values to boolean variables.
1685 .. code-block:: objc
1687  void test() {
1688    BOOL b = -1; // warn
1691 .. _alpha-core-C11Lock:
1693 alpha.core.C11Lock
1694 """"""""""""""""""
1695 Similarly to :ref:`alpha.unix.PthreadLock <alpha-unix-PthreadLock>`, checks for
1696 the locking/unlocking of ``mtx_t`` mutexes.
1698 .. code-block:: cpp
1700  mtx_t mtx1;
1702  void bad1(void)
1704    mtx_lock(&mtx1);
1705    mtx_lock(&mtx1); // warn: This lock has already been acquired
1708 .. _alpha-core-CallAndMessageUnInitRefArg:
1710 alpha.core.CallAndMessageUnInitRefArg (C,C++, ObjC)
1711 """""""""""""""""""""""""""""""""""""""""""""""""""
1712 Check for logical errors for function calls and Objective-C
1713 message expressions (e.g., uninitialized arguments, null function pointers, and pointer to undefined variables).
1715 .. code-block:: c
1717  void test(void) {
1718    int t;
1719    int &p = t;
1720    int &s = p;
1721    int &q = s;
1722    foo(q); // warn
1725  void test(void) {
1726    int x;
1727    foo(&x); // warn
1730 .. _alpha-core-CastSize:
1732 alpha.core.CastSize (C)
1733 """""""""""""""""""""""
1734 Check when casting a malloc'ed type ``T``, whether the size is a multiple of the size of ``T``.
1736 .. code-block:: c
1738  void test() {
1739    int *x = (int *) malloc(11); // warn
1742 .. _alpha-core-CastToStruct:
1744 alpha.core.CastToStruct (C, C++)
1745 """"""""""""""""""""""""""""""""
1746 Check for cast from non-struct pointer to struct pointer.
1748 .. code-block:: cpp
1750  // C
1751  struct s {};
1753  void test(int *p) {
1754    struct s *ps = (struct s *) p; // warn
1757  // C++
1758  class c {};
1760  void test(int *p) {
1761    c *pc = (c *) p; // warn
1764 .. _alpha-core-Conversion:
1766 alpha.core.Conversion (C, C++, ObjC)
1767 """"""""""""""""""""""""""""""""""""
1768 Loss of sign/precision in implicit conversions.
1770 .. code-block:: c
1772  void test(unsigned U, signed S) {
1773    if (S > 10) {
1774      if (U < S) {
1775      }
1776    }
1777    if (S < -10) {
1778      if (U < S) { // warn (loss of sign)
1779      }
1780    }
1783  void test() {
1784    long long A = 1LL << 60;
1785    short X = A; // warn (loss of precision)
1788 .. _alpha-core-DynamicTypeChecker:
1790 alpha.core.DynamicTypeChecker (ObjC)
1791 """"""""""""""""""""""""""""""""""""
1792 Check for cases where the dynamic and the static type of an object are unrelated.
1795 .. code-block:: objc
1797  id date = [NSDate date];
1799  // Warning: Object has a dynamic type 'NSDate *' which is
1800  // incompatible with static type 'NSNumber *'"
1801  NSNumber *number = date;
1802  [number doubleValue];
1804 .. _alpha-core-FixedAddr:
1806 alpha.core.FixedAddr (C)
1807 """"""""""""""""""""""""
1808 Check for assignment of a fixed address to a pointer.
1810 .. code-block:: c
1812  void test() {
1813    int *p;
1814    p = (int *) 0x10000; // warn
1817 .. _alpha-core-IdenticalExpr:
1819 alpha.core.IdenticalExpr (C, C++)
1820 """""""""""""""""""""""""""""""""
1821 Warn about unintended use of identical expressions in operators.
1823 .. code-block:: cpp
1825  // C
1826  void test() {
1827    int a = 5;
1828    int b = a | 4 | a; // warn: identical expr on both sides
1831  // C++
1832  bool f(void);
1834  void test(bool b) {
1835    int i = 10;
1836    if (f()) { // warn: true and false branches are identical
1837      do {
1838        i--;
1839      } while (f());
1840    } else {
1841      do {
1842        i--;
1843      } while (f());
1844    }
1847 .. _alpha-core-PointerArithm:
1849 alpha.core.PointerArithm (C)
1850 """"""""""""""""""""""""""""
1851 Check for pointer arithmetic on locations other than array elements.
1853 .. code-block:: c
1855  void test() {
1856    int x;
1857    int *p;
1858    p = &x + 1; // warn
1861 .. _alpha-core-PointerSub:
1863 alpha.core.PointerSub (C)
1864 """""""""""""""""""""""""
1865 Check for pointer subtractions on two pointers pointing to different memory chunks.
1867 .. code-block:: c
1869  void test() {
1870    int x, y;
1871    int d = &y - &x; // warn
1874 .. _alpha-core-SizeofPtr:
1876 alpha.core.SizeofPtr (C)
1877 """"""""""""""""""""""""
1878 Warn about unintended use of ``sizeof()`` on pointer expressions.
1880 .. code-block:: c
1882  struct s {};
1884  int test(struct s *p) {
1885    return sizeof(p);
1886      // warn: sizeof(ptr) can produce an unexpected result
1889 .. _alpha-core-StackAddressAsyncEscape:
1891 alpha.core.StackAddressAsyncEscape (C)
1892 """"""""""""""""""""""""""""""""""""""
1893 Check that addresses to stack memory do not escape the function that involves dispatch_after or dispatch_async.
1894 This checker is a part of ``core.StackAddressEscape``, but is temporarily disabled until some false positives are fixed.
1896 .. code-block:: c
1898  dispatch_block_t test_block_inside_block_async_leak() {
1899    int x = 123;
1900    void (^inner)(void) = ^void(void) {
1901      int y = x;
1902      ++y;
1903    };
1904    void (^outer)(void) = ^void(void) {
1905      int z = x;
1906      ++z;
1907      inner();
1908    };
1909    return outer; // warn: address of stack-allocated block is captured by a
1910                  //       returned block
1913 .. _alpha-core-TestAfterDivZero:
1915 alpha.core.TestAfterDivZero (C)
1916 """""""""""""""""""""""""""""""
1917 Check for division by variable that is later compared against 0.
1918 Either the comparison is useless or there is division by zero.
1920 .. code-block:: c
1922  void test(int x) {
1923    var = 77 / x;
1924    if (x == 0) { } // warn
1927 alpha.cplusplus
1928 ^^^^^^^^^^^^^^^
1930 .. _alpha-cplusplus-ArrayDelete:
1932 alpha.cplusplus.ArrayDelete (C++)
1933 """""""""""""""""""""""""""""""""
1934 Reports destructions of arrays of polymorphic objects that are destructed as their base class.
1935 This checker corresponds to the CERT rule `EXP51-CPP: Do not delete an array through a pointer of the incorrect type <https://wiki.sei.cmu.edu/confluence/display/cplusplus/EXP51-CPP.+Do+not+delete+an+array+through+a+pointer+of+the+incorrect+type>`_.
1937 .. code-block:: cpp
1939  class Base {
1940    virtual ~Base() {}
1941  };
1942  class Derived : public Base {}
1944  Base *create() {
1945    Base *x = new Derived[10]; // note: Casting from 'Derived' to 'Base' here
1946    return x;
1949  void foo() {
1950    Base *x = create();
1951    delete[] x; // warn: Deleting an array of 'Derived' objects as their base class 'Base' is undefined
1954 .. _alpha-cplusplus-DeleteWithNonVirtualDtor:
1956 alpha.cplusplus.DeleteWithNonVirtualDtor (C++)
1957 """"""""""""""""""""""""""""""""""""""""""""""
1958 Reports destructions of polymorphic objects with a non-virtual destructor in their base class.
1960 .. code-block:: cpp
1962  class NonVirtual {};
1963  class NVDerived : public NonVirtual {};
1965  NonVirtual *create() {
1966    NonVirtual *x = new NVDerived(); // note: Casting from 'NVDerived' to
1967                                     //       'NonVirtual' here
1968    return x;
1971  void foo() {
1972    NonVirtual *x = create();
1973    delete x; // warn: destruction of a polymorphic object with no virtual
1974              //       destructor
1977 .. _alpha-cplusplus-EnumCastOutOfRange:
1979 alpha.cplusplus.EnumCastOutOfRange (C++)
1980 """"""""""""""""""""""""""""""""""""""""
1981 Check for integer to enumeration casts that could result in undefined values.
1983 .. code-block:: cpp
1985  enum TestEnum {
1986    A = 0
1987  };
1989  void foo() {
1990    TestEnum t = static_cast(-1);
1991        // warn: the value provided to the cast expression is not in
1992        //       the valid range of values for the enum
1994 .. _alpha-cplusplus-InvalidatedIterator:
1996 alpha.cplusplus.InvalidatedIterator (C++)
1997 """""""""""""""""""""""""""""""""""""""""
1998 Check for use of invalidated iterators.
2000 .. code-block:: cpp
2002  void bad_copy_assign_operator_list1(std::list &L1,
2003                                      const std::list &L2) {
2004    auto i0 = L1.cbegin();
2005    L1 = L2;
2006    *i0; // warn: invalidated iterator accessed
2010 .. _alpha-cplusplus-IteratorRange:
2012 alpha.cplusplus.IteratorRange (C++)
2013 """""""""""""""""""""""""""""""""""
2014 Check for iterators used outside their valid ranges.
2016 .. code-block:: cpp
2018  void simple_bad_end(const std::vector &v) {
2019    auto i = v.end();
2020    *i; // warn: iterator accessed outside of its range
2023 .. _alpha-cplusplus-MismatchedIterator:
2025 alpha.cplusplus.MismatchedIterator (C++)
2026 """"""""""""""""""""""""""""""""""""""""
2027 Check for use of iterators of different containers where iterators of the same container are expected.
2029 .. code-block:: cpp
2031  void bad_insert3(std::vector &v1, std::vector &v2) {
2032    v2.insert(v1.cbegin(), v2.cbegin(), v2.cend()); // warn: container accessed
2033                                                    //       using foreign
2034                                                    //       iterator argument
2035    v1.insert(v1.cbegin(), v1.cbegin(), v2.cend()); // warn: iterators of
2036                                                    //       different containers
2037                                                    //       used where the same
2038                                                    //       container is
2039                                                    //       expected
2040    v1.insert(v1.cbegin(), v2.cbegin(), v1.cend()); // warn: iterators of
2041                                                    //       different containers
2042                                                    //       used where the same
2043                                                    //       container is
2044                                                    //       expected
2047 .. _alpha-cplusplus-MisusedMovedObject:
2049 alpha.cplusplus.MisusedMovedObject (C++)
2050 """"""""""""""""""""""""""""""""""""""""
2051 Method calls on a moved-from object and copying a moved-from object will be reported.
2054 .. code-block:: cpp
2056   struct A {
2057    void foo() {}
2058  };
2060  void f() {
2061    A a;
2062    A b = std::move(a); // note: 'a' became 'moved-from' here
2063    a.foo();            // warn: method call on a 'moved-from' object 'a'
2066 .. _alpha-cplusplus-SmartPtr:
2068 alpha.cplusplus.SmartPtr (C++)
2069 """"""""""""""""""""""""""""""
2070 Check for dereference of null smart pointers.
2072 .. code-block:: cpp
2074  void deref_smart_ptr() {
2075    std::unique_ptr<int> P;
2076    *P; // warn: dereference of a default constructed smart unique_ptr
2080 alpha.deadcode
2081 ^^^^^^^^^^^^^^
2082 .. _alpha-deadcode-UnreachableCode:
2084 alpha.deadcode.UnreachableCode (C, C++)
2085 """""""""""""""""""""""""""""""""""""""
2086 Check unreachable code.
2088 .. code-block:: cpp
2090  // C
2091  int test() {
2092    int x = 1;
2093    while(x);
2094    return x; // warn
2097  // C++
2098  void test() {
2099    int a = 2;
2101    while (a > 1)
2102      a--;
2104    if (a > 1)
2105      a++; // warn
2108  // Objective-C
2109  void test(id x) {
2110    return;
2111    [x retain]; // warn
2114 alpha.fuchsia
2115 ^^^^^^^^^^^^^
2117 .. _alpha-fuchsia-lock:
2119 alpha.fuchsia.Lock
2120 """"""""""""""""""
2121 Similarly to :ref:`alpha.unix.PthreadLock <alpha-unix-PthreadLock>`, checks for
2122 the locking/unlocking of fuchsia mutexes.
2124 .. code-block:: cpp
2126  spin_lock_t mtx1;
2128  void bad1(void)
2130    spin_lock(&mtx1);
2131    spin_lock(&mtx1);    // warn: This lock has already been acquired
2134 alpha.llvm
2135 ^^^^^^^^^^
2137 .. _alpha-llvm-Conventions:
2139 alpha.llvm.Conventions
2140 """"""""""""""""""""""
2142 Check code for LLVM codebase conventions:
2144 * A StringRef should not be bound to a temporary std::string whose lifetime is shorter than the StringRef's.
2145 * Clang AST nodes should not have fields that can allocate memory.
2148 alpha.osx
2149 ^^^^^^^^^
2151 .. _alpha-osx-cocoa-DirectIvarAssignment:
2153 alpha.osx.cocoa.DirectIvarAssignment (ObjC)
2154 """""""""""""""""""""""""""""""""""""""""""
2155 Check for direct assignments to instance variables.
2158 .. code-block:: objc
2160  @interface MyClass : NSObject {}
2161  @property (readonly) id A;
2162  - (void) foo;
2163  @end
2165  @implementation MyClass
2166  - (void) foo {
2167    _A = 0; // warn
2169  @end
2171 .. _alpha-osx-cocoa-DirectIvarAssignmentForAnnotatedFunctions:
2173 alpha.osx.cocoa.DirectIvarAssignmentForAnnotatedFunctions (ObjC)
2174 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
2175 Check for direct assignments to instance variables in
2176 the methods annotated with ``objc_no_direct_instance_variable_assignment``.
2178 .. code-block:: objc
2180  @interface MyClass : NSObject {}
2181  @property (readonly) id A;
2182  - (void) fAnnotated __attribute__((
2183      annotate("objc_no_direct_instance_variable_assignment")));
2184  - (void) fNotAnnotated;
2185  @end
2187  @implementation MyClass
2188  - (void) fAnnotated {
2189    _A = 0; // warn
2191  - (void) fNotAnnotated {
2192    _A = 0; // no warn
2194  @end
2197 .. _alpha-osx-cocoa-InstanceVariableInvalidation:
2199 alpha.osx.cocoa.InstanceVariableInvalidation (ObjC)
2200 """""""""""""""""""""""""""""""""""""""""""""""""""
2201 Check that the invalidatable instance variables are
2202 invalidated in the methods annotated with objc_instance_variable_invalidator.
2204 .. code-block:: objc
2206  @protocol Invalidation <NSObject>
2207  - (void) invalidate
2208    __attribute__((annotate("objc_instance_variable_invalidator")));
2209  @end
2211  @interface InvalidationImpObj : NSObject <Invalidation>
2212  @end
2214  @interface SubclassInvalidationImpObj : InvalidationImpObj {
2215    InvalidationImpObj *var;
2217  - (void)invalidate;
2218  @end
2220  @implementation SubclassInvalidationImpObj
2221  - (void) invalidate {}
2222  @end
2223  // warn: var needs to be invalidated or set to nil
2225 .. _alpha-osx-cocoa-MissingInvalidationMethod:
2227 alpha.osx.cocoa.MissingInvalidationMethod (ObjC)
2228 """"""""""""""""""""""""""""""""""""""""""""""""
2229 Check that the invalidation methods are present in classes that contain invalidatable instance variables.
2231 .. code-block:: objc
2233  @protocol Invalidation <NSObject>
2234  - (void)invalidate
2235    __attribute__((annotate("objc_instance_variable_invalidator")));
2236  @end
2238  @interface NeedInvalidation : NSObject <Invalidation>
2239  @end
2241  @interface MissingInvalidationMethodDecl : NSObject {
2242    NeedInvalidation *Var; // warn
2244  @end
2246  @implementation MissingInvalidationMethodDecl
2247  @end
2249 .. _alpha-osx-cocoa-localizability-PluralMisuseChecker:
2251 alpha.osx.cocoa.localizability.PluralMisuseChecker (ObjC)
2252 """""""""""""""""""""""""""""""""""""""""""""""""""""""""
2253 Warns against using one vs. many plural pattern in code when generating localized strings.
2255 .. code-block:: objc
2257  NSString *reminderText =
2258    NSLocalizedString(@"None", @"Indicates no reminders");
2259  if (reminderCount == 1) {
2260    // Warning: Plural cases are not supported across all languages.
2261    // Use a .stringsdict file instead
2262    reminderText =
2263      NSLocalizedString(@"1 Reminder", @"Indicates single reminder");
2264  } else if (reminderCount >= 2) {
2265    // Warning: Plural cases are not supported across all languages.
2266    // Use a .stringsdict file instead
2267    reminderText =
2268      [NSString stringWithFormat:
2269        NSLocalizedString(@"%@ Reminders", @"Indicates multiple reminders"),
2270          reminderCount];
2273 alpha.security
2274 ^^^^^^^^^^^^^^
2276 .. _alpha-security-ArrayBound:
2278 alpha.security.ArrayBound (C)
2279 """""""""""""""""""""""""""""
2280 Warn about buffer overflows (older checker).
2282 .. code-block:: c
2284  void test() {
2285    char *s = "";
2286    char c = s[1]; // warn
2289  struct seven_words {
2290    int c[7];
2291  };
2293  void test() {
2294    struct seven_words a, *p;
2295    p = &a;
2296    p[0] = a;
2297    p[1] = a;
2298    p[2] = a; // warn
2301  // note: requires unix.Malloc or
2302  // alpha.unix.MallocWithAnnotations checks enabled.
2303  void test() {
2304    int *p = malloc(12);
2305    p[3] = 4; // warn
2308  void test() {
2309    char a[2];
2310    int *b = (int*)a;
2311    b[1] = 3; // warn
2314 .. _alpha-security-ArrayBoundV2:
2316 alpha.security.ArrayBoundV2 (C)
2317 """""""""""""""""""""""""""""""
2318 Warn about buffer overflows (newer checker).
2320 .. code-block:: c
2322  void test() {
2323    char *s = "";
2324    char c = s[1]; // warn
2327  void test() {
2328    int buf[100];
2329    int *p = buf;
2330    p = p + 99;
2331    p[1] = 1; // warn
2334  // note: compiler has internal check for this.
2335  // Use -Wno-array-bounds to suppress compiler warning.
2336  void test() {
2337    int buf[100][100];
2338    buf[0][-1] = 1; // warn
2341  // note: requires alpha.security.taint check turned on.
2342  void test() {
2343    char s[] = "abc";
2344    int x = getchar();
2345    char c = s[x]; // warn: index is tainted
2348 .. _alpha-security-MallocOverflow:
2350 alpha.security.MallocOverflow (C)
2351 """""""""""""""""""""""""""""""""
2352 Check for overflows in the arguments to ``malloc()``.
2353 It tries to catch ``malloc(n * c)`` patterns, where:
2355  - ``n``: a variable or member access of an object
2356  - ``c``: a constant foldable integral
2358 This checker was designed for code audits, so expect false-positive reports.
2359 One is supposed to silence this checker by ensuring proper bounds checking on
2360 the variable in question using e.g. an ``assert()`` or a branch.
2362 .. code-block:: c
2364  void test(int n) {
2365    void *p = malloc(n * sizeof(int)); // warn
2368  void test2(int n) {
2369    if (n > 100) // gives an upper-bound
2370      return;
2371    void *p = malloc(n * sizeof(int)); // no warning
2374  void test3(int n) {
2375    assert(n <= 100 && "Contract violated.");
2376    void *p = malloc(n * sizeof(int)); // no warning
2379 Limitations:
2381  - The checker won't warn for variables involved in explicit casts,
2382    since that might limit the variable's domain.
2383    E.g.: ``(unsigned char)int x`` would limit the domain to ``[0,255]``.
2384    The checker will miss the true-positive cases when the explicit cast would
2385    not tighten the domain to prevent the overflow in the subsequent
2386    multiplication operation.
2388  - It is an AST-based checker, thus it does not make use of the
2389    path-sensitive taint-analysis.
2391 .. _alpha-security-MmapWriteExec:
2393 alpha.security.MmapWriteExec (C)
2394 """"""""""""""""""""""""""""""""
2395 Warn on mmap() calls that are both writable and executable.
2397 .. code-block:: c
2399  void test(int n) {
2400    void *c = mmap(NULL, 32, PROT_READ | PROT_WRITE | PROT_EXEC,
2401                   MAP_PRIVATE | MAP_ANON, -1, 0);
2402    // warn: Both PROT_WRITE and PROT_EXEC flags are set. This can lead to
2403    //       exploitable memory regions, which could be overwritten with malicious
2404    //       code
2407 .. _alpha-security-ReturnPtrRange:
2409 alpha.security.ReturnPtrRange (C)
2410 """""""""""""""""""""""""""""""""
2411 Check for an out-of-bound pointer being returned to callers.
2413 .. code-block:: c
2415  static int A[10];
2417  int *test() {
2418    int *p = A + 10;
2419    return p; // warn
2422  int test(void) {
2423    int x;
2424    return x; // warn: undefined or garbage returned
2428 alpha.security.cert
2429 ^^^^^^^^^^^^^^^^^^^
2431 SEI CERT checkers which tries to find errors based on their `C coding rules <https://wiki.sei.cmu.edu/confluence/display/c/2+Rules>`_.
2433 .. _alpha-security-cert-pos-checkers:
2435 alpha.security.cert.pos
2436 ^^^^^^^^^^^^^^^^^^^^^^^
2438 SEI CERT checkers of `POSIX C coding rules <https://wiki.sei.cmu.edu/confluence/pages/viewpage.action?pageId=87152405>`_.
2440 .. _alpha-security-cert-pos-34c:
2442 alpha.security.cert.pos.34c
2443 """""""""""""""""""""""""""
2444 Finds calls to the ``putenv`` function which pass a pointer to an automatic variable as the argument.
2446 .. code-block:: c
2448   int func(const char *var) {
2449     char env[1024];
2450     int retval = snprintf(env, sizeof(env),"TEST=%s", var);
2451     if (retval < 0 || (size_t)retval >= sizeof(env)) {
2452         /* Handle error */
2453     }
2455     return putenv(env); // putenv function should not be called with auto variables
2456   }
2458 Limitations:
2460    - Technically, one can pass automatic variables to ``putenv``,
2461      but one needs to ensure that the given environment key stays
2462      alive until it's removed or overwritten.
2463      Since the analyzer cannot keep track of which envvars get overwritten
2464      and when, it needs to be slightly more aggressive and warn for such
2465      cases too, leading in some cases to false-positive reports like this:
2467      .. code-block:: c
2469         void baz() {
2470           char env[] = "NAME=value";
2471           putenv(env); // false-positive warning: putenv function should not be called...
2472           // More code...
2473           putenv((char *)"NAME=anothervalue");
2474           // This putenv call overwrites the previous entry, thus that can no longer dangle.
2475         } // 'env' array becomes dead only here.
2477 alpha.security.cert.env
2478 ^^^^^^^^^^^^^^^^^^^^^^^
2480 SEI CERT checkers of `Environment C coding rules <https://wiki.sei.cmu.edu/confluence/x/JdcxBQ>`_.
2482 .. _alpha-security-cert-env-InvalidPtr:
2484 alpha.security.cert.env.InvalidPtr
2485 """"""""""""""""""""""""""""""""""
2487 Corresponds to SEI CERT Rules ENV31-C and ENV34-C.
2489 ENV31-C:
2490 Rule is about the possible problem with `main` function's third argument, environment pointer,
2491 "envp". When environment array is modified using some modification function
2492 such as putenv, setenv or others, It may happen that memory is reallocated,
2493 however "envp" is not updated to reflect the changes and points to old memory
2494 region.
2496 ENV34-C:
2497 Some functions return a pointer to a statically allocated buffer.
2498 Consequently, subsequent call of these functions will invalidate previous
2499 pointer. These functions include: getenv, localeconv, asctime, setlocale, strerror
2501 .. code-block:: c
2503   int main(int argc, const char *argv[], const char *envp[]) {
2504     if (setenv("MY_NEW_VAR", "new_value", 1) != 0) {
2505       // setenv call may invalidate 'envp'
2506       /* Handle error */
2507     }
2508     if (envp != NULL) {
2509       for (size_t i = 0; envp[i] != NULL; ++i) {
2510         puts(envp[i]);
2511         // envp may no longer point to the current environment
2512         // this program has unanticipated behavior, since envp
2513         // does not reflect changes made by setenv function.
2514       }
2515     }
2516     return 0;
2517   }
2519   void previous_call_invalidation() {
2520     char *p, *pp;
2522     p = getenv("VAR");
2523     setenv("SOMEVAR", "VALUE", /*overwrite = */1);
2524     // call to 'setenv' may invalidate p
2526     *p;
2527     // dereferencing invalid pointer
2528   }
2531 The ``InvalidatingGetEnv`` option is available for treating getenv calls as
2532 invalidating. When enabled, the checker issues a warning if getenv is called
2533 multiple times and their results are used without first creating a copy.
2534 This level of strictness might be considered overly pedantic for the commonly
2535 used getenv implementations.
2537 To enable this option, use:
2538 ``-analyzer-config alpha.security.cert.env.InvalidPtr:InvalidatingGetEnv=true``.
2540 By default, this option is set to *false*.
2542 When this option is enabled, warnings will be generated for scenarios like the
2543 following:
2545 .. code-block:: c
2547   char* p = getenv("VAR");
2548   char* pp = getenv("VAR2"); // assumes this call can invalidate `env`
2549   strlen(p); // warns about accessing invalid ptr
2551 alpha.security.taint
2552 ^^^^^^^^^^^^^^^^^^^^
2554 Checkers implementing
2555 `taint analysis <https://en.wikipedia.org/wiki/Taint_checking>`_.
2557 .. _alpha-security-taint-TaintPropagation:
2559 alpha.security.taint.TaintPropagation (C, C++)
2560 """"""""""""""""""""""""""""""""""""""""""""""
2562 Taint analysis identifies potential security vulnerabilities where the
2563 attacker can inject malicious data to the program to execute an attack
2564 (privilege escalation, command injection, SQL injection etc.).
2566 The malicious data is injected at the taint source (e.g. ``getenv()`` call)
2567 which is then propagated through function calls and being used as arguments of
2568 sensitive operations, also called as taint sinks (e.g. ``system()`` call).
2570 One can defend against this type of vulnerability by always checking and
2571 sanitizing the potentially malicious, untrusted user input.
2573 The goal of the checker is to discover and show to the user these potential
2574 taint source-sink pairs and the propagation call chain.
2576 The most notable examples of taint sources are:
2578   - data from network
2579   - files or standard input
2580   - environment variables
2581   - data from databases
2583 Let us examine a practical example of a Command Injection attack.
2585 .. code-block:: c
2587   // Command Injection Vulnerability Example
2588   int main(int argc, char** argv) {
2589     char cmd[2048] = "/bin/cat ";
2590     char filename[1024];
2591     printf("Filename:");
2592     scanf (" %1023[^\n]", filename); // The attacker can inject a shell escape here
2593     strcat(cmd, filename);
2594     system(cmd); // Warning: Untrusted data is passed to a system call
2595   }
2597 The program prints the content of any user specified file.
2598 Unfortunately the attacker can execute arbitrary commands
2599 with shell escapes. For example with the following input the `ls` command is also
2600 executed after the contents of `/etc/shadow` is printed.
2601 `Input: /etc/shadow ; ls /`
2603 The analysis implemented in this checker points out this problem.
2605 One can protect against such attack by for example checking if the provided
2606 input refers to a valid file and removing any invalid user input.
2608 .. code-block:: c
2610   // No vulnerability anymore, but we still get the warning
2611   void sanitizeFileName(char* filename){
2612     if (access(filename,F_OK)){// Verifying user input
2613       printf("File does not exist\n");
2614       filename[0]='\0';
2615       }
2616   }
2617   int main(int argc, char** argv) {
2618     char cmd[2048] = "/bin/cat ";
2619     char filename[1024];
2620     printf("Filename:");
2621     scanf (" %1023[^\n]", filename); // The attacker can inject a shell escape here
2622     sanitizeFileName(filename);// filename is safe after this point
2623     if (!filename[0])
2624       return -1;
2625     strcat(cmd, filename);
2626     system(cmd); // Superfluous Warning: Untrusted data is passed to a system call
2627   }
2629 Unfortunately, the checker cannot discover automatically that the programmer
2630 have performed data sanitation, so it still emits the warning.
2632 One can get rid of this superfluous warning by telling by specifying the
2633 sanitation functions in the taint configuration file (see
2634 :doc:`user-docs/TaintAnalysisConfiguration`).
2636 .. code-block:: YAML
2638   Filters:
2639   - Name: sanitizeFileName
2640     Args: [0]
2642 The clang invocation to pass the configuration file location:
2644 .. code-block:: bash
2646   clang  --analyze -Xclang -analyzer-config  -Xclang alpha.security.taint.TaintPropagation:Config=`pwd`/taint_config.yml ...
2648 If you are validating your inputs instead of sanitizing them, or don't want to
2649 mention each sanitizing function in our configuration,
2650 you can use a more generic approach.
2652 Introduce a generic no-op `csa_mark_sanitized(..)` function to
2653 tell the Clang Static Analyzer
2654 that the variable is safe to be used on that analysis path.
2656 .. code-block:: c
2658   // Marking sanitized variables safe.
2659   // No vulnerability anymore, no warning.
2661   // User csa_mark_sanitize function is for the analyzer only
2662   #ifdef __clang_analyzer__
2663     void csa_mark_sanitized(const void *);
2664   #endif
2666   int main(int argc, char** argv) {
2667     char cmd[2048] = "/bin/cat ";
2668     char filename[1024];
2669     printf("Filename:");
2670     scanf (" %1023[^\n]", filename);
2671     if (access(filename,F_OK)){// Verifying user input
2672       printf("File does not exist\n");
2673       return -1;
2674     }
2675     #ifdef __clang_analyzer__
2676       csa_mark_sanitized(filename); // Indicating to CSA that filename variable is safe to be used after this point
2677     #endif
2678     strcat(cmd, filename);
2679     system(cmd); // No warning
2680   }
2682 Similarly to the previous example, you need to
2683 define a `Filter` function in a `YAML` configuration file
2684 and add the `csa_mark_sanitized` function.
2686 .. code-block:: YAML
2688   Filters:
2689   - Name: csa_mark_sanitized
2690     Args: [0]
2692 Then calling `csa_mark_sanitized(X)` will tell the analyzer that `X` is safe to
2693 be used after this point, because its contents are verified. It is the
2694 responsibility of the programmer to ensure that this verification was indeed
2695 correct. Please note that `csa_mark_sanitized` function is only declared and
2696 used during Clang Static Analysis and skipped in (production) builds.
2698 Further examples of injection vulnerabilities this checker can find.
2700 .. code-block:: c
2702   void test() {
2703     char x = getchar(); // 'x' marked as tainted
2704     system(&x); // warn: untrusted data is passed to a system call
2705   }
2707   // note: compiler internally checks if the second param to
2708   // sprintf is a string literal or not.
2709   // Use -Wno-format-security to suppress compiler warning.
2710   void test() {
2711     char s[10], buf[10];
2712     fscanf(stdin, "%s", s); // 's' marked as tainted
2714     sprintf(buf, s); // warn: untrusted data used as a format string
2715   }
2717   void test() {
2718     size_t ts;
2719     scanf("%zd", &ts); // 'ts' marked as tainted
2720     int *p = (int *)malloc(ts * sizeof(int));
2721       // warn: untrusted data used as buffer size
2722   }
2724 There are built-in sources, propagations and sinks even if no external taint
2725 configuration is provided.
2727 Default sources:
2728  ``_IO_getc``, ``fdopen``, ``fopen``, ``freopen``, ``get_current_dir_name``,
2729  ``getch``, ``getchar``, ``getchar_unlocked``, ``getwd``, ``getcwd``,
2730  ``getgroups``, ``gethostname``, ``getlogin``, ``getlogin_r``, ``getnameinfo``,
2731  ``gets``, ``gets_s``, ``getseuserbyname``, ``readlink``, ``readlinkat``,
2732  ``scanf``, ``scanf_s``, ``socket``, ``wgetch``
2734 Default propagations rules:
2735  ``atoi``, ``atol``, ``atoll``, ``basename``, ``dirname``, ``fgetc``,
2736  ``fgetln``, ``fgets``, ``fnmatch``, ``fread``, ``fscanf``, ``fscanf_s``,
2737  ``index``, ``inflate``, ``isalnum``, ``isalpha``, ``isascii``, ``isblank``,
2738  ``iscntrl``, ``isdigit``, ``isgraph``, ``islower``, ``isprint``, ``ispunct``,
2739  ``isspace``, ``isupper``, ``isxdigit``, ``memchr``, ``memrchr``, ``sscanf``,
2740  ``getc``, ``getc_unlocked``, ``getdelim``, ``getline``, ``getw``, ``memcmp``,
2741  ``memcpy``, ``memmem``, ``memmove``, ``mbtowc``, ``pread``, ``qsort``,
2742  ``qsort_r``, ``rawmemchr``, ``read``, ``recv``, ``recvfrom``, ``rindex``,
2743  ``strcasestr``, ``strchr``, ``strchrnul``, ``strcasecmp``, ``strcmp``,
2744  ``strcspn``, ``strncasecmp``, ``strncmp``, ``strndup``,
2745  ``strndupa``, ``strpbrk``, ``strrchr``, ``strsep``, ``strspn``,
2746  ``strstr``, ``strtol``, ``strtoll``, ``strtoul``, ``strtoull``, ``tolower``,
2747  ``toupper``, ``ttyname``, ``ttyname_r``, ``wctomb``, ``wcwidth``
2749 Default sinks:
2750  ``printf``, ``setproctitle``, ``system``, ``popen``, ``execl``, ``execle``,
2751  ``execlp``, ``execv``, ``execvp``, ``execvP``, ``execve``, ``dlopen``,
2752  ``memcpy``, ``memmove``, ``strncpy``, ``strndup``, ``malloc``, ``calloc``,
2753  ``alloca``, ``memccpy``, ``realloc``, ``bcopy``
2755 Please note that there are no built-in filter functions.
2757 One can configure their own taint sources, sinks, and propagation rules by
2758 providing a configuration file via checker option
2759 ``alpha.security.taint.TaintPropagation:Config``. The configuration file is in
2760 `YAML <http://llvm.org/docs/YamlIO.html#introduction-to-yaml>`_ format. The
2761 taint-related options defined in the config file extend but do not override the
2762 built-in sources, rules, sinks. The format of the external taint configuration
2763 file is not stable, and could change without any notice even in a non-backward
2764 compatible way.
2766 For a more detailed description of configuration options, please see the
2767 :doc:`user-docs/TaintAnalysisConfiguration`. For an example see
2768 :ref:`clangsa-taint-configuration-example`.
2770 **Configuration**
2772 * `Config`  Specifies the name of the YAML configuration file. The user can
2773   define their own taint sources and sinks.
2775 **Related Guidelines**
2777 * `CWE Data Neutralization Issues
2778   <https://cwe.mitre.org/data/definitions/137.html>`_
2779 * `SEI Cert STR02-C. Sanitize data passed to complex subsystems
2780   <https://wiki.sei.cmu.edu/confluence/display/c/STR02-C.+Sanitize+data+passed+to+complex+subsystems>`_
2781 * `SEI Cert ENV33-C. Do not call system()
2782   <https://wiki.sei.cmu.edu/confluence/pages/viewpage.action?pageId=87152177>`_
2783 * `ENV03-C. Sanitize the environment when invoking external programs
2784   <https://wiki.sei.cmu.edu/confluence/display/c/ENV03-C.+Sanitize+the+environment+when+invoking+external+programs>`_
2786 **Limitations**
2788 * The taintedness property is not propagated through function calls which are
2789   unknown (or too complex) to the analyzer, unless there is a specific
2790   propagation rule built-in to the checker or given in the YAML configuration
2791   file. This causes potential true positive findings to be lost.
2793 alpha.unix
2794 ^^^^^^^^^^
2796 .. _alpha-unix-BlockInCriticalSection:
2798 alpha.unix.BlockInCriticalSection (C)
2799 """""""""""""""""""""""""""""""""""""
2800 Check for calls to blocking functions inside a critical section.
2801 Applies to: ``lock, unlock, sleep, getc, fgets, read, recv, pthread_mutex_lock,``
2802 `` pthread_mutex_unlock, mtx_lock, mtx_timedlock, mtx_trylock, mtx_unlock, lock_guard, unique_lock``
2804 .. code-block:: c
2806  void test() {
2807    std::mutex m;
2808    m.lock();
2809    sleep(3); // warn: a blocking function sleep is called inside a critical
2810              //       section
2811    m.unlock();
2814 .. _alpha-unix-Chroot:
2816 alpha.unix.Chroot (C)
2817 """""""""""""""""""""
2818 Check improper use of chroot.
2820 .. code-block:: c
2822  void f();
2824  void test() {
2825    chroot("/usr/local");
2826    f(); // warn: no call of chdir("/") immediately after chroot
2829 .. _alpha-unix-Errno:
2831 alpha.unix.Errno (C)
2832 """"""""""""""""""""
2834 Check for improper use of ``errno``.
2835 This checker implements partially CERT rule
2836 `ERR30-C. Set errno to zero before calling a library function known to set errno,
2837 and check errno only after the function returns a value indicating failure
2838 <https://wiki.sei.cmu.edu/confluence/pages/viewpage.action?pageId=87152351>`_.
2839 The checker can find the first read of ``errno`` after successful standard
2840 function calls.
2842 The C and POSIX standards often do not define if a standard library function
2843 may change value of ``errno`` if the call does not fail.
2844 Therefore, ``errno`` should only be used if it is known from the return value
2845 of a function that the call has failed.
2846 There are exceptions to this rule (for example ``strtol``) but the affected
2847 functions are not yet supported by the checker.
2848 The return values for the failure cases are documented in the standard Linux man
2849 pages of the functions and in the `POSIX standard <https://pubs.opengroup.org/onlinepubs/9699919799/>`_.
2851 .. code-block:: c
2853  int unsafe_errno_read(int sock, void *data, int data_size) {
2854    if (send(sock, data, data_size, 0) != data_size) {
2855      // 'send' can be successful even if not all data was sent
2856      if (errno == 1) { // An undefined value may be read from 'errno'
2857        return 0;
2858      }
2859    }
2860    return 1;
2863 The checker :ref:`unix-StdCLibraryFunctions` must be turned on to get the
2864 warnings from this checker. The supported functions are the same as by
2865 :ref:`unix-StdCLibraryFunctions`. The ``ModelPOSIX`` option of that
2866 checker affects the set of checked functions.
2868 **Parameters**
2870 The ``AllowErrnoReadOutsideConditionExpressions`` option allows read of the
2871 errno value if the value is not used in a condition (in ``if`` statements,
2872 loops, conditional expressions, ``switch`` statements). For example ``errno``
2873 can be stored into a variable without getting a warning by the checker.
2875 .. code-block:: c
2877  int unsafe_errno_read(int sock, void *data, int data_size) {
2878    if (send(sock, data, data_size, 0) != data_size) {
2879      int err = errno;
2880      // warning if 'AllowErrnoReadOutsideConditionExpressions' is false
2881      // no warning if 'AllowErrnoReadOutsideConditionExpressions' is true
2882    }
2883    return 1;
2886 Default value of this option is ``true``. This allows save of the errno value
2887 for possible later error handling.
2889 **Limitations**
2891  - Only the very first usage of ``errno`` is checked after an affected function
2892    call. Value of ``errno`` is not followed when it is stored into a variable
2893    or returned from a function.
2894  - Documentation of function ``lseek`` is not clear about what happens if the
2895    function returns different value than the expected file position but not -1.
2896    To avoid possible false-positives ``errno`` is allowed to be used in this
2897    case.
2899 .. _alpha-unix-PthreadLock:
2901 alpha.unix.PthreadLock (C)
2902 """"""""""""""""""""""""""
2903 Simple lock -> unlock checker.
2904 Applies to: ``pthread_mutex_lock, pthread_rwlock_rdlock, pthread_rwlock_wrlock, lck_mtx_lock, lck_rw_lock_exclusive``
2905 ``lck_rw_lock_shared, pthread_mutex_trylock, pthread_rwlock_tryrdlock, pthread_rwlock_tryrwlock, lck_mtx_try_lock,
2906 lck_rw_try_lock_exclusive, lck_rw_try_lock_shared, pthread_mutex_unlock, pthread_rwlock_unlock, lck_mtx_unlock, lck_rw_done``.
2909 .. code-block:: c
2911  pthread_mutex_t mtx;
2913  void test() {
2914    pthread_mutex_lock(&mtx);
2915    pthread_mutex_lock(&mtx);
2916      // warn: this lock has already been acquired
2919  lck_mtx_t lck1, lck2;
2921  void test() {
2922    lck_mtx_lock(&lck1);
2923    lck_mtx_lock(&lck2);
2924    lck_mtx_unlock(&lck1);
2925      // warn: this was not the most recently acquired lock
2928  lck_mtx_t lck1, lck2;
2930  void test() {
2931    if (lck_mtx_try_lock(&lck1) == 0)
2932      return;
2934    lck_mtx_lock(&lck2);
2935    lck_mtx_unlock(&lck1);
2936      // warn: this was not the most recently acquired lock
2939 .. _alpha-unix-SimpleStream:
2941 alpha.unix.SimpleStream (C)
2942 """""""""""""""""""""""""""
2943 Check for misuses of stream APIs. Check for misuses of stream APIs: ``fopen, fclose``
2944 (demo checker, the subject of the demo (`Slides <https://llvm.org/devmtg/2012-11/Zaks-Rose-Checker24Hours.pdf>`_ ,
2945 `Video <https://youtu.be/kdxlsP5QVPw>`_) by Anna Zaks and Jordan Rose presented at the
2946 `2012 LLVM Developers' Meeting <https://llvm.org/devmtg/2012-11/>`_).
2948 .. code-block:: c
2950  void test() {
2951    FILE *F = fopen("myfile.txt", "w");
2952  } // warn: opened file is never closed
2954  void test() {
2955    FILE *F = fopen("myfile.txt", "w");
2957    if (F)
2958      fclose(F);
2960    fclose(F); // warn: closing a previously closed file stream
2963 .. _alpha-unix-Stream:
2965 alpha.unix.Stream (C)
2966 """""""""""""""""""""
2967 Check stream handling functions: ``fopen, tmpfile, fclose, fread, fwrite, fseek, ftell, rewind, fgetpos,``
2968 ``fsetpos, clearerr, feof, ferror, fileno``.
2970 .. code-block:: c
2972  void test() {
2973    FILE *p = fopen("foo", "r");
2974  } // warn: opened file is never closed
2976  void test() {
2977    FILE *p = fopen("foo", "r");
2978    fseek(p, 1, SEEK_SET); // warn: stream pointer might be NULL
2979    fclose(p);
2982  void test() {
2983    FILE *p = fopen("foo", "r");
2985    if (p)
2986      fseek(p, 1, 3);
2987       // warn: third arg should be SEEK_SET, SEEK_END, or SEEK_CUR
2989    fclose(p);
2992  void test() {
2993    FILE *p = fopen("foo", "r");
2994    fclose(p);
2995    fclose(p); // warn: already closed
2998  void test() {
2999    FILE *p = tmpfile();
3000    ftell(p); // warn: stream pointer might be NULL
3001    fclose(p);
3005 .. _alpha-unix-cstring-BufferOverlap:
3007 alpha.unix.cstring.BufferOverlap (C)
3008 """"""""""""""""""""""""""""""""""""
3009 Checks for overlap in two buffer arguments. Applies to:  ``memcpy, mempcpy, wmemcpy, wmempcpy``.
3011 .. code-block:: c
3013  void test() {
3014    int a[4] = {0};
3015    memcpy(a + 2, a + 1, 8); // warn
3018 .. _alpha-unix-cstring-NotNullTerminated:
3020 alpha.unix.cstring.NotNullTerminated (C)
3021 """"""""""""""""""""""""""""""""""""""""
3022 Check for arguments which are not null-terminated strings; applies to: ``strlen, strnlen, strcpy, strncpy, strcat, strncat, wcslen, wcsnlen``.
3024 .. code-block:: c
3026  void test() {
3027    int y = strlen((char *)&test); // warn
3030 .. _alpha-unix-cstring-OutOfBounds:
3032 alpha.unix.cstring.OutOfBounds (C)
3033 """"""""""""""""""""""""""""""""""
3034 Check for out-of-bounds access in string functions, such as:
3035 ``memcpy, bcopy, strcpy, strncpy, strcat, strncat, memmove, memcmp, memset`` and more.
3037 This check also works with string literals, except there is a known bug in that
3038 the analyzer cannot detect embedded NULL characters when determining the string length.
3040 .. code-block:: c
3042  void test1() {
3043    const char str[] = "Hello world";
3044    char buffer[] = "Hello world";
3045    memcpy(buffer, str, sizeof(str) + 1); // warn
3048  void test2() {
3049    const char str[] = "Hello world";
3050    char buffer[] = "Helloworld";
3051    memcpy(buffer, str, sizeof(str)); // warn
3054 .. _alpha-unix-cstring-UninitializedRead:
3056 alpha.unix.cstring.UninitializedRead (C)
3057 """"""""""""""""""""""""""""""""""""""""
3058 Check for uninitialized reads from common memory copy/manipulation functions such as:
3059  ``memcpy, mempcpy, memmove, memcmp, strcmp, strncmp, strcpy, strlen, strsep`` and many more.
3061 .. code-block:: c
3063  void test() {
3064   char src[10];
3065   char dst[5];
3066   memcpy(dst,src,sizeof(dst)); // warn: Bytes string function accesses uninitialized/garbage values
3069 Limitations:
3071    - Due to limitations of the memory modeling in the analyzer, one can likely
3072      observe a lot of false-positive reports like this:
3074       .. code-block:: c
3076         void false_positive() {
3077           int src[] = {1, 2, 3, 4};
3078           int dst[5] = {0};
3079           memcpy(dst, src, 4 * sizeof(int)); // false-positive:
3080           // The 'src' buffer was correctly initialized, yet we cannot conclude
3081           // that since the analyzer could not see a direct initialization of the
3082           // very last byte of the source buffer.
3083         }
3085      More details at the corresponding `GitHub issue <https://github.com/llvm/llvm-project/issues/43459>`_.
3087 .. _alpha-nondeterminism-PointerIteration:
3089 alpha.nondeterminism.PointerIteration (C++)
3090 """""""""""""""""""""""""""""""""""""""""""
3091 Check for non-determinism caused by iterating unordered containers of pointers.
3093 .. code-block:: c
3095  void test() {
3096   int a = 1, b = 2;
3097   std::unordered_set<int *> UnorderedPtrSet = {&a, &b};
3099   for (auto i : UnorderedPtrSet) // warn
3100     f(i);
3103 .. _alpha-nondeterminism-PointerSorting:
3105 alpha.nondeterminism.PointerSorting (C++)
3106 """""""""""""""""""""""""""""""""""""""""
3107 Check for non-determinism caused by sorting of pointers.
3109 .. code-block:: c
3111  void test() {
3112   int a = 1, b = 2;
3113   std::vector<int *> V = {&a, &b};
3114   std::sort(V.begin(), V.end()); // warn
3118 alpha.WebKit
3119 ^^^^^^^^^^^^
3121 .. _alpha-webkit-UncountedCallArgsChecker:
3123 alpha.webkit.UncountedCallArgsChecker
3124 """""""""""""""""""""""""""""""""""""
3125 The goal of this rule is to make sure that lifetime of any dynamically allocated ref-countable object passed as a call argument spans past the end of the call. This applies to call to any function, method, lambda, function pointer or functor. Ref-countable types aren't supposed to be allocated on stack so we check arguments for parameters of raw pointers and references to uncounted types.
3127 Here are some examples of situations that we warn about as they *might* be potentially unsafe. The logic is that either we're able to guarantee that an argument is safe or it's considered if not a bug then bug-prone.
3129   .. code-block:: cpp
3131     RefCountable* provide_uncounted();
3132     void consume(RefCountable*);
3134     // In these cases we can't make sure callee won't directly or indirectly call `deref()` on the argument which could make it unsafe from such point until the end of the call.
3136     void foo1() {
3137       consume(provide_uncounted()); // warn
3138     }
3140     void foo2() {
3141       RefCountable* uncounted = provide_uncounted();
3142       consume(uncounted); // warn
3143     }
3145 Although we are enforcing member variables to be ref-counted by `webkit.NoUncountedMemberChecker` any method of the same class still has unrestricted access to these. Since from a caller's perspective we can't guarantee a particular member won't get modified by callee (directly or indirectly) we don't consider values obtained from members safe.
3147 Note: It's likely this heuristic could be made more precise with fewer false positives - for example calls to free functions that don't have any parameter other than the pointer should be safe as the callee won't be able to tamper with the member unless it's a global variable.
3149   .. code-block:: cpp
3151     struct Foo {
3152       RefPtr<RefCountable> member;
3153       void consume(RefCountable*) { /* ... */ }
3154       void bugprone() {
3155         consume(member.get()); // warn
3156       }
3157     };
3159 The implementation of this rule is a heuristic - we define a whitelist of kinds of values that are considered safe to be passed as arguments. If we can't prove an argument is safe it's considered an error.
3161 Allowed kinds of arguments:
3163 - values obtained from ref-counted objects (including temporaries as those survive the call too)
3165   .. code-block:: cpp
3167     RefCountable* provide_uncounted();
3168     void consume(RefCountable*);
3170     void foo() {
3171       RefPtr<RefCountable> rc = makeRef(provide_uncounted());
3172       consume(rc.get()); // ok
3173       consume(makeRef(provide_uncounted()).get()); // ok
3174     }
3176 - forwarding uncounted arguments from caller to callee
3178   .. code-block:: cpp
3180     void foo(RefCountable& a) {
3181       bar(a); // ok
3182     }
3184   Caller of ``foo()`` is responsible for  ``a``'s lifetime.
3186 - ``this`` pointer
3188   .. code-block:: cpp
3190     void Foo::foo() {
3191       baz(this);  // ok
3192     }
3194   Caller of ``foo()`` is responsible for keeping the memory pointed to by ``this`` pointer safe.
3196 - constants
3198   .. code-block:: cpp
3200     foo(nullptr, NULL, 0); // ok
3202 We also define a set of safe transformations which if passed a safe value as an input provide (usually it's the return value) a safe value (or an object that provides safe values). This is also a heuristic.
3204 - constructors of ref-counted types (including factory methods)
3205 - getters of ref-counted types
3206 - member overloaded operators
3207 - casts
3208 - unary operators like ``&`` or ``*``
3210 alpha.webkit.UncountedLocalVarsChecker
3211 """"""""""""""""""""""""""""""""""""""
3212 The goal of this rule is to make sure that any uncounted local variable is backed by a ref-counted object with lifetime that is strictly larger than the scope of the uncounted local variable. To be on the safe side we require the scope of an uncounted variable to be embedded in the scope of ref-counted object that backs it.
3214 These are examples of cases that we consider safe:
3216   .. code-block:: cpp
3218     void foo1() {
3219       RefPtr<RefCountable> counted;
3220       // The scope of uncounted is EMBEDDED in the scope of counted.
3221       {
3222         RefCountable* uncounted = counted.get(); // ok
3223       }
3224     }
3226     void foo2(RefPtr<RefCountable> counted_param) {
3227       RefCountable* uncounted = counted_param.get(); // ok
3228     }
3230     void FooClass::foo_method() {
3231       RefCountable* uncounted = this; // ok
3232     }
3234 Here are some examples of situations that we warn about as they *might* be potentially unsafe. The logic is that either we're able to guarantee that an argument is safe or it's considered if not a bug then bug-prone.
3236   .. code-block:: cpp
3238     void foo1() {
3239       RefCountable* uncounted = new RefCountable; // warn
3240     }
3242     RefCountable* global_uncounted;
3243     void foo2() {
3244       RefCountable* uncounted = global_uncounted; // warn
3245     }
3247     void foo3() {
3248       RefPtr<RefCountable> counted;
3249       // The scope of uncounted is not EMBEDDED in the scope of counted.
3250       RefCountable* uncounted = counted.get(); // warn
3251     }
3253 We don't warn about these cases - we don't consider them necessarily safe but since they are very common and usually safe we'd introduce a lot of false positives otherwise:
3254 - variable defined in condition part of an ```if``` statement
3255 - variable defined in init statement condition of a ```for``` statement
3257 For the time being we also don't warn about uninitialized uncounted local variables.
3259 Debug Checkers
3260 ---------------
3262 .. _debug-checkers:
3265 debug
3266 ^^^^^
3268 Checkers used for debugging the analyzer.
3269 :doc:`developer-docs/DebugChecks` page contains a detailed description.
3271 .. _debug-AnalysisOrder:
3273 debug.AnalysisOrder
3274 """""""""""""""""""
3275 Print callbacks that are called during analysis in order.
3277 .. _debug-ConfigDumper:
3279 debug.ConfigDumper
3280 """"""""""""""""""
3281 Dump config table.
3283 .. _debug-DumpCFG Display:
3285 debug.DumpCFG Display
3286 """""""""""""""""""""
3287 Control-Flow Graphs.
3289 .. _debug-DumpCallGraph:
3291 debug.DumpCallGraph
3292 """""""""""""""""""
3293 Display Call Graph.
3295 .. _debug-DumpCalls:
3297 debug.DumpCalls
3298 """""""""""""""
3299 Print calls as they are traversed by the engine.
3301 .. _debug-DumpDominators:
3303 debug.DumpDominators
3304 """"""""""""""""""""
3305 Print the dominance tree for a given CFG.
3307 .. _debug-DumpLiveVars:
3309 debug.DumpLiveVars
3310 """"""""""""""""""
3311 Print results of live variable analysis.
3313 .. _debug-DumpTraversal:
3315 debug.DumpTraversal
3316 """""""""""""""""""
3317 Print branch conditions as they are traversed by the engine.
3319 .. _debug-ExprInspection:
3321 debug.ExprInspection
3322 """"""""""""""""""""
3323 Check the analyzer's understanding of expressions.
3325 .. _debug-Stats:
3327 debug.Stats
3328 """""""""""
3329 Emit warnings with analyzer statistics.
3331 .. _debug-TaintTest:
3333 debug.TaintTest
3334 """""""""""""""
3335 Mark tainted symbols as such.
3337 .. _debug-ViewCFG:
3339 debug.ViewCFG
3340 """""""""""""
3341 View Control-Flow Graphs using GraphViz.
3343 .. _debug-ViewCallGraph:
3345 debug.ViewCallGraph
3346 """""""""""""""""""
3347 View Call Graph using GraphViz.
3349 .. _debug-ViewExplodedGraph:
3351 debug.ViewExplodedGraph
3352 """""""""""""""""""""""
3353 View Exploded Graphs using GraphViz.