使VS编译器捕获有符号/无符号分配?

时间:2020-03-05 18:56:45  来源:igfitidea点击:

Visual Studio编译器似乎没有警告已签名/未签名的分配,仅在比较时才警告。例如,下面的代码将在if语句上生成警告,但不会生成初始分配。

无论如何,有什么办法让它们抓住这些?我已经在W4上了,但以为(希望)某处可能还有其他设置。

谢谢,

int foo(void)
{
    unsigned int fooUnsigned = 0xffffffff;
    int fooSigned = fooUnsigned; // no warning

    if (fooSigned < fooUnsigned) // warning
    {
        return 0;
    }

    return fooSigned;
}

更新:

Quamrana是正确的,这受警告4365的控制,该警告在默认情况下甚至在W4时也处于关闭状态。但是,我们可以像这样对给定的警告级别显式启用它;

#pragma warning (4 : 4365)

结果是;

warning C4365: 'initializing' : conversion from 'unsigned int' to 'int', signed/unsigned mismatch

解决方案

回答

我们需要启用警告4365才能捕获分配。

这可能很棘手,我们需要使用/ Wall启用所有警告来启用所有警告,因此我们可能很难看到警告的发生,但确实如此。

回答

@quamrana:

/ Wall选项之外必须有其他东西才能启用警告4365:

C:\Temp>cl /Wall /c foo.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

foo.c
foo.c(6) : warning C4018: '<' : signed/unsigned mismatch

我看到安德鲁让它起作用了,但是有人知道为什么它在这里不起作用吗?

Visual Studio文档指示应该这样做,但是我什至无法在文档中获得示例程序来发出C4365警告(尽管它确实给出了相关的C4245警告,但无论如何只有/ W4选项会发生这种情况)。