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 | } |