【问题标题】:False "value computed is not used" warning [duplicate]错误的“未使用计算的值”警告[重复]
【发布时间】:2014-10-28 18:22:40
【问题描述】:

我正在使用以下函数维护一些丑陋的遗留代码,我得到了

warning: value computed is not used

对于下面由 cmets 标记的行:

void ReadKeyValuePipe(char* buffer, char* key, char* value) {
    char* pos;
    char key_str[1024];
    char* val = value;
    sprintf(key_str,"%s:",key);
    if((pos = strstr(buffer,key))) {
        pos += strlen(key_str);
        while (*pos && *pos != '|') {
            *val = *pos;
            *val++; // this is actually used
            *pos++; // so is this
        }
        *val = 0;
    }
}

当我删除这些行时,代码会中断。这是有道理的,因为它们似乎是递增的标记。

我如何让编译器识别出这些计算实际上被使用了?

【问题讨论】:

  • 它们没有被使用 - 查看链接的副本。
  • 我会更关心调用sprintf 导致的潜在缓冲区溢出。至少,请输入assert(strlen(key) + 2 <= sizeof(key_str));
  • @Casey 这整个函数对我来说似乎是错误的做法,但我必须选择我的战斗。
  • WTF? key_str 仅用于计算1 + strlen(key) 的效率低下?那应该是strstr(buffer, key_str) 吗?这个功能实在是太可怕了。
  • 说真的。如果我要重写这个函数,我只需将任何char* 转换为string 并使用string splitting 来完成。

标签: c++ c c++11 gcc-warning gcc4.7


【解决方案1】:

您正在取消引用 valpos,然后将它们递增,但您从不使用取消引用的结果。您可以将这些行替换为:

*val = *pos;
++val;
++pos;

或者,可能是在有人“修复”它之前的原始代码:

*val++ = *pos++;

【讨论】:

    【解决方案2】:

    如果您确定您的代码是正确的,您可以使用-Wno-unused-value 编译器选项。 这不是,因为你显然不知道 *val++; 做了什么。

    *val++; 
    *pos++; 
    

    等同于:

     val++;
     pos++;
    

    【讨论】:

    • 这种方法的问题是这个丑陋的遗留代码和我的新添加有时确实有实际未使用的值,我依靠警告来识别和消除它。 (我不是投票给你的人)。
    • 您可以使用pragma GCC diagnostic ignored 方法仅将-Wno-unused-value 应用于有问题的几行代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 2020-05-25
    • 1970-01-01
    相关资源
    最近更新 更多