Cppcheck认为我有“冗余代码:发现以数字常量开头的语句”

8

Cppcheck(版本1.46.1)会针对此类枚举发出以下警告:

enum DATABASE_TYPE
{
    DATABASE_TYPE_UNKNOWN = -1, // <- line of warning
    DATABASE_TYPE_ORACLE,
    DATABASE_TYPE_MSACCESS
};

冗余代码:发现以数字常量开头的语句

我认为这并不是冗余的。能够做到这样是非常重要的。

这是cppcheck的错误还是我没有看到什么东西?

更新

我设法将其简化为一个最小的例子。这很复杂,因为cppcheck有两个(进一步的)错误,使它看起来像是我的缩减没有效果。
有5个文件:a.ha.cppb.hb.cppinc.h,内容如下。
VC9在没有警告的情况下编译它(警告级别4)。

// a.h
#pragma once
#include "inc.h"

// a.cpp
#include "a.h"
#include "b.h"

int main()
{
    return 0;
}


// b.h
#pragma once
#include "inc.h"

// b.cpp
#include "b.h"

//inc.h
#pragma once

enum MY_ENUM_TYPE
{
    INVALID_VALUE = -1,
    FIRST_VALUE,
    SECOND_VALUE
};

到目前为止,我非常有信心认为这是cppcheck的一个错误。是否有不同的意见?

是的,这似乎是cppcheck的一个bug - #pragma once不起作用。如果你用#ifndef A_H / #define A_H / #endif头文件包装来替换它,cppcheck就不会再抱怨了。 - Johan Kotlinski
1
这似乎也是一个公认的问题:http://sourceforge.net/apps/trac/cppcheck/ticket/2417 - Johan Kotlinski
如果您更新了您的答案,我可以将其标记为已接受。 - foraidt
2个回答

6

我的猜测是:

A) invalid 在其他地方被声明或定义了。

B) 枚举在头文件中被包含了两次(没有使用头文件保护)。因为你在这段代码中得到了相同的错误:

enum SomeEnumType
{
    invalid = -1,
    first,
    second,
};

enum SomeEnumType
{
    invalid = -1, // <- line of warning
    first,
    second,
};

你的代码能用GCC编译吗?


更新:

是的,这似乎是cppcheck的一个bug - #pragma once无法正常工作。如果您用#ifndef A_H / #define A_H / #endif来替换它作为头文件包装,cppcheck就不会再抱怨了。

这也似乎是一个已知问题


"invalid"只是一个例子。实际上它看起来更像是"invalidSomeEnumType",所以它是相当独特的。 - foraidt
2
@foraidt:询问虚假代码的问题真是浪费时间。请发布真实的代码,这样我们才能解决真正的问题。 - GManNickG
@foraidt:尝试创建能够产生错误的最小示例,这样问题就会变得非常清晰。无论如何,你给它赋值为-1并不是问题,问题在于cppcheck认为“invalid”已经被定义了。如果你发现cppcheck中存在bug,请向开发人员报告,他们会很快修复它。 - Johan Kotlinski
@GMan:已经更新了。但我怀疑现在它已经没有任何用处了。仍然无法确定“无效”部分是否被多次定义,除非检查整个代码库。 - foraidt
@foraidt:好多了。:) 但是有两件事,第一,作为提问者,你通常是最不合格的人来知道需要什么信息,因为如果你确切地知道需要什么信息,你就会自己解决它。:) 话虽如此,第二,这不是关于“真实代码肯定会有所不同”,而是关于“虚假代码可能会有所不同”,我们希望这不是真的。 - GManNickG
显示剩余2条评论

-2

2
不正确的:https://dev59.com/qXVC5IYBdhLWcg3w21Mq - Johan Kotlinski
@Kotlinski:这就是我在回答中作为更新所指出的链接。然后进行了一次投票,并再次指向了我给出的同一个链接。 接受的答案明确指出: “此外,标准规定枚举使用哪种整数类型作为底层类型是实现定义的,除非某些值无法适合 int 或 unsigned int,否则不得大于 int。” - Arunmu
@Kotlinski:你怎么能这么说呢?如果实现使用无符号整数,你认为它会将负值作为负值(除非进行强制转换)吗? - Arunmu
@ArunMu: unsigned int i = -1; 会被转换为 0xffffffffu。至少在gcc上,即使使用最高级别的警告,这也可以正常工作。表示方式确实是相同的... - Johan Kotlinski
2
引用一下:“枚举的基础类型是一个整数类型,可以表示枚举中定义的所有枚举器值。”因此,答案不相关,仍然以错误的陈述开头,因此被投了反对票。 - Georg Fritzsche
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接