Кодовые метрики сложности и ifdefs

Я задавался вопросом, как стандартные кодовые метрики сложности (например, МЕСТОПОЛОЖЕНИЕ, Маккейб cyclomatic сложность, метрики Халстеда, и т.д.) вычисляются перед лицом ifdefs в коде C/C++.

Если ifdefs проигнорированы, синтаксические ошибки (или даже напечатайте ошибки), может возникнуть, такой как в:

  1. #ifdef FOO
  2. for(i = 0; i < x; i++) {
  3. #else
  4. for(i = 0; i < y; i++) {
  5. #endif
  6. printf(...)
  7. }

Если бы линии 1, 3 и 5 проигнорированы, у получающегося кода были бы одна петля в другом и отсутствие '}' (таким образом синтаксическая ошибка).

Если бы #ifdefs приняты во внимание, то можно было бы быть нужна единственная получающаяся мера за вариант (в этом случае, тот, когда FOO определяется, и другой для случая, когда FOO не определяется). Однако такой подход может легко взорваться на практике.

Взгляд на http://manpages.ubuntu.com/manpages/natty/man1/pmccabe.1.html, страница справочника отчеты, что:

Парсинг pmccabe игнорирует все cpp директивы препроцессору - вычисление сложность появления кода, а не сложность после того, как препроцессор корежит код. Это особенно важно так как простые вещи как getchar (3) расширяются в макрос, которые увеличиваются сложность.

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

Как инструменты преодолевают эту проблему (если они преодолевают вообще)?

Отношения.

3
nl ja de

3 ответы

Если вы переписываете ту конструкцию как

#ifdef FOO
# define LOOPEND x
#else
# define LOOPEND y
#endif

или что-то как этот, не должно быть никакой проблемы.

Если вы не хотите делать это, и ваш контролер сложности не понимает препроцессор, можно управлять им на продукции препроцессора, обоих с FOO определенный и с FOO неопределенный, то взять макс. из ценностей, которые он производит, чтобы получить нижнюю границу на фактической сложности. С GCC препроцессор призван с gcc-E ; у других компиляторов будет подобный выбор.

(Конечно, если у вас есть большое это колдовство CPP, вас оставляют с показательным количеством возможностей. Но это - цена, которую вы платите за использование препроцессора; то же самое относится к тестированию.)

2
добавлено
@LeonardoPassos: зависит. Поскольку, какая цель вам нужны числа сложности?
добавлено автор Fred Foo, источник
Для первой части: как измерить метрики сложности в существующем коде C/C++? Мы говорим, приблизительно миллионы линий кода, таким образом переписывая не являются возможностью. Вторая часть: это взрывается, учитывая кодовую базу с сотней макро-переменных (2^n, где n обозначает такой макрос),
добавлено автор leco, источник

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

Так как они не смотрят на проблемы полного синтаксиса как вы, описывают, не блокируют их. Howevery они действительно становятся хрупкими другими способами, на самом деле я видел цикло-2.0, подводят compleatly на основательном производственном коде.

1
добавлено

Я думал бы, что в большем проекте (а не 20 линий "эксперимент") сумма #ifdef и подобный, которые затрагивают ФАКТИЧЕСКУЮ сложность кода, была бы довольно минимальна - вы будете надеяться, что большинство подобных выражений находится в изолированных единицах, которые не затрагивают общую оценку слишком много.

Но да, если у вас есть маленький набор кода с большими суммами #ifdef и сложность в #ifdef части, вы могли получить большую ошибку. Ручной контроль кода был бы в состоянии сказать вам это.

0
добавлено
Да, но мое упоминание о ручной работе только применимо для Небольших приложений - если it' s крупный проект, конечно вашими результатами было бы в значительной степени то же самое так или иначе!
добавлено автор Mats Petersson, источник
Привет, как указано в вышеупомянутом комментарии (см. комментарий для larsmans), ручной работе или даже комбинаторном не выбор: (
добавлено автор leco, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest