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, ложный положительный результат?
По каким причинам два приведенных выше примера кода не анализируются как эквивалентные?
это
size_t const n = 4;
int a[n] = {};
ложно положительный
64-битная диагностика очень шумная, и с этим ничего не поделаешь. Да, анализатор выдает много ложных срабатываний, таких как магические числа, такие как 4
, 0xFFFFFFFF
и т. д. В анализаторе уже сделано много исключений, когда он не жалуется (например: int a[4] = {};
). Однако вариантов использования констант по-прежнему так много, что невозможно предвидеть их все.
При переносе кода на 64-битную систему имеет смысл просмотреть все магические числа, чтобы убедиться, что, например, программист не ожидает, что размер указателя равен 4
байты где-то. Тогда имеет смысл отключить V112 диагностика, чтобы она вас не беспокоила.
Читая ссылку, которую вы разместили, я пришел к выводу, что это ложный положительный результат в вашем случае
Инструмент предполагает, что вы собираетесь использовать n
в malloc
(или эквивалентная процедура выделения), чтобы быть эквивалентным размеру int
(или любая 4-байтовая переменная). Поэтому рекомендуется использовать sizeof(desired type)
,
Если бы вы использовали n
внутри malloc
Заявление, это будет иметь смысл — так как int
(или любой другой тип) может отличаться для разных архитектур (если не сейчас, то в будущем). Но, видимо, это не ваш случай.
Число 4 считается одним из потенциально опасных чисел при переносе с 32-разрядного на 64-разрядное, следовательно, предупреждение о присвоении const 4. Другие номера перечислены в таблице за размещенной вами ссылкой. С примерами, как это может быть опасно.
Вы можете подавить индивидуальное предупреждение добавляя // — V112 в конце строки вы уверены, что все в порядке.
size_t const n = 4; //-V112
Это исключит предупреждение, и вы снова сможете сосредоточиться на своей работе.
Что касается int a[4] = {};
PVS-Studio считает это особым случаем, для которого не выдается предупреждение. Почему это не учитывается в первом случае, я не знаю. Но это выглядит как жестко закодированное исключение для действительно конкретного случая.
Если вы не собираете 64-битные сборки, то я предполагаю, что пока можно полностью отключить предупреждение. Но будьте осторожны — приходит из виду, приходит из ума.