强制VS2008发出类似于“警告:有符号和无符号整数表达式之间的比较”的GCC警告

4

GCC,C中将'int'转换为'size_t'可能会改变结果的符号所述的情形类似,我希望确保我在GCC 4.2.1下收到的警告也会在32位和64位编译下的VS2008 SP1中被标记出来,而不是禁用GCC下的警告以适应VS2008。

例如,在64位条件下的GCC 4.2.1下,我们可以看到在-Wall条件下以下内容作为警告显示:

#include <string.h>
bool foo()
{
    size_t len = 0;
    const char * someBuffer = "flubber";
    len = strlen(someBuffer);
    bool retval = false;
    for (int j = 0; j < len; j++) // <-- warning
    {
        if (someBuffer[j] != '0')
        {
            retval = true;
            break;
        }
    }
    return retval;
}

这个 GCC 的警告是:

warning: comparison between signed and unsigned integer expressions

但是,无论我尝试使用什么类型的编译器指令或者使用/W3或/W4或/w3某个警告号码或/w4某个警告号码等开启哪些编译器选项,VS2008 SP1 64位编译器都没有标记出来。

现在,我不想降低GCC警告级别或禁用警告,因为他们在那里有非常好的理由。因此,当/ WX被启用时,我希望VS构建以类似的方式失败。这是我必须接受的事情,还是有一些警告可以在VS2008上完成任务?

编辑:使用相同的编译器选项,在32位构建中显示该警告,但在64位构建中未显示:

/O2
/Ob2
/D "WIN32"
/D "_WINDOWS"
/D "NDEBUG"
/D "_CRT_SECURE_NO_WARNINGS"
/D "__WIN32__"
/D "_SCL_SECURE_NO_WARNINGS"
/D "_BIND_TO_CURRENT_MFC_VERSION"
/D "_BIND_TO_CURRENT_CRT_VERSION"
/D "WINVER=0x0502"
/D "_WIN32_WINNT=0x0502"
/D "_WIN32"
/D "_NT"
/D "_CRT_NONSTDC_NO_WARNINGS"
/D "_MBCS"
/FD
/EHsc
/MD
/W3
/WX
/TP
/Zm1000

编辑#1:由于这可能是Visual Studio的怪癖,我发布了Visual C++ Developer Center - 在64位Windows下,在VS2008 SP1下进行32位但不进行64位编译时发出警告C4018:'<':签名/无符号不匹配

编辑#2:我被引导从Visual C++ Developer Center posting内部发布到Microsoft Connect,并且今天(2011-01-11)Microsoft回答了我的问题并将其验证为编译器问题:他们表示该问题将添加到待修复的后续版本中:Microsoft Connect - 警告C4018:'<':仅在相同大小的类型之间发出签名/无符号不匹配

2个回答

1

出了些问题,那行代码应该并将生成所需的“warning C4018:'<':signed/unsigned mismatch”。

这是我的测试项目编译器设置,如果有帮助的话:

/Od /D“WIN32”/D“_DEBUG”/D“_CONSOLE”/D“_UNICODE”/D“UNICODE”/Gm/EHsc/RTC1/MDd/Yu“stdafx.h”/Fp“Debug\testproj1.pch”/Fo“Debug\”/Fd“Debug\vc90.pdb”/W3/nologo/c/ZI/TP/errorReport:prompt

编辑:这是在32位Visual Studio上测试的,但您正在询问64位编译,因此此信息与您无关,请见谅。


是的,你说得对,在32位构建下它似乎会显示警告,但在64位构建下不会。 - bgoodr
我已经编辑了主要问题,包括您的发现,并列出了我使用的编译选项。 - bgoodr

0
回答自己的问题:请参见我在原问题区域中的第二次编辑。微软现在已经确认这是编译器问题。

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