| // RUN: %clang_analyze_cc1 %s -verify=fn-pointer \ | |
| // RUN: -analyzer-checker=core \ | |
| // RUN: -analyzer-config core.CallAndMessage:FunctionPointer=true \ | |
| // RUN: -analyzer-config core.CallAndMessage:ParameterCount=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:CXXThisMethodCall=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:CXXDeallocationArg=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:ArgInitializedness=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:ArgPointeeInitializedness=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:NilReceiver=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:UndefReceiver=false | |
| // RUN: %clang_analyze_cc1 %s -verify=param-count \ | |
| // RUN: -analyzer-checker=core \ | |
| // RUN: -analyzer-config core.CallAndMessage:FunctionPointer=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:ParameterCount=true \ | |
| // RUN: -analyzer-config core.CallAndMessage:CXXThisMethodCall=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:CXXDeallocationArg=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:ArgInitializedness=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:ArgPointeeInitializedness=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:NilReceiver=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:UndefReceiver=false | |
| // RUN: %clang_analyze_cc1 %s -verify=method \ | |
| // RUN: -analyzer-checker=core \ | |
| // RUN: -analyzer-config core.CallAndMessage:FunctionPointer=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:ParameterCount=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:CXXThisMethodCall=true \ | |
| // RUN: -analyzer-config core.CallAndMessage:CXXDeallocationArg=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:ArgInitializedness=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:ArgPointeeInitializedness=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:NilReceiver=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:UndefReceiver=false | |
| // RUN: %clang_analyze_cc1 %s -verify=delete \ | |
| // RUN: -analyzer-checker=core \ | |
| // RUN: -analyzer-config core.CallAndMessage:FunctionPointer=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:ParameterCount=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:CXXThisMethodCall=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:CXXDeallocationArg=true \ | |
| // RUN: -analyzer-config core.CallAndMessage:ArgInitializedness=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:ArgPointeeInitializedness=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:NilReceiver=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:UndefReceiver=false | |
| // RUN: %clang_analyze_cc1 %s -verify=arg-init \ | |
| // RUN: -analyzer-checker=core \ | |
| // RUN: -analyzer-config core.CallAndMessage:FunctionPointer=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:ParameterCount=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:CXXThisMethodCall=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:CXXDeallocationArg=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:ArgInitializedness=true \ | |
| // RUN: -analyzer-config core.CallAndMessage:ArgPointeeInitializedness=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:NilReceiver=false \ | |
| // RUN: -analyzer-config core.CallAndMessage:UndefReceiver=false | |
| // Testing for ArgPointeeInitializedness is in call-and-message.c. | |
| // RUN: %clang_analyze_cc1 %s \ | |
| // RUN: -verify=fn-pointer,param-count,method,delete,arg-init \ | |
| // RUN: -analyzer-checker=core \ | |
| // RUN: -analyzer-output=plist -o %t.plist | |
| // RUN: cat %t.plist | FileCheck %s | |
| namespace function_pointer { | |
| using Fn = void (*)(); | |
| void uninit() { | |
| Fn f; | |
| f(); // fn-pointer-warning{{Called function pointer is an uninitialized pointer value [core.CallAndMessage]}} | |
| } | |
| void null() { | |
| Fn f = nullptr; | |
| f(); // fn-pointer-warning{{Called function pointer is null (null dereference) [core.CallAndMessage]}} | |
| } | |
| // TODO: If this hash ever changes, turn | |
| // core.CallAndMessage:FunctionPointer from a checker option into a | |
| // checker, as described in the CallAndMessage comments! | |
| // CHECK: <key>issue_hash_content_of_line_in_context</key> | |
| // CHECK-SAME: <string>eb2083c01775eef452afa75728dd4d8f</string> | |
| // CHECK: <key>issue_hash_content_of_line_in_context</key> | |
| // CHECK-SAME: <string>407c50d9bedd8db28bf34f9411308100</string> | |
| } // namespace function_pointer | |
| namespace wrong_param_count { | |
| using FnOneParam = void (*)(int); | |
| using FnTwoParam = void (*)(int, int); | |
| void f(int, int) {} | |
| void wrong_cast() { | |
| FnTwoParam f1 = f; | |
| FnOneParam f2 = reinterpret_cast<FnOneParam>(f1); | |
| f2(5); // param-count-warning{{Function taking 2 arguments is called with fewer (1) [core.CallAndMessage]}} | |
| } | |
| // TODO: If this hash ever changes, turn | |
| // core.CallAndMessage:ParameterCount from a checker option into a | |
| // checker, as described in the CallAndMessage comments! | |
| // CHECK: <key>issue_hash_content_of_line_in_context</key> | |
| // CHECK-SAME: <string>9ff0e9b728422017945c9d5a673de223</string> | |
| } // namespace wrong_param_count | |
| namespace method_call { | |
| struct A { | |
| void m(); | |
| }; | |
| void uninit() { | |
| A *a; | |
| a->m(); // method-warning{{Called C++ object pointer is uninitialized [core.CallAndMessage]}} | |
| } | |
| // TODO: If this hash ever changes, turn | |
| // core.CallAndMessage:CXXThisMethodCall from a checker option into a | |
| // checker, as described in the CallAndMessage comments! | |
| // CHECK: <key>issue_hash_content_of_line_in_context</key> | |
| // CHECK-SAME: <string>7bc35c70465837948a3f5018f27b21cd</string> | |
| void null() { | |
| A *a = nullptr; | |
| a->m(); // method-warning{{Called C++ object pointer is null [core.CallAndMessage]}} | |
| } | |
| // TODO: If this hash ever changes, turn | |
| // core.CallAndMessage:CXXThisMethodCall from a checker option into a | |
| // checker, as described in the CallAndMessage comments! | |
| // CHECK: <key>issue_hash_content_of_line_in_context</key> | |
| // CHECK-SAME: <string>8ec260c9ef11d7c51fa872212df1163f</string> | |
| } // namespace method_call | |
| namespace operator_delete { | |
| void f() { | |
| int *i; | |
| delete i; // delete-warning{{Argument to 'delete' is uninitialized [core.CallAndMessage]}} | |
| } | |
| // TODO: If this hash ever changes, turn | |
| // core.CallAndMessage:CXXDeallocationArg from a checker option into a | |
| // checker, as described in the CallAndMessage comments! | |
| // CHECK: <key>issue_hash_content_of_line_in_context</key> | |
| // CHECK-SAME: <string>a8ff99ebaa8746457d3e14af8ef7e75c</string> | |
| } // namespace operator_delete | |
| namespace uninit_arg { | |
| template <class T> | |
| void consume(T); | |
| void fundamental_uninit() { | |
| int i; | |
| consume(i); // arg-init-warning{{1st function call argument is an uninitialized value [core.CallAndMessage]}} | |
| } | |
| struct A { | |
| int i; | |
| }; | |
| void record_uninit() { | |
| A a; | |
| consume(a); // arg-init-warning{{Passed-by-value struct argument contains uninitialized data (e.g., field: 'i') [core.CallAndMessage]}} | |
| } | |
| // TODO: If this hash ever changes, turn | |
| // core.CallAndMessage:ArgInitializedness from a checker option into a | |
| // checker, as described in the CallAndMessage comments! | |
| // CHECK: <key>issue_hash_content_of_line_in_context</key> | |
| // CHECK-SAME: <string>a46bb5c1ee44d4611ffeb13f7f499605</string> | |
| // CHECK: <key>issue_hash_content_of_line_in_context</key> | |
| // CHECK-SAME: <string>e0e0d30ea5a7b2e3a71e1931fa0768a5</string> | |
| struct B{ | |
| int i :2; | |
| int :30; // unnamed bit-field | |
| }; | |
| void bitfield_B_init(void) { | |
| B b1; | |
| b1.i = 1; // b1 is initialized | |
| consume(b1); | |
| } | |
| void bitfield_B_uninit(void) { | |
| B b2; | |
| consume(b2); // arg-init-warning{{Passed-by-value struct argument contains uninitialized data (e.g., field: 'i') [core.CallAndMessage]}} | |
| } | |
| } // namespace uninit_arg |