LINUX.ORG.RU
ФорумTalks

Почему в сорцах FreeBSD такой говнокод?

 , ,


0

2

Тут недавно Алкоголь-студия проверяла код FreeBSD (ищите на хабре, не собираюсь добавлять ссылок этим спамерам), так вот. Там такое место есть:

#ifdef Q
#undef Q
#endif
#define Q(_r) \
  (((_r) == 1.5) ? 0 : (((_r) ==2.25) ? 1 : (((_r) == 3) ? 2 : \
  (((_r) == 4.5) ? 3 : (((_r) ==  6)  ? 4 : (((_r) == 9) ? 5 : \
  (((_r) == 12)  ? 6 : (((_r) == 13.5)? 7 : 0))))))))
static const struct txschedule series_quarter[] = {
  { 3,Q( 1.5),3,Q(1.5), 0,Q(1.5), 0,Q(1.5) },  /* 1.5Mb/s */
  { 4,Q(2.25),3,Q(1.5), 4,Q(1.5), 0,Q(1.5) },  /*2.25Mb/s */
  { 4,Q(   3),3,Q(1.5), 4,Q(1.5), 0,Q(1.5) },  /*   3Mb/s */
  { 4,Q( 4.5),3,Q(  3), 4,Q(1.5), 2,Q(1.5) },  /* 4.5Mb/s */
  { 4,Q(   6),3,Q(4.5), 4,Q(  3), 2,Q(1.5) },  /*   6Mb/s */
  { 4,Q(   9),3,Q(  6), 4,Q(4.5), 2,Q(1.5) },  /*   9Mb/s */
  { 4,Q(  12),3,Q(  9), 4,Q(  6), 2,Q(  3) },  /*  12Mb/s */
  { 4,Q(13.5),3,Q( 12), 4,Q(  9), 2,Q(  6) }  /*13.5Mb/s */
};
#undef Q

Разворачивается это чудо в

static const struct txschedule series_quarter[] = {
  { 3,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))),3,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))), 0,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))), 0,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))) },
  { 4,(((2.25) == 1.5) ? 0 : (((2.25) ==2.25) ? 1 : (((2.25) == 3) ? 2 : (((2.25) == 4.5) ? 3 : (((2.25) == 6) ? 4 : (((2.25) == 9) ? 5 : (((2.25) == 12) ? 6 : (((2.25) == 13.5)? 7 : 0)))))))),3,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))), 4,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))), 0,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))) },
  { 4,(((3) == 1.5) ? 0 : (((3) ==2.25) ? 1 : (((3) == 3) ? 2 : (((3) == 4.5) ? 3 : (((3) == 6) ? 4 : (((3) == 9) ? 5 : (((3) == 12) ? 6 : (((3) == 13.5)? 7 : 0)))))))),3,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))), 4,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))), 0,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))) },
  { 4,(((4.5) == 1.5) ? 0 : (((4.5) ==2.25) ? 1 : (((4.5) == 3) ? 2 : (((4.5) == 4.5) ? 3 : (((4.5) == 6) ? 4 : (((4.5) == 9) ? 5 : (((4.5) == 12) ? 6 : (((4.5) == 13.5)? 7 : 0)))))))),3,(((3) == 1.5) ? 0 : (((3) ==2.25) ? 1 : (((3) == 3) ? 2 : (((3) == 4.5) ? 3 : (((3) == 6) ? 4 : (((3) == 9) ? 5 : (((3) == 12) ? 6 : (((3) == 13.5)? 7 : 0)))))))), 4,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))), 2,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))) },
  { 4,(((6) == 1.5) ? 0 : (((6) ==2.25) ? 1 : (((6) == 3) ? 2 : (((6) == 4.5) ? 3 : (((6) == 6) ? 4 : (((6) == 9) ? 5 : (((6) == 12) ? 6 : (((6) == 13.5)? 7 : 0)))))))),3,(((4.5) == 1.5) ? 0 : (((4.5) ==2.25) ? 1 : (((4.5) == 3) ? 2 : (((4.5) == 4.5) ? 3 : (((4.5) == 6) ? 4 : (((4.5) == 9) ? 5 : (((4.5) == 12) ? 6 : (((4.5) == 13.5)? 7 : 0)))))))), 4,(((3) == 1.5) ? 0 : (((3) ==2.25) ? 1 : (((3) == 3) ? 2 : (((3) == 4.5) ? 3 : (((3) == 6) ? 4 : (((3) == 9) ? 5 : (((3) == 12) ? 6 : (((3) == 13.5)? 7 : 0)))))))), 2,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))) },
  { 4,(((9) == 1.5) ? 0 : (((9) ==2.25) ? 1 : (((9) == 3) ? 2 : (((9) == 4.5) ? 3 : (((9) == 6) ? 4 : (((9) == 9) ? 5 : (((9) == 12) ? 6 : (((9) == 13.5)? 7 : 0)))))))),3,(((6) == 1.5) ? 0 : (((6) ==2.25) ? 1 : (((6) == 3) ? 2 : (((6) == 4.5) ? 3 : (((6) == 6) ? 4 : (((6) == 9) ? 5 : (((6) == 12) ? 6 : (((6) == 13.5)? 7 : 0)))))))), 4,(((4.5) == 1.5) ? 0 : (((4.5) ==2.25) ? 1 : (((4.5) == 3) ? 2 : (((4.5) == 4.5) ? 3 : (((4.5) == 6) ? 4 : (((4.5) == 9) ? 5 : (((4.5) == 12) ? 6 : (((4.5) == 13.5)? 7 : 0)))))))), 2,(((1.5) == 1.5) ? 0 : (((1.5) ==2.25) ? 1 : (((1.5) == 3) ? 2 : (((1.5) == 4.5) ? 3 : (((1.5) == 6) ? 4 : (((1.5) == 9) ? 5 : (((1.5) == 12) ? 6 : (((1.5) == 13.5)? 7 : 0)))))))) },
  { 4,(((12) == 1.5) ? 0 : (((12) ==2.25) ? 1 : (((12) == 3) ? 2 : (((12) == 4.5) ? 3 : (((12) == 6) ? 4 : (((12) == 9) ? 5 : (((12) == 12) ? 6 : (((12) == 13.5)? 7 : 0)))))))),3,(((9) == 1.5) ? 0 : (((9) ==2.25) ? 1 : (((9) == 3) ? 2 : (((9) == 4.5) ? 3 : (((9) == 6) ? 4 : (((9) == 9) ? 5 : (((9) == 12) ? 6 : (((9) == 13.5)? 7 : 0)))))))), 4,(((6) == 1.5) ? 0 : (((6) ==2.25) ? 1 : (((6) == 3) ? 2 : (((6) == 4.5) ? 3 : (((6) == 6) ? 4 : (((6) == 9) ? 5 : (((6) == 12) ? 6 : (((6) == 13.5)? 7 : 0)))))))), 2,(((3) == 1.5) ? 0 : (((3) ==2.25) ? 1 : (((3) == 3) ? 2 : (((3) == 4.5) ? 3 : (((3) == 6) ? 4 : (((3) == 9) ? 5 : (((3) == 12) ? 6 : (((3) == 13.5)? 7 : 0)))))))) },
  { 4,(((13.5) == 1.5) ? 0 : (((13.5) ==2.25) ? 1 : (((13.5) == 3) ? 2 : (((13.5) == 4.5) ? 3 : (((13.5) == 6) ? 4 : (((13.5) == 9) ? 5 : (((13.5) == 12) ? 6 : (((13.5) == 13.5)? 7 : 0)))))))),3,(((12) == 1.5) ? 0 : (((12) ==2.25) ? 1 : (((12) == 3) ? 2 : (((12) == 4.5) ? 3 : (((12) == 6) ? 4 : (((12) == 9) ? 5 : (((12) == 12) ? 6 : (((12) == 13.5)? 7 : 0)))))))), 4,(((9) == 1.5) ? 0 : (((9) ==2.25) ? 1 : (((9) == 3) ? 2 : (((9) == 4.5) ? 3 : (((9) == 6) ? 4 : (((9) == 9) ? 5 : (((9) == 12) ? 6 : (((9) == 13.5)? 7 : 0)))))))), 2,(((6) == 1.5) ? 0 : (((6) ==2.25) ? 1 : (((6) == 3) ? 2 : (((6) == 4.5) ? 3 : (((6) == 6) ? 4 : (((6) == 9) ? 5 : (((6) == 12) ? 6 : (((6) == 13.5)? 7 : 0)))))))) }
};

Так вот. Что, блин мешает написать

static const struct txschedule series_quarter[] = {
  {  3,  0,  3,  0,  0,  0,  0,  0 }, /*  1.5Mb/s */
  {  4,  1,  3,  0,  4,  0,  0,  0 }, /* 2.25Mb/s */
  {  4,  2,  3,  0,  4,  0,  0,  0 }, /*    3Mb/s */
  {  4,  3,  3,  2,  4,  0,  2,  0 }, /*  4.5Mb/s */
  {  4,  4,  3,  3,  4,  2,  2,  0 }, /*    6Mb/s */
  {  4,  5,  3,  4,  4,  3,  2,  0 }, /*    9Mb/s */
  {  4,  6,  3,  5,  4,  4,  2,  2 }, /*   12Mb/s */
  {  4,  7,  3,  6,  4,  5,  2,  4 }, /* 13.5Mb/s */
};
???

Зачем нужна нафиг магия на макросах? Напишите блин рядом комментарий что мол так и так, массив сформирован на основе четвертинного алгоритма. Все равно этот ваш Q(XXX) нихрена не понятен. Понятно, что потом всякие Водка-Студии будут орать 96 критикал сообщений о несовместимости типов.

В коде FreeBSD можно встретить ещё несколько таких массивов. Суммарно анализатор выдаёт на них 692 предупреждения уровня High. Напомню, что всего предупреждений уровня High насчитывается 3577. Это значит, что такие макросы приводят к возникновению 1/5 этих предупреждений.

P.S. Код, которым я сгенерил массив выше: https://pastebin.com/pPN8uwVz

★★★★★

Последнее исправление: PPP328 (всего исправлений: 3)

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

praseodim ★★★★★
()

Оригинальный вариант нагляднее. Что с ним не так?

Deleted
()

Что за четвертинный алгоритм?

Если так сильно негодуешь, напиши свои соображения в рассылку FreeBSD, вдруг сделают, как тебе нравится

Harald ★★★★★
()
Ответ на: комментарий от Harald

Что за четвертинный алгоритм?

Да нет там никакого «четвертинного алгоритма». Это описание порядка повторной передачи пакета при использовании канала шириной 5 МГц. С точки зрения инженера по Wi-Fi, вполне ясное и наглядное.

P.S. Если не нравится макрос, можно сделать инициализацию массива при инициализации драйвера.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)

Исходный вариант более читабельный, да и компилятор всё равно соптимизирует это в результирующий вариант.

beastie ★★★★★
()

В коде FreeBSD можно встретить ещё несколько таких массивов. Суммарно анализатор выдаёт на них 692 предупреждения уровня High. Напомню, что всего предупреждений уровня High насчитывается 3577. Это значит, что такие макросы приводят к возникновению 1/5 этих предупреждений.

Так это проблемы Пивас-Студии, а не кода FreeBSD.

kirk_johnson ★☆
()

Запилите тег: пивас-студия - в тему я щитаю.

Ygor ★★★★★
()
Ответ на: комментарий от beastie

Исходный вариант более читабельный,

Вообще-то наоборот. Лучше рядом ту же матрицу комментом пояснить.

Не говоря уже о

#ifdef Q
#undef Q
#endif
LamerOk ★★★★★
()
Ответ на: комментарий от Deleted

Не имеет значения. Чем проще код - тем лучше.

Если хочешь добавить к данным метаинформацию - оставь коммент, а не городи турусы на колёсах.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

LamerOk

представляю как у тебя бомбанёт, когда увидишь как в ядре линукса изображение Тукса хранится, рисуемое в fbcon при загрузке...)

goodwin ★★
()

зачем вы из рекламнойСтудии по проверке кода прибежали? Тебе заняться нечем?

ggrn ★★★★★
()

Пузан, ты опять выходишь на связь?

TheAnonymous ★★★★★
()

Чтобы было видно как матрица получается, и при необходимости крутить исходные данные, а не уже посчитаные значения

WindowsXP ★★
()
Ответ на: комментарий от LamerOk

Сравни код шедулера FreeBSD и линукса, ужаснись первому, потом вспомни, что без ручного управления линукс внезапно фризится.

Shadow ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.