Сделать компилятор VS ловить подписанные / неподписанные назначения? - PullRequest
3 голосов
/ 16 сентября 2008

Компилятор 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

Ответы [ 3 ]

6 голосов
/ 16 сентября 2008

Вам нужно включить предупреждение 4365, чтобы поймать назначение.

Это может быть сложно - вам нужно включить ВСЕ предупреждения - используйте / Wall, который включает много предупреждений, поэтому у вас могут возникнуть проблемы с отображением предупреждения, но это так.

2 голосов
/ 03 февраля 2011

Вы можете изменить уровень любого конкретного предупреждения, используя / W [уровень] [код]. Таким образом, в этом случае / W34365 превратит предупреждение 4365 в предупреждение уровня 3. Если вы делаете это много, вам может быть полезно поместить эти параметры в текстовый файл и использовать параметр @ [file] для упрощения командной строки.

0 голосов
/ 16 сентября 2008

@ 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) ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...