Как избежать вывода предупреждений size_t на int при портировании на 64 бит? - PullRequest
7 голосов
/ 10 июля 2019

Мне нужно преобразовать очень большую базу устаревшего кода C ++ в 64 бита.Мне удалось получить один из базовых модулей для компиляции, но даже в этом небольшом модуле я получаю 800 предупреждений о:

предупреждении C4267: = преобразование из size_t в int, возможная потеря данных

Я понимаю, почему они появляются, но каковы мои варианты избавления от них?Есть ли какой-либо систематический способ избежать прикосновения к каждому отдельному случаю?

Ответы [ 3 ]

3 голосов
/ 10 июля 2019

Один из вариантов - отключить предупреждение «потеря данных».Чтобы ограничить эффект отключения предупреждения, MS Visual Studio имеет директивы push и pop:

#pragma warning(push)
#pragma warning(disable: 4267)
// legacy code
#pragma warning(pop)
// normal code

Эти директивы #pragma относятся к Visual Studio;вы можете захотеть обернуть их с #ifdef _MSC_VER.

1 голос
/ 10 июля 2019

Это мысль.Я уверен, что + 90% этих предупреждений можно игнорировать.У меня была похожая проблема и много предупреждений о чем-то вроде этого:

sumeType tab[10];
int items = std::size(tab);
// or
functionWhichExeptsInt(std::size(tab))

В приведенном выше примере, поскольку std::size - это constexpr компилятор, он может просто обнаружить, что значение размера достаточно мало, чтобы поместиться в intпоэтому он не должен сообщать о конфликте, но это так.

Проблема в том, что могут быть случаи, когда это предупреждение может обнаружить реальную проблему.Таким образом, отключение этого предупреждения не является хорошим подходом.

В моем проекте мы решили продолжать вражды, но не угрожаем им как ошибкой:

  • мы рассмотрели их быстро, есличто-то могло быть исправлено минимальным изменением, которое мы сделали, чтобы
  • , когда требуемое изменение было более сложным, мы просто оценили потенциальную опасность ошибки (в конце концов мы изменили приложение с 32 на 64 бита, чтобы получить доступ к большему количеству памяти),Если мы не видим риска, мы просто игнорируем его сейчас
  • мы исправляем оставшиеся предупреждения по мере изменения кода и не спешим исправлять их все сейчас.

Это большекак психическая проблема: «Могу ли я игнорировать эти +100 предупреждение сейчас?».Я также люблю код без предупреждений, но иногда лучше жить с ними.

ИМО, это более безопасный подход.

0 голосов
/ 10 июля 2019

Для поиска и устранения ошибок, возникающих при переносе системы с 32-разрядной на 64-разрядную версию, целесообразно использовать специализированный инструмент PVS-Studio.Это статический анализатор кода, который имеет определенный набор диагностики ( Диагностика 64-битных ошибок ).Прочитайте здесь о проблемах при портировании.

Анализатор также выдаст V103 предупреждений, когда size_t неявно приведен к int.Но в отличие от компилятора, он делает это умнее.Он не жалуется на все.Если известно, что диапазон исходного значения невелик, он будет тихим.

Пример:

for (size_t i = 0; i < 10; i++)
{
  int x = i; // i == [0..9], OK!
  //....
}

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

...