The HDLC encoder accumulated bits into m_bits using the |= operator
without first initializing the first byte. This resulted in an
uninitialized read of m_bits[0] when encoding the first bit of a
packet.
Initialize each output byte when writing its first bit, ensuring the
buffer contains a defined value before bits are OR'ed into it. This
also makes addBit() self-contained, eliminating the need for callers to
pre-initialize the current output byte.
Reported by Coverity.
Signed-off-by: Robin Getz <rgetz503@gmail.com>
Cppcheck reported several AISModSource members that were not initialized
by the constructor. Initialize the remaining scalar members in the
constructor initializer list to establish a well-defined initial state
and avoid undefined behavior if they are accessed before being assigned.
Reported by cppcheck.
Signed-off-by: Robin Getz <rgetz503@gmail.com>
Replace variable length arrays in SumProductAlgorithm::finalp() with a
std::vector buffers.
This removes reliance on compiler VLA extensions while preserving the
existing contiguous temporary buffer layout.
Signed-off-by: Robin Getz <rgetz503@gmail.com>
Replace variable length arrays in LambdaMinAlgorithm::finalp() with
std::vector storage.
Update nth_element() usage to operate on vector iterators while removing
the non-standard VLA usage.
Signed-off-by: Robin Getz <rgetz503@gmail.com>
Replace variable length arrays in LogDomainSPA::finalp() with
std::vector buffers.
This removes reliance on compiler VLA extensions while preserving the
existing contiguous temporary buffer layout.
Signed-off-by: Robin Getz <rgetz503@gmail.com>
Replace the variable length temporary array in the int8_t FACTOR
specialization of MinSumCAlgorithm::finalp() with a std::vector buffer.
This removes reliance on compiler VLA extensions and uses standard C++
storage for the temporary reduction buffer.
Signed-off-by: Robin Getz <rgetz503@gmail.com>
Replace the variable length temporary array in the float FACTOR
specialization of MinSumCAlgorithm::finalp() with a std::vector buffer.
This removes reliance on compiler VLA extensions and uses standard C++
storage for the temporary reduction buffer.
Signed-off-by: Robin Getz <rgetz503@gmail.com>
Replace the variable length temporary array in MinSumCAlgorithm::finalp()
with a std::vector buffer.
This removes reliance on compiler VLA extensions and uses standard C++
storage for the temporary reduction buffer.
Signed-off-by: Robin Getz <rgetz503@gmail.com>
Replace variable length arrays in the int8_t FACTOR specialization of
OffsetMinSumAlgorithm::finalp() with a single std::vector scratch buffer.
This removes reliance on compiler VLA extensions while preserving the
existing contiguous temporary buffer layout.
Signed-off-by: Robin Getz <rgetz503@gmail.com>
Replace variable length arrays in OffsetMinSumAlgorithm::finalp() with a
std::vector buffers.
This removes reliance on compiler VLA extensions while preserving the
existing contiguous temporary buffer layout.
Signed-off-by: Robin Getz <rgetz503@gmail.com>
Replace variable length arrays in the int8_t specialization of
MinSumAlgorithm::finalp() with a single std::vector scratch buffer.
This removes reliance on compiler VLA extensions while preserving the
existing contiguous temporary buffer layout.
Signed-off-by: Robin Getz <rgetz503@gmail.com>
Replace variable length arrays in the float specialization of
MinSumAlgorithm::finalp() with std::vector storage.
This removes reliance on compiler VLA extensions and keeps the
temporary buffers managed by standard C++ containers.
Signed-off-by: Robin Getz <rgetz503@gmail.com>
The channel count comparison in getChannelsByDevice() accidentally used
the first plan's channel count for both operands. This caused the comparator
to always treat the channel counts as equal and sort only by bandwidth.
Use the second plan's channel count when comparing RRTurnPlans so plans are
ordered correctly by number of channels before applying the bandwidth
tie-breaker.
Signed-off-by: Robin Getz <rgetz503@gmail.com>
Replace variable length arrays in MinSumAlgorithm::finalp() with a
std::vector buffers.
Variable length arrays are a compiler extension and are not part of
standard C++. The replacement preserves the existing contiguous memory
layout while avoiding non-standard stack allocations.
Signed-off-by: Robin Getz <rgetz503@gmail.com>
Fix a signed/unsigned arithmetic issue in ValueDialZ::keyPressEvent()
reported by cppcheck.
The digit editing code used quint64 intermediates together with a signed
sign value:
int sign = m_value < 0 ? -1 : 1;
setValue(sign * v);
When editing negative values, the signed -1 was converted to an unsigned
value before multiplication, causing the result to wrap instead of
producing a negative value.
Use qint64 intermediates for the digit manipulation and apply the existing
sign explicitly when updating the value. This preserves correct behavior
when editing negative values and avoids the unintended unsigned conversion.
Signed-off-by: Robin Getz <rgetz503@gmail.com>
Replace raw memset() initialization of hist with C++ value initialization.
This avoids bypassing std::complex object initialization and ensures the
history buffer contains valid constructed objects when HIST_FLOAT is enabled.
The previous memset() relied on the in-memory representation of
std::complex<float> and could leave non-trivial objects improperly
initialized. While this typically behaved as expected with common
implementations, it was not valid C++ object initialization.
pointed out by cppcheck as:
Using 'memset' on struct that contains a 'std::complex'
Signed-off-by: Robin Getz <rgetz503@gmail.com>
Fix cppcheck warning:
Using iterator to member container 'm_sinkBuddies' that may be invalid
clearBuddiesLists() was iterating directly over m_sourceBuddies and
m_sinkBuddies while calling removeBuddy(), which modifies the buddy
relationship lists. This could invalidate the active iterator and result in
undefined behavior.
The issue could lead to intermittent failures during buddy cleanup operations,
such as device removal, device reload, or application shutdown, depending on
container state and timing.
Iterate over copies of the buddy lists so that removing relationships does not
affect the iterators used for traversal.
Signed-off-by: Robin Getz <rgetz503@gmail.com>
In std::vector<T,Allocator>::erase, The iterator pos must be valid and
dereferenceable. Thus the end() iterator (which is valid, but is not
dereferenceable) cannot be used as a value for pos.
Protect against that by checking the result of std::find() before erasing
a buddy entry. The buddy should always be present when removeBuddy() is
called, but avoid undefined behavior if that assumption is violated.
Signed-off-by: Robin Getz <rgetz503@gmail.com>
The signed 64-bit deserialization code used a signed temporary value while
assembling bytes:
tmp = (tmp << 8) | byte;
For negative values, tmp was initialized to -1 for sign extension. Left-shifting
this negative value is undefined behavior in C++.
Use an unsigned temporary while constructing the 64-bit representation and
convert to qint64 after all bytes have been assembled. This preserves the
existing two's complement sign handling while avoiding undefined behavior.
Fixes static analysis warning about shifting a negative value.
Signed-off-by: Robin Getz <rgetz503@gmail.com>
The signed integer deserialization code used a signed temporary value while
assembling bytes:
tmp = (tmp << 8) | byte;
For negative values, tmp was initialized to -1 for sign extension, causing a
left shift of a negative value, which is undefined behavior in C++.
Use an unsigned temporary while constructing the 32-bit representation and
convert to qint32 only after all bytes have been assembled. This preserves the
existing two's complement sign handling while avoiding undefined signed shifts.
Fixes static analysis (cppcheck) warning about shifting a negative value.
Signed-off-by: Robin Getz <rgetz503@gmail.com>
The gf2n implementation used a left shift on a potentially negative
value when masking field elements:
(~(Te)0) << N
This can result in undefined behavior for signed integer types and was
reported by static analysis (cppcheck).
Require the field element type to be unsigned and replace the mask
generation with an explicit N-bit mask constructed from the element type.
Also make the overflow check use the element type to avoid implicit
signed integer operations.
Add comments documenting the packed polynomial representation and the
GF(2^N) reduction steps to clarify the intent of the bit operations.
Fixes static analysis warning about shifting negative values.
Signed-off-by: Robin Getz <rgetz503@gmail.com>
cppcheck reported that the displayTableSettings() declaration argument
order differed from the function definition. The header declared the
arguments as (columnIndexes, columnSizes), while the implementation and
all call sites use (columnSizes, columnIndexes).
Update the declaration to match the implementation and remove ambiguity
between the table column width and ordering arrays.
Signed-off-by: Robin Getz <rgetz503@gmail.com>
cppcheck reported that the addToPowerFilter() declaration argument
order differed from the function definition. The header declared the
arguments as (y, x), while the implementation and all call sites use
(x, y).
Update the declaration to match the implementation and callers to avoid
confusion and potential misuse of the function arguments.
Signed-off-by: Robin Getz <rgetz503@gmail.com>
Cppcheck reported that setAlpha() could call log() with an argument of
zero when alpha is clamped to 0.0f, resulting in an invalid-domain
mathematical operation.
Initialize tau to 0.0f and only compute the logarithm when alpha is
strictly positive. This preserves the existing behavior while avoiding
the invalid log(0) call.
Signed-off-by: Robin Getz <rgetz503@gmail.com>
cppcheck identified that LogSlider::LogSlider() calls the derived
setRange(double, double) overload instead of QSlider::setRange(int, int)
due to C++ name hiding.
The constructor's call to:
setRange(0, 1000);
was therefore invoking the logarithmic range implementation with
min == 0.0, resulting in a call to log10(0). While most callers
immediately replace the initial state by calling LogSlider::setRange()
with a valid positive range, the constructor still performs an invalid
mathematical operation during initialization.
Explicitly qualify the call as QSlider::setRange(0, 1000) to initialize
the underlying slider without invoking the logarithmic overload. This
eliminates the invalid-domain call, avoids undefined behavior from
propagating exceptional floating-point values into the slider state, and
makes the constructor's intent explicit.
This change has no functional impact on normal operation, but removes a
latent initialization bug and prevents future regressions caused by
overload hiding.
Signed-off-by: Robin Getz <rgetz503@gmail.com>
Remove an inadvertent '>' character from the
QCoreApplication::applicationVersion() call in the startup version
logging for both appbench and appsrv.
This typo was identified by cppcheck during static analysis. Correcting
the expression restores valid C++ syntax, allowing the applications to
compile correctly and report their version information in the startup
log.
Signed-off-by: Robin Getz <rgetz503@gmail.com>