Coccinelle (фр. божья коровка) — инструмент с открытым исходным кодом, предназначенный для преобразования исходного кода программ написанных на языке программирования Си.
Использование Coccinelle изначально использовалась для разработки ядра Линукс, помогая разработчикам вносить изменения в программные интерфейсы библиотек, например переименовывая функции, и организовывая структуры данных.
Также может использоватся для нахождения некорректных паттернов в коде (например, возможное разыменовывание NULL указателя), без его преобразования. Роль Coccinelle в разработке схожа с инструментами статического анализа.
Поддержку Coccinelle осуществляет IRILL. Разработка программы финансируется Agence Nationale de la Recherche (Франция), Датским Научным Советом по Технологиям и Производственным Наукам, а также INRIA.
Исходный код программы распространяется под открытой лицензией GPLv2.0.
Semantic Patch Language Исходный код подлежащий сопоставлению или замене описывается с помощью синтаксиса "семантических патчей", основаном на синтаксисе утилиты patch.
Пример В данном примере, Coccinelle ищет вызовы функции usb_submit_urb, и добавляет аргументы GFP_ATOMIC и GFP_KERNEL. Если функция была вызвана между вызовами spin_lock_irqsave и spin_lock_irqrestore (критическая секция кода, прерывания выключены), добавляется аргумент GFP_ATOMIC, иначе добавляется аргумент GFP_KERNEL.@@ expression lock, flags; expression urb; @@
spin_lock_irqsave(lock, flags); <... - usb_submit_urb(urb) + usb_submit_urb(urb, GFP_ATOMIC) ...> spin_unlock_irqrestore(lock, flags);
@@ expression urb; @@
- usb_submit_urb(urb) + usb_submit_urb(urb, GFP_KERNEL)
Примечания
Ссылки