-
Notifications
You must be signed in to change notification settings - Fork 438
PoissonHybrid::solve(..., dz) does not validate dz length against domain extent #5048
Copy link
Copy link
Closed
Description
- Type: Correctness / Bounds safety
- Severity: High
- Component: FFT PoissonHybrid variable-spacing solve
- Location:
Src/FFT/AMReX_FFT_Poisson.H:562Src/FFT/AMReX_FFT_Poisson.H:571Src/FFT/AMReX_FFT_Poisson.H:469Src/FFT/AMReX_FFT_Poisson.H:480
Problem
The dz-based overloads pass raw pointers into TriA/TriC, which index m_dz[k] for k over the z-extent of the domain. There is no check that dz.size() matches Doma\ in().length(2).
Impact
- Out-of-bounds read when
dz.size() < nz. - Silent wrong coefficients when
dz.size() != nz. - Numerical instability and undefined behavior in tridiagonal solve setup.
Suggested patch
Add explicit size validation in both host and device-vector overloads before launching the solve.
--- a/Src/FFT/AMReX_FFT_Poisson.H
+++ b/Src/FFT/AMReX_FFT_Poisson.H
@@
void PoissonHybrid<MF>::solve (MF& soln, MF const& rhs, Gpu::DeviceVector<T> const& dz)
{
+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
+ int(dz.size()) == m_geom.Domain().length(2),
+ "FFT::PoissonHybrid: dz.size() must equal domain length in z");
+
auto const* pdz = dz.dataPtr();
solve(soln, rhs,
fft_poisson_detail::TriA<T>{pdz},
fft_poisson_detail::TriC<T>{pdz,int(dz.size())});
}
@@
void PoissonHybrid<MF>::solve (MF& soln, MF const& rhs, Vector<T> const& dz)
{
AMREX_ASSERT(soln.is_cell_centered() && rhs.is_cell_centered());
+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
+ int(dz.size()) == m_geom.Domain().length(2),
+ "FFT::PoissonHybrid: dz.size() must equal domain length in z");
@@
}Prepared by Codex
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels