Используется опасное магическое число N

PVS-Studio, статический анализатор кода, для следующего бита кода

size_t const n = 4;
int a[n] = {};

доклады:

V112 Опасный магический номер 4 используемый: ...t const n = 4;. test.cpp 3

Хотя PVS-Studio используется с проектом Visual Studio 2017 и выдает одно и то же предупреждение как для 32-, так и для 64-разрядных систем, эти конфигурации сборки не учитываются анализатором AFAIU.

Я бы ожидал, что контекст будет проанализирован лучше, и приведенный выше код будет эквивалентен

int a[4] = {};

по которой PVS-Studio не выдает никакой диагностики.

В случае выше это используется опасное магическое число N, ложный положительный результат?

По каким причинам два приведенных выше примера кода не анализируются как эквивалентные?

5

Решение

это

size_t const n = 4;
int a[n] = {};

ложно положительный

64-битная диагностика очень шумная, и с этим ничего не поделаешь. Да, анализатор выдает много ложных срабатываний, таких как магические числа, такие как 4, 0xFFFFFFFFи т. д. В анализаторе уже сделано много исключений, когда он не жалуется (например: int a[4] = {};). Однако вариантов использования констант по-прежнему так много, что невозможно предвидеть их все.

При переносе кода на 64-битную систему имеет смысл просмотреть все магические числа, чтобы убедиться, что, например, программист не ожидает, что размер указателя равен 4 байты где-то. Тогда имеет смысл отключить V112 диагностика, чтобы она вас не беспокоила.

3

Другие решения

Читая ссылку, которую вы разместили, я пришел к выводу, что это ложный положительный результат в вашем случае

Инструмент предполагает, что вы собираетесь использовать n в malloc (или эквивалентная процедура выделения), чтобы быть эквивалентным размеру int (или любая 4-байтовая переменная). Поэтому рекомендуется использовать sizeof(desired type),

Если бы вы использовали n внутри malloc Заявление, это будет иметь смысл — так как int (или любой другой тип) может отличаться для разных архитектур (если не сейчас, то в будущем). Но, видимо, это не ваш случай.

2

Число 4 считается одним из потенциально опасных чисел при переносе с 32-разрядного на 64-разрядное, следовательно, предупреждение о присвоении const 4. Другие номера перечислены в таблице за размещенной вами ссылкой. С примерами, как это может быть опасно.

Вы можете подавить индивидуальное предупреждение добавляя // — V112 в конце строки вы уверены, что все в порядке.

size_t const n = 4; //-V112

Это исключит предупреждение, и вы снова сможете сосредоточиться на своей работе.

Что касается int a[4] = {}; PVS-Studio считает это особым случаем, для которого не выдается предупреждение. Почему это не учитывается в первом случае, я не знаю. Но это выглядит как жестко закодированное исключение для действительно конкретного случая.

Если вы не собираете 64-битные сборки, то я предполагаю, что пока можно полностью отключить предупреждение. Но будьте осторожны — приходит из виду, приходит из ума.

2
По вопросам рекламы [email protected]