xref: /openbsd-src/gnu/llvm/clang/docs/analyzer/checkers/seckeychainapi_example.m (revision e5dd70708596ae51455a0ffa086a00c5b29f8583)
1*e5dd7070Spatrick
2*e5dd7070Spatrick
3*e5dd7070Spatrickvoid test() {
4*e5dd7070Spatrick  unsigned int *ptr = 0;
5*e5dd7070Spatrick  UInt32 length;
6*e5dd7070Spatrick
7*e5dd7070Spatrick  SecKeychainItemFreeContent(ptr, &length);
8*e5dd7070Spatrick    // warn: trying to free data which has not been allocated
9*e5dd7070Spatrick}
10*e5dd7070Spatrick
11*e5dd7070Spatrickvoid test() {
12*e5dd7070Spatrick  unsigned int *ptr = 0;
13*e5dd7070Spatrick  UInt32 *length = 0;
14*e5dd7070Spatrick  void *outData;
15*e5dd7070Spatrick
16*e5dd7070Spatrick  OSStatus st =
17*e5dd7070Spatrick    SecKeychainItemCopyContent(2, ptr, ptr, length, outData);
18*e5dd7070Spatrick    // warn: data is not released
19*e5dd7070Spatrick}
20*e5dd7070Spatrick
21*e5dd7070Spatrickvoid test() {
22*e5dd7070Spatrick  unsigned int *ptr = 0;
23*e5dd7070Spatrick  UInt32 *length = 0;
24*e5dd7070Spatrick  void *outData;
25*e5dd7070Spatrick
26*e5dd7070Spatrick  OSStatus st =
27*e5dd7070Spatrick    SecKeychainItemCopyContent(2, ptr, ptr, length, &outData);
28*e5dd7070Spatrick
29*e5dd7070Spatrick  SecKeychainItemFreeContent(ptr, outData);
30*e5dd7070Spatrick    // warn: only call free if a non-NULL buffer was returned
31*e5dd7070Spatrick}
32*e5dd7070Spatrick
33*e5dd7070Spatrickvoid test() {
34*e5dd7070Spatrick  unsigned int *ptr = 0;
35*e5dd7070Spatrick  UInt32 *length = 0;
36*e5dd7070Spatrick  void *outData;
37*e5dd7070Spatrick
38*e5dd7070Spatrick  OSStatus st =
39*e5dd7070Spatrick    SecKeychainItemCopyContent(2, ptr, ptr, length, &outData);
40*e5dd7070Spatrick
41*e5dd7070Spatrick  st = SecKeychainItemCopyContent(2, ptr, ptr, length, &outData);
42*e5dd7070Spatrick    // warn: release data before another call to the allocator
43*e5dd7070Spatrick
44*e5dd7070Spatrick  if (st == noErr)
45*e5dd7070Spatrick    SecKeychainItemFreeContent(ptr, outData);
46*e5dd7070Spatrick}
47*e5dd7070Spatrick
48*e5dd7070Spatrickvoid test() {
49*e5dd7070Spatrick  SecKeychainItemRef itemRef = 0;
50*e5dd7070Spatrick  SecKeychainAttributeInfo *info = 0;
51*e5dd7070Spatrick  SecItemClass *itemClass = 0;
52*e5dd7070Spatrick  SecKeychainAttributeList *attrList = 0;
53*e5dd7070Spatrick  UInt32 *length = 0;
54*e5dd7070Spatrick  void *outData = 0;
55*e5dd7070Spatrick
56*e5dd7070Spatrick  OSStatus st =
57*e5dd7070Spatrick    SecKeychainItemCopyAttributesAndData(itemRef, info,
58*e5dd7070Spatrick                                         itemClass, &attrList,
59*e5dd7070Spatrick                                         length, &outData);
60*e5dd7070Spatrick
61*e5dd7070Spatrick  SecKeychainItemFreeContent(attrList, outData);
62*e5dd7070Spatrick    // warn: deallocator doesn't match the allocator
63*e5dd7070Spatrick}
64*e5dd7070Spatrick
65