mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-24 21:34:08 +03:00
Add saturate_add() that generalizes size_add()
This commit is contained in:
parent
d1b8e56a62
commit
8b0c43475a
@ -457,8 +457,15 @@ static inline int __coverity_check_and_return__(int condition) {
|
||||
_copy; \
|
||||
})
|
||||
|
||||
#define saturate_add(x, y, limit) \
|
||||
({ \
|
||||
typeof(limit) _x = (x); \
|
||||
typeof(limit) _y = (y); \
|
||||
_x > (limit) || _y >= (limit) - _x ? (limit) : _x + _y; \
|
||||
})
|
||||
|
||||
static inline size_t size_add(size_t x, size_t y) {
|
||||
return y >= SIZE_MAX - x ? SIZE_MAX : x + y;
|
||||
return saturate_add(x, y, SIZE_MAX);
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
|
@ -6,6 +6,15 @@
|
||||
#include "macro.h"
|
||||
#include "tests.h"
|
||||
|
||||
TEST(saturate_add) {
|
||||
assert_se(saturate_add(1, 2, UINT8_MAX) == 3);
|
||||
assert_se(saturate_add(1, UINT8_MAX-2, UINT8_MAX) == UINT8_MAX-1);
|
||||
assert_se(saturate_add(1, UINT8_MAX-1, UINT8_MAX) == UINT8_MAX);
|
||||
assert_se(saturate_add(1, UINT8_MAX, UINT8_MAX) == UINT8_MAX);
|
||||
assert_se(saturate_add(2, UINT8_MAX, UINT8_MAX) == UINT8_MAX);
|
||||
assert_se(saturate_add(60, 60, 50) == 50);
|
||||
}
|
||||
|
||||
TEST(align_power2) {
|
||||
unsigned long i, p2;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user