diff options
| author | chenzizhan <[email protected]> | 2024-04-19 17:50:07 +0800 |
|---|---|---|
| committer | chenzizhan <[email protected]> | 2024-04-19 17:50:07 +0800 |
| commit | 73d8bbead87ba04e0762831b7e402ae0833de38d (patch) | |
| tree | 11d85e3fd7d180eccff1982559a79bf046dcaff9 /src/metrics | |
| parent | ba621ef1c677e1a5ad6ffab6dcd4d771916cd27e (diff) | |
safe add
Diffstat (limited to 'src/metrics')
| -rw-r--r-- | src/metrics/metric.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/src/metrics/metric.c b/src/metrics/metric.c index 887102a..95b7200 100644 --- a/src/metrics/metric.c +++ b/src/metrics/metric.c @@ -4,6 +4,8 @@ #include <assert.h> #include <string.h> #include <stdarg.h> +#include <limits.h> + #include "uthash.h" #include "histogram_encoder.h" @@ -711,11 +713,22 @@ struct metric *metric_counter_new(const char *name) return pthis; } +long long safe_add_longlong(long long a, long long b) +{ + if (a > 0 && b > LLONG_MAX - a) { + return LLONG_MAX; + } + if (a < 0 && b < LLONG_MIN - a) { + return LLONG_MIN; + } + return a + b; +} + void metric_counter_incrby(struct metric *pthis, int cell_id, long long value) { struct metric_measure_data *data = metric_find_or_new_cell(pthis, cell_id); struct metric_counter_or_gauge *counter = data->counter; - counter->value += value; + counter->value = safe_add_longlong(counter->value, value); } int metric_counter_set(struct metric *pthis, int cell_id, long long value) |
