Pull to refresh

Имена переменных в коде Linux и немного магии

Какое название переменной в коде на С используется наиболее часто?
Если вы думаете, что i, то вы угадали. Думаю, это было не сложно.
Но как насчет топ5, топ10 названий переменных?
Для примера рассмотрим код Linux, взятый отсюда: github.com/mirrors/linux.
Итак, попробуйте предположить какие названия встречаются почти также часто как i. Готовы?

Топ 10 названий


Итак, вот наиболее встречаемые имена переменных:
  1. i 26618
  2. ret 25533
  3. flags 15754
  4. err 13319
  5. buf 9328
  6. len 8410
  7. count 7644
  8. size 6145
  9. rc 5771
  10. irq 5212

Много угадали?
Второй шанс — все переменные, встречаемость которых больше 500:
  1. i 26618
  2. ret 25533
  3. flags 15754
  4. err 13319
  5. buf 9328
  6. len 8410
  7. count 7644
  8. size 6145
  9. rc 5771
  10. irq 5212
  11. val 4696
  12. status 4575
  13. data 3844
  14. name 3803
  15. addr 3185
  16. offset 3165
  17. error 3116
  18. reg 2951
  19. cpu 2884
  20. cmd 2712
  21. retval 2624
  22. index 2387
  23. result 2331
  24. type 2267
  25. r 2209
  26. value 2127
  27. n 2104
  28. idx 2013
  29. arg 1854
  30. p 1651
  31. mask 1614
  32. timeout 1561
  33. id 1455
  34. start 1438
  35. port 1433
  36. res 1378
  37. mode 1365
  38. length 1334
  39. nr 1184
  40. tmp 1166
  41. enable 1156
  42. page 1151
  43. str 1140
  44. c 1129
  45. end 1098
  46. state 1021
  47. event 1018
  48. s 949
  49. num 918
  50. base 904
  51. level 875
  52. buffer 851
  53. channel 845
  54. x 773
  55. address 767
  56. extra 758
  57. pos 752
  58. j 748
  59. fd 743
  60. dev 742
  61. ch 737
  62. rate 735
  63. cnt 707
  64. ptr 699
  65. slot 669
  66. on 633
  67. fmt 622
  68. bit 547
  69. off 529

Сюда попало уже больше знакомых названий, нашлось место даже для j.

Интересности


Давайте копнем глубже и поищем информацию по наиболее интересным или непонятным переменным.

ret

Вторая по встречаемости переменная. Используется чаще всего как возвращаемое значение, например:
    int ret = cft->trigger(cgrp, (unsigned int)cft->private);
    return ret ? ret : nbytes;

flags

Как понятно из названия, хранит флаги. Обычно типа long или int.
    int n = ACC_MODE(flags);
    if (flags & (O_TRUNC | O_CREAT))
         n |= AUDIT_PERM_WRITE;

rc

Сокращение от return code, хранит код результата вызова функции, который затем возвращается.
    int rc;
    rc = audit_do_config_change("audit_enabled", &audit_enabled, state, loginuid, sessionid, sid);
    if (!rc)
         audit_ever_enabled |= !!state;
    return rc;

irq

Сокращение от Interrupt Request, явная специфика ядра Linux, врядли в другом проекте такое название было бы 10 по встречаемости.
    int irq_set_handler_data(unsigned int irq, void *data)

reg

Тоже нечто специфичное для ядра, видимо сокращение от Register. Используется в основном во всяких низкоуровневых драйверах.
    reg = mfc_read(dev, S5P_FIMV_ENC_PIC_TYPE_CTRL);
    reg &= ~(0x3 << 16);
    reg |= (p->num_b_frame << 16);
    mfc_write(dev, reg, S5P_FIMV_ENC_PIC_TYPE_CTRL);

p

Переменная для тех, кому жалко букв на название, потому что в неё что только не складывают. В одних местах она заменяет i, в других является массивом символов, в третьих является сокращением от Page.
    for (int p = 0; p< BUFSIZE; p++)

    char *p;

    int p = t / (PAGE_SIZE / RADEON_GPU_PAGE_SIZE);


Сокращения

В топ попало довольно много названий, обозначающих по сути одно и то же:
  • ret (25533), retval (2624), r (2209) // Если их сложить, то они даже обгонят i по встречаемости!
  • err (13319), error (3116)
  • len (8410), count (7644), size (6145), n (2104), length (1334), cnt (707)
  • result (2331), res (1378)
  • val (4696), value (2127)


Magic


В благодарность дочитавшим или пролиставшим до этого места подарок: список переменных, в названии которых содержится magic.
  • magic (50)
  • badmagic (5)
  • magic2 (4)
  • magic1 (3)
  • amagic (2)
  • bmagic (2)
  • magicptr (2)
  • magic_packet (2)
  • magic_len (2)
  • sigret_magic (1)
  • magicok (1)
  • end_magic (1)
  • last_magic_err (1)
  • hashmagic (1)

    int magicok = (buf->magic == BUF_MAGIC);
    buf->magic = -1;
    if (magicok) {
        kmem_cache_free(dma_kmem, buf);
    } else {
        printk("s3c2410_dma_freebuf: buff %p with bad magic\n", buf);
    }

Инструменты


Для подсчета статистики использовался несложный код на C#, собирающий все файлы *.c и ищущий в них строки по следующему регулярному выражению:
new Regex(@"(char|short|int|long|float|double|size_t|bool)\s+(\w|_)*?(\*)?\s*(?<target>(\w|_)+(\w|\d|_)*)\s*[;=),]")

Предположительно он должен находить все объявления переменных примитивных типов, различные структуры я не учитывал. Корректность этого выражения подтверждена только усидчивой ручной проверкой и исправлением, но свою задачу он выполняет.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.