Что означает «потенциальное деление на ноль» в описании предупреждения Visual C ++ C4723? - PullRequest
0 голосов
/ 04 октября 2011

Когда я компилирую следующий код в Visual C ++ 10

int _tmain(int /*argc*/, _TCHAR* /*argv*/[])
{
    int len = strlen( "" );
    if( len / 0 ) {
        rand();
    }
}

, компилятор выдает C4723 предупреждение деление потенциала на ноль .

Что означает потенциал здесь?Мой код на C ++ ясно говорит: «делим len на ноль», каково деление потенциал ?

http://msdn.microsoft.com/en-us/library/8kd039eh.aspx

Ответы [ 4 ]

13 голосов
/ 04 октября 2011

В статье MSDN ясно, что компилятор оценивал операнд как ноль уже во время компиляции.Таким образом, potential здесь означает, что компилятор не уверен только в одном - будет ли этот код когда-либо выполняться или нет.

3 голосов
/ 04 октября 2011

Компилятор не предполагает, что путь выполнения достигнет деления на 0. Это разумное предположение, потому что выполнение _tmain определяется после компиляции.

3 голосов
/ 04 октября 2011

То же самое, просто вежливо.
Хочешь сказать "Ты делишь на ноль, идиот!" ? (-`

2 голосов
/ 04 октября 2011

Допустим, вы разработчик компилятора и создаете инструмент статического анализа, который будет запускаться во время компиляции, чтобы помочь отлавливать ошибки.

Например, здесь, механизм на основе диапазона, который определит возможные значения, которые может принять правый оператор /.

Теперь есть два случая:

  • правая сторона определенно 0
  • правая сторона, возможно, 0

Очевидно, что для разделения двух случаев требуется больше усилий.

И, таким образом, вы можете справедливо предположить, что наиболее распространенной причиной ошибок будет вероятность , а не достоверность (nodoby в здравом уме будет делиться на 0, верно?) и сэкономить себе немного работы.

  • Это оптимально? Для разработчика возможно, для пользователя не очень.

  • Можно ли его использовать? Определенно.

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