C++自定义字符串修剪实现valgrind警告

C++ custom string trim implementation valgrind warning

本文关键字:valgrind 警告 实现 修剪 自定义 字符串 C++      更新时间:2023-10-16

最近我实现了一个用于修剪std::字符串的自定义函数,该函数删除了空白字符前缀和后缀。

我测试了功能,它根据我的单元测试工作,但当使用valgrind运行测试时,我得到了以下输出:

==4486== Conditional jump or move depends on uninitialised value(s)
==4486==    at 0x415DDA: is_ws_char(char) (parse.cpp:22)
==4486==    by 0x415BC6: parse::trim(std::string&) (parse.cpp:34)

我的输入测试字符串是

string s("  a");

我不明白这里出了什么问题。代码如下:

inline bool is_ws_char(const char c) {    // this is line 22 in my code
  return (c == ' ' || c == 'n' || c == 't' || c == 'r');
}

void parse::trim(std::string& str) {
  size_t len = str.size();
  size_t i = 0;
  for (; i < len; ++i)
    if (!is_ws_char(str[i]))
      break;
  const size_t start = i;
  for (i = len - 1; i >= 0; --i)
    if (!is_ws_char(str[i]))              // this is line 34 in my code
      break;
  const size_t end = i;
  str = str.substr(start, end - start + 1);
}

有人知道这里出了什么问题吗?我曾短暂地认为这只是一个勇敢的怪癖,但这似乎不太可能。

提前感谢!

此循环是无效的

for (i = len - 1; i >= 0; --i)

条件将始终等于true,因为表达式--i将始终>=0,因为i是无符号整数。

同样,当str.size()等于零时,len-1将等于std::string::npos。