Skip to content

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

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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