clang -cc1 -triple thumbv7em-none-unknown-eabi -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name memory_leak_examples.c -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model static -mthread-model posix -mframe-pointer=all -fmath-errno -fno-rounding-math -mconstructor-aliases -nostdsysteminc -target-cpu cortex-m4 -target-feature -crc -target-feature -sha2 -target-feature -aes -target-feature -dotprod -target-feature +dsp -target-feature -mve -target-feature -mve.fp -target-feature -ras -target-feature -sb -target-feature -lob -target-feature -hwdiv-arm -target-feature +hwdiv -target-feature -vfp2 -target-feature +vfp2sp -target-feature -vfp3 -target-feature -vfp3d16 -target-feature +vfp3d16sp -target-feature -vfp3sp -target-feature +fp16 -target-feature -vfp4 -target-feature -vfp4d16 -target-feature +vfp4d16sp -target-feature -vfp4sp -target-feature -fp-armv8 -target-feature -fp-armv8d16 -target-feature -fp-armv8d16sp -target-feature -fp-armv8sp -target-feature -fullfp16 -target-feature -fp64 -target-feature -d32 -target-feature -neon -target-feature -crypto -target-feature -fp16fml -target-feature +strict-align -target-abi aapcs -mfloat-abi hard -fallow-half-arguments-and-returns -dwarf-column-info -fno-split-dwarf-inlining -debugger-tuning=gdb -target-linker-version 556.5 -ffunction-sections -fdata-sections -resource-dir /clang+llvm-10.0.0-x86_64-apple-darwin/lib/clang/10.0.0 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk -I /interrupt/example/freertos-example-llvm/freertos_kernel/include -I /interrupt/example/freertos-example-llvm/include -I /interrupt/example/freertos-example-llvm/freertos_kernel/portable/GCC/ARM_CM4F -internal-isystem /clang+llvm-10.0.0-x86_64-apple-darwin/lib/clang/10.0.0/include -internal-isystem /arm_9_2019q4/bin/../arm-none-eabi/include -Oz -fdebug-compilation-dir /interrupt/example/freertos-example-llvm -ferror-limit 19 -fmessage-length 0 -fno-signed-char -fgnuc-version=4.2.1 -fobjc-runtime=gcc -fdiagnostics-show-option -vectorize-slp -analyzer-output=html -faddrsig -o /interrupt/example/freertos-example-llvm/scanbuild_analysis/2020-05-19-190156-30115-1 -x c /interrupt/example/freertos-example-llvm/src/memory_leak_examples.c
| 1 | #include "example_project/examples.h" | 
| 2 |   | 
| 3 | #include <string.h> | 
| 4 | #include <stdlib.h> | 
| 5 |   | 
| 6 | #include "example_project/memory_pool.h" | 
| 7 |   | 
| 8 | uint32_t example_malloc_free(void) { | 
| 9 |   const size_t size = 10; | 
| 10 |   uint8_t *ptr = malloc(size); | 
| 11 |   free(ptr); | 
| 12 |   | 
| 13 |    | 
| 14 |   uint32_t sum = 0; | 
| 15 |   for (size_t i = 0; i < size; i++) { | 
| 16 |     sum += ptr[i]; | 
| 17 |   } | 
| 18 |   return sum; | 
| 19 | } | 
| 20 |   | 
| 21 | uint32_t example_access_garbage(void) { | 
| 22 |   const size_t size = 10; | 
| 23 |   uint8_t *ptr = memory_pool_allocate(size); | 
| 24 |   if (ptr == NULL) { | 
| 25 |     return 0; | 
| 26 |   } | 
| 27 |   | 
| 28 |    | 
| 29 |   uint32_t sum = 0; | 
| 30 |   for (size_t i = 0; i < size; i++) { | 
| 31 |     sum += ptr[i]; | 
| 32 |   } | 
| 33 |   | 
| 34 |   return sum; | 
| 35 | } | 
| 36 |   | 
| 37 | uint32_t example_memory_leak(void) { | 
| 38 |   const size_t size = 10; | 
| 39 |   uint8_t *ptr = memory_pool_allocate(size); | 
| 40 |   if (ptr == NULL) { | 
| 41 |     return 0; | 
| 42 |   } | 
| 43 |   | 
| 44 |    | 
| 45 |   const uint8_t return_code = ((uint32_t)(uintptr_t)ptr) ? 0xa5 : 0xef; | 
| 46 |   if (return_code == 0xa5) { | 
| 47 |     return 1; | 
| 48 |   } | 
| 49 |   | 
| 50 |   memory_pool_free(ptr); | 
| 51 |   return 0; | 
| 52 | } | 
| 53 |   | 
| 54 |   | 
| 55 | uint32_t example_use_after_free(void) { | 
| 56 |   const size_t size = 10; | 
| 57 |   uint8_t *ptr = memory_pool_allocate(size); | 
 |  | 
| 58 |   if (ptr == NULL) { | 
 | 2  |  | Assuming 'ptr' is not equal to NULL |  |  
  | 
 |  | 
| 59 |     return 0; | 
| 60 |   } | 
| 61 |   | 
| 62 |    | 
| 63 |   const uint8_t return_code = ((uint32_t)(uintptr_t)ptr) ? 0xa5 : 0xef; | 
 |  | 
| 64 |   if (return_code == 0xa5) { | 
 |  | 
| 65 |     memory_pool_free(ptr); | 
 | 6  |  | Attempt to free released memory |  
  | 
| 66 |   } | 
| 67 |   | 
| 68 |   memset(ptr, 0x5e, size); | 
| 69 |   return 0; | 
| 70 | } | 
| 71 |   | 
| 72 | uint32_t example_project_run_memory_leak_examples(void) { | 
| 73 |   return example_malloc_free() + example_access_garbage() + example_memory_leak() + example_use_after_free(); | 
| 74 | } |