Audit finding
- ID:
AUD-011
- Status: Verified defect
- Severity: High
- Confidence: High
- Audited revision:
2f479320d805a1f9f35ebe4afaaeeded48913a94
Problem
ContinuousToDiscrete::Invert() discards the Boolean result of LuDecomposition::Decompose() and calls Inverse() unconditionally.
Source:
|
math::SquareMatrix<T, StateSize> |
|
ContinuousToDiscrete<T, StateSize, InputSize, OutputSize>::Invert(const math::SquareMatrix<T, StateSize>& a) |
|
{ |
|
solvers::LuDecomposition<T, StateSize> lu{}; |
|
lu.Decompose(a); |
|
return lu.Inverse(); |
|
} |
Reproduction
For scalar A=2 and Ts=1, Tustin requires inversion of 2I/Ts - A = 0. UBSan reports division by zero in the upper-triangular solve, while Convert() returns normally.
Acceptance criteria
Audit finding
AUD-0112f479320d805a1f9f35ebe4afaaeeded48913a94Problem
ContinuousToDiscrete::Invert()discards the Boolean result ofLuDecomposition::Decompose()and callsInverse()unconditionally.Source:
numerical-toolbox-cpp/numerical/control_analysis/ContinuousToDiscrete.hpp
Lines 47 to 53 in 2f47932
Reproduction
For scalar
A=2andTs=1, Tustin requires inversion of2I/Ts - A = 0. UBSan reports division by zero in the upper-triangular solve, whileConvert()returns normally.Acceptance criteria
std::optionalor explicit status.