使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选项会发生这种情况)。