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); |
| 1 | Storing uninitialized value | |
|
24 | if (ptr == NULL) { |
| 2 | | Assuming 'ptr' is not equal to NULL | |
|
| |
25 | return 0; |
26 | } |
27 | |
28 | |
29 | uint32_t sum = 0; |
30 | for (size_t i = 0; i < size; i++) { |
| |
| 5 | | Loop condition is true. Entering loop body | |
|
31 | sum += ptr[i]; |
| 6 | | Assigned value is garbage or undefined |
|
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) { |
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); |
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 | } |