From e7b56c2d315c31ec64696dbaca9550071633aef4 Mon Sep 17 00:00:00 2001 From: Berthold Stoeger Date: Sun, 25 Oct 2020 23:01:03 +0100 Subject: [PATCH] filter: use 64-bit integer literal for generating bit fields For multiple-choice constraints we use a bit field of type uint64_t. This means we theoretically support up to 64 items. Currently use at most seven. Coverity complained (correctly) that we use the expression "1 << x" to generate the bitfields. However 1 is a 32-bit literal on most platforms, which makes this undefined behavior for x >= 32. Change the integer literal to 64-bit 1ULL. Moreover, when detecting items with an index >= 64, don't even attempt to set the according bit, since this is undefined behavior and the compiler is free to do as it pleases in such a case. Signed-off-by: Berthold Stoeger --- core/filterconstraint.cpp | 2 +- desktop-widgets/filterconstraintwidget.cpp | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/core/filterconstraint.cpp b/core/filterconstraint.cpp index 6922f1530..54654457f 100644 --- a/core/filterconstraint.cpp +++ b/core/filterconstraint.cpp @@ -1059,7 +1059,7 @@ static bool check_year_range(const filter_constraint &c, const struct dive *d) static bool check_multiple_choice(const filter_constraint &c, int v) { - bool has_bit = c.data.multiple_choice & (1 << v); + bool has_bit = c.data.multiple_choice & (1ULL << v); return has_bit != c.negate; } diff --git a/desktop-widgets/filterconstraintwidget.cpp b/desktop-widgets/filterconstraintwidget.cpp index 441ab73ea..418fca0d5 100644 --- a/desktop-widgets/filterconstraintwidget.cpp +++ b/desktop-widgets/filterconstraintwidget.cpp @@ -324,7 +324,7 @@ void FilterConstraintWidget::update() if (multipleChoice) { uint64_t bits = idx.data(FilterConstraintModel::MULTIPLE_CHOICE_ROLE).value(); for (int i = 0; i < multipleChoice->count(); ++i) - multipleChoice->item(i)->setSelected(bits & (1 << i)); + multipleChoice->item(i)->setSelected(bits & (1ULL << i)); } // Update the unit strings in case the locale was changed @@ -392,9 +392,11 @@ void FilterConstraintWidget::multipleChoiceEdited() uint64_t bits = 0; for (const QModelIndex &idx: multipleChoice->selectionModel()->selectedIndexes()) { int row = idx.row(); - if (row >= 64) + if (row >= 64) { qWarning("FilterConstraint: multiple-choice with more than 64 entries not supported"); - bits |= 1 << row; + continue; + } + bits |= 1ULL << row; } QModelIndex idx = model->index(row, 0); model->setData(idx, qulonglong(bits), FilterConstraintModel::MULTIPLE_CHOICE_ROLE);