Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
S
slash
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
uplex-varnish
slash
Commits
a7e26a24
Unverified
Commit
a7e26a24
authored
Jul 10, 2023
by
Nils Goroll
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Improve safety of log2 functions
parent
b82a7f0d
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
22 additions
and
2 deletions
+22
-2
buddy.c
src/buddy.c
+16
-0
buddy_util.h
src/buddy_util.h
+6
-2
No files found.
src/buddy.c
View file @
a7e26a24
...
@@ -2785,9 +2785,25 @@ t_buddy(size_t free)
...
@@ -2785,9 +2785,25 @@ t_buddy(size_t free)
BUDDYF
(
fini
)(
&
buddy
,
BUDDYF
(
unmap
),
NULL
,
NULL
,
NULL
);
BUDDYF
(
fini
)(
&
buddy
,
BUDDYF
(
unmap
),
NULL
,
NULL
,
NULL
);
}
}
static
void
t_log2
(
size_t
min
,
size_t
max
)
{
size_t
s
;
assert
(
min
>
0
);
for
(
s
=
min
;
s
<=
max
;
s
++
)
{
assert
(
log2down
(
s
)
==
log2up
(
s
+
1
)
-
1
);
}
fprintf
(
stderr
,
"log2 %zu..%zu OK
\n
"
,
min
,
max
);
}
int
main
(
void
)
int
main
(
void
)
{
{
t_cramlimit
();
t_cramlimit
();
t_log2
(
1
,
(
size_t
)
1
<<
30
);
t_log2
(
SIZE_MAX
-
5
,
SIZE_MAX
-
1
);
assert
(
log2up
(
SIZE_MAX
)
==
sizeof
(
size_t
)
*
8
);
assert
(
log2down
(
SIZE_MAX
)
==
sizeof
(
size_t
)
*
8
-
1
);
t_bitf
();
t_bitf
();
t_buddy
(
1
<<
15
);
t_buddy
(
1
<<
15
);
t_buddy
((
1
<<
15
)
-
1
);
t_buddy
((
1
<<
15
)
-
1
);
...
...
src/buddy_util.h
View file @
a7e26a24
...
@@ -50,7 +50,9 @@ rdown_min(size_t size, unsigned minbits)
...
@@ -50,7 +50,9 @@ rdown_min(size_t size, unsigned minbits)
static
inline
unsigned
static
inline
unsigned
log2up
(
size_t
sz
)
log2up
(
size_t
sz
)
{
{
if
(
sz
==
1
)
return
(
0
);
assert
(
sz
>
1
);
sz
--
;
sz
--
;
sz
=
bitsof
(
sz
);
sz
=
bitsof
(
sz
);
assert
(
sz
>
0
);
assert
(
sz
>
0
);
...
@@ -58,11 +60,13 @@ log2up(size_t sz)
...
@@ -58,11 +60,13 @@ log2up(size_t sz)
return
((
unsigned
)
sz
);
return
((
unsigned
)
sz
);
}
}
// #define log2down(x) (log2up(x+1) - 1)
/* prev log 2 of sz */
/* prev log 2 of sz */
static
inline
unsigned
static
inline
unsigned
log2down
(
size_t
sz
)
log2down
(
size_t
sz
)
{
{
assert
(
sz
>
0
);
sz
=
bitsof
(
sz
)
-
1
;
sz
=
bitsof
(
sz
)
-
1
;
assert
(
sz
<=
UINT_MAX
);
assert
(
sz
<=
UINT_MAX
);
return
((
unsigned
)
sz
);
return
((
unsigned
)
sz
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment