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

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

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) или платформе (в большинстве случаев), достаточно было бы запустить его пару раз вручную, но япредпочитаю что-то не слишком эзотерическое или дорогостоящее.

Ответы [ 2 ]

1 голос
/ 18 января 2010

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

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

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

1 голос
/ 18 января 2010

lint предоставит вам это предупреждение (условие 641)

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

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

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