Skip to content

Commit 93a214b

Browse files
authored
Merge pull request #72 from qbojj/array-bounds
add sized_by and counted_by annotations
2 parents 87c031c + 21ebe97 commit 93a214b

5 files changed

Lines changed: 26 additions & 9 deletions

File tree

include/stdbigos/array_sizes.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#ifndef _STDBIGOS_ARRAY_SIZES_H
2+
#define _STDBIGOS_ARRAY_SIZES_H
3+
4+
#if __has_attribute(__counted_by__)
5+
#define __counted_by(member) __attribute__((__counted_by__(member)))
6+
#else
7+
#define __counted_by(member)
8+
#endif
9+
10+
#if __has_attribute(__sized_by__)
11+
#define __sized_by(member) __attribute__((__sized_by__(member)))
12+
#else
13+
#define __sized_by(member)
14+
#endif
15+
16+
#endif

include/stdbigos/buffer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
#ifndef _STDBIGOS_BUFFER_H
22
#define _STDBIGOS_BUFFER_H
33

4+
#include <stdbigos/array_sizes.h>
45
#include <stdbigos/types.h>
56

67
typedef struct buffer_t {
7-
const void* data;
88
size_t size;
9+
const void* data __sized_by(size);
910
} buffer_t;
1011

1112
// Helpers to create buffers

src/kernel/memory_management/include/common_types.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
#ifndef KERNEL_MEMORY_MANAGEMENT_COMMON_TYPES
22
#define KERNEL_MEMORY_MANAGEMENT_COMMON_TYPES
33

4-
#include <stdbigos/address.h>
4+
#include <stdbigos/array_sizes.h>
55
#include <stdbigos/types.h>
66

77
typedef struct {
8-
void* addr;
98
size_t size;
9+
void* addr __sized_by(size);
1010
} memory_region_t;
1111
// memory_region_t represents a contiguous range of valid, addressable memory.
1212

1313
typedef struct {
14-
uintptr_t addr;
1514
size_t size;
15+
uintptr_t addr;
1616
} memory_area_t;
1717
// memory_area_t represents a range of memory, which isn't necessarily addressable.
1818

src/kernel/memory_management/include/physical_memory/manager.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
typedef __phys void* phys_addr_t;
1010

1111
typedef struct {
12-
phys_addr_t addr;
1312
size_t size;
13+
phys_addr_t addr __sized_by(size);
1414
} physical_memory_region_t;
1515

1616
static inline memory_area_t pmr_to_area(physical_memory_region_t region) {

src/kernel/memory_management/physical_memory/manager.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ static error_t add_region_pair(memory_region_pair_t regp, memory_region_pair_t*
7171

7272
static error_t find_free_subregion(const memory_area_t* res_regs, u32 count, physical_memory_region_t reg, u32 size,
7373
physical_memory_region_t* regOUT) {
74-
*regOUT = (physical_memory_region_t){nullptr, 0};
74+
*regOUT = (physical_memory_region_t){0};
7575
bool found = true;
7676
phys_addr_t reg_end = reg.addr + reg.size;
7777
while (reg.addr < reg_end) {
@@ -111,7 +111,7 @@ error_t phys_mem_init(physical_memory_region_t prim_reg, const memory_area_t* re
111111
"permitted, but is probably a mistake!");
112112
}
113113
#endif
114-
physical_memory_region_t res_regs_alloc_region = {nullptr, 0};
114+
physical_memory_region_t res_regs_alloc_region = {0};
115115
error_t err = find_free_subregion(res_regs, res_regs_count, prim_reg, _4kB, &res_regs_alloc_region);
116116
if (err)
117117
KLOG_DO_RETURN(err, KLRF_TRACE_ERR | KLRF_END_BLOCK);
@@ -131,7 +131,7 @@ error_t phys_mem_init(physical_memory_region_t prim_reg, const memory_area_t* re
131131
if (err)
132132
KLOG_DO_RETURN(err, KLRF_TRACE_ERR | KLRF_END_BLOCK);
133133

134-
physical_memory_region_t allocation_regions = {nullptr, 0};
134+
physical_memory_region_t allocation_regions = {0};
135135
err = find_free_subregion(reserved_areas_array, g_reserved_regions.count, prim_reg, _4kB, &allocation_regions);
136136
if (err)
137137
KLOG_DO_RETURN(err, KLRF_TRACE_ERR | KLRF_END_BLOCK);
@@ -154,7 +154,7 @@ error_t phys_mem_add_region(physical_memory_region_t reg) {
154154
KLOGLN_TRACE("Adding a region [%p - %p] to physical memory manager...", reg.addr, reg.addr + reg.size);
155155
memory_area_t* reserved_areas_array = get_reserved_areas_array();
156156
size_t header_size = pmallocator_get_header_size(pmr_to_area(reg));
157-
physical_memory_region_t header_reg = {nullptr, 0};
157+
physical_memory_region_t header_reg = {0};
158158
KLOGLN_TRACE("Allocating header region...");
159159
error_t err = find_free_subregion(reserved_areas_array, g_reserved_regions.count, reg, header_size, &header_reg);
160160
if (err)

0 commit comments

Comments
 (0)