Skip to content

[Code scan] Reject zero interpolation counts in line-mode KPOINTS #7564

Description

@njzjz

This issue is a result of a Codex global repository scan.

Line-mode KPOINTS parsing allows nkl[iks] == 0 via assert(nkl[iks] >= 0). Later, each segment divides by nkl[iks - 1], so a zero count causes division by zero. In release builds, the assert is removed entirely.

for (int iks = 0; iks < nks_special; iks++)
{
ifk >> ks[iks].x;
ifk >> ks[iks].y;
ifk >> ks[iks].z;
ModuleBase::GlobalFunc::READ_VALUE(ifk, nkl[iks]);
assert(nkl[iks] >= 0);
nkstot += nkl[iks];
/* ISSUE#3482: to distinguish different kline segments */
if ((nkl[iks] == 1) && (iks != (nks_special - 1))) {
kpt_segid++;
}
kpt_segids.push_back(kpt_segid);
}
assert(nkl[nks_special - 1] == 1);
// std::cout << " nkstot = " << nkstot << std::endl;
this->renew(nkstot * nspin); // mohan fix bug 2009-09-01
int count = 0;
for (int iks = 1; iks < nks_special; iks++)
{
double dxs = (ks[iks].x - ks[iks - 1].x) / nkl[iks - 1];
double dys = (ks[iks].y - ks[iks - 1].y) / nkl[iks - 1];
double dzs = (ks[iks].z - ks[iks - 1].z) / nkl[iks - 1];

Relevant code:

ModuleBase::GlobalFunc::READ_VALUE(ifk, nkl[iks]);

assert(nkl[iks] >= 0);
nkstot += nkl[iks];
...
double dxs = (ks[iks].x - ks[iks - 1].x) / nkl[iks - 1];
double dys = (ks[iks].y - ks[iks - 1].y) / nkl[iks - 1];
double dzs = (ks[iks].z - ks[iks - 1].z) / nkl[iks - 1];

Suggested fix:

Validate nkl[iks] > 0 for all segment counts used as divisors and report an input error at runtime rather than relying on debug-only assertions.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    Status
    Todo

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions