Skip to content

NOTE: Please always add static_assert on datatype before using FmtCore::format #4576

@kirk0830

Description

@kirk0830

Describe the Code Quality Issue

After a very long time debugging, @jinzx10, @caic99 and I find the bug reported by issue #4540.
See the following code piece:

std::vector<double> ibz2bz(this->nkstot);

what will happen if:
for (int ik = 0; ik < nkstot_ibz; ik++)
{
table += FmtCore::format("%8d%12.8f%12.8f%12.8f%8.4f%8d\n",
ik + 1,
kvec_d_ibz[ik].x,
kvec_d_ibz[ik].y,
kvec_d_ibz[ik].z,
wk_ibz[ik],
ibz2bz[ik]);
}

?
It will trigger an undefined behavior because the double is parsed like int by formatter (the ABACUS in-built library for formatting strings, implemented in module_base/formatter.h), that cases recent failure in integrated test.

The implementation of function FmtCore::format is quite simple:

template<typename... Ts>
static inline std::string format(const char* fmt, const Ts&... args)
{
const int size = snprintf(nullptr, 0, fmt, FmtCore::filter(args)...) + 1;
std::string dst(size, ' ');
const int size_filled = snprintf(&dst[0], size, fmt, FmtCore::filter(args)...);
dst.resize(size_filled);
return dst;
}

But the c-style function snprintf itself cannot identify the datatype. So I would suggest to use something like static_assert before using this function.

Additional Context

No response

Task list for Issue attackers (only for developers)

  • Identify the specific code file or section with the code quality issue.
  • Investigate the issue and determine the root cause.
  • Research best practices and potential solutions for the identified issue.
  • Refactor the code to improve code quality, following the suggested solution.
  • Ensure the refactored code adheres to the project's coding standards.
  • Test the refactored code to ensure it functions as expected.
  • Update any relevant documentation, if necessary.
  • Submit a pull request with the refactored code and a description of the changes made.

Metadata

Metadata

Labels

Useful InformationUseful information for others to learn/study

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions