Есть ли какой-либо c/c ++ компилятор, который может предупредить (или дать ошибку), или перечислимое преобразование в интервал?

Очищая старый c/c ++ код, который использовал hardcoded целочисленные литералы вместо перечислений, это утомительно для нахождения мест, где объявление функции было правильно пересмотрено, но не тело. например.

enum important {
  little = 1,
  abit = 2,
  much = 3
};

void blah(int e)
{
  // magic stuff here
}

void boing(int e) { ... }

void guck(important e)
{
  switch (e) {
    case 3:  // this would be a good place for a warning
      blah(e);  // and this
      break;
    default:
      boing((int)e); // but this is OK (although imperfect and a warning would be acceptable)
      break;
  }
}

Аннотирование/изменение каждого перечислимого типа или поиск кода для них также были бы изрядным объемом работы, поскольку существует очень очень много различных перечислений, таким образом, это не предпочтено, но могло быть приемлемым решением.

Мне не нужен он, чтобы быть в любом из наших основных компиляторов или других инструментов (gcc главным образом), или платформа (больше всего), выполняя его вручную пару раз была бы достаточно, но я предпочту что-то, что не является слишком тайным или дорогостоящим.

6
задан outis 18 January 2010 в 10:25
поделиться

2 ответа

Редр (семантический инструмент Checker, используемый людьми Linux Kernel), может помочь вам с некоторыми из этого.

Подмножество ошибок ENUM можно поймать этими параметрами: -Wenum-несоответствие, -WCACT-усеченные. Тем не менее, я провел ваш код через это и не похоже, что ни один из них был пойман.

Это бесплатное программное обеспечение, если вы хотите продлить его.

1
ответ дан 17 December 2019 в 20:32
поделиться

LINT обеспечит это предупреждение для вас (условие 641)

641 преобразование Enum in int - тип перечисления использовался в контексте, который требуется вычисление, такое как аргумент арифметического оператора или был по сравнению со встроенным аргументом. Это предупреждение будет подавлено, если вы Используйте целочисленную модель перечисления (+ FIE), но вы потеряете некоторые ценные Тип проверки при этом. Промежуточная политика - просто отключить это предупреждение. Назначение Int enum все равно будет поймано.

Splint ( http://www.splint.org/download.html ) - современный бит, который вы можете использовать

1
ответ дан 17 December 2019 в 20:32
поделиться