summaryrefslogtreecommitdiffstats
path: root/pacemaker/rewrite_snprintf.light.cocci
diff options
context:
space:
mode:
Diffstat (limited to 'pacemaker/rewrite_snprintf.light.cocci')
-rw-r--r--pacemaker/rewrite_snprintf.light.cocci66
1 files changed, 66 insertions, 0 deletions
diff --git a/pacemaker/rewrite_snprintf.light.cocci b/pacemaker/rewrite_snprintf.light.cocci
new file mode 100644
index 0000000..b53a941
--- /dev/null
+++ b/pacemaker/rewrite_snprintf.light.cocci
@@ -0,0 +1,66 @@
+// Switch certain class of snprintf to use internal macro crm_snprintf_max
+// jpokorny@redhat.com
+
+@ has_crm_internal @
+@@
+
+#include <crm_internal.h>
+
+
+//@ snprintf_eligible exists @
+//expression E1, E2;
+//identifier fn, id_str, id_max, id_offset;
+//type t_max, t_offset;
+//@@
+//fn(...) {
+//...
+//(
+//t_offset id_offset = E1;
+//...
+//- static t_max id_max = E2;
+//+ static const t_max id_max = E2;
+//|
+//- static t_max id_max = E2;
+//+ static const t_max id_max = E2;
+//...
+//t_offset id_offset = E1;
+//)
+//<...
+//id_offset += snprintf(id_str + id_offset, id_max - id_offset, ...);
+//...>
+//}
+
+
+@ snprintf_rewrite @
+identifier id_str;
+identifier fn, id_max, id_offset;
+@@
+fn(...) {
+<...
+id_offset +=
+- snprintf(id_str + id_offset, id_max - id_offset
++ crm_snprintf_offset(id_str, id_offset, id_max
+, ...);
+...>
+}
+
+
+@ snprintf_assert forall @
+identifier snprintf_rewrite.fn, snprintf_rewrite.id_max, snprintf_rewrite.id_offset;
+@@
+fn(...) {
+<...
+- CRM_LOG_ASSERT(id_offset > 0);
++ CRM_LOG_ASSERT(id_offset > 0 && id_offset < id_max);
+...>
+}
+
+// this is not the best placement, it serves a subsequent manual review
+// to denote necessity to add the include at all, and the reviewer will
+// (hopefully) move the include to the correct location
+@ snprintf_include depends on (snprintf_rewrite && !(has_crm_internal)) exists @
+identifier snprintf_rewrite.fn;
+@@
++ #include <crm_internal.h> /* crm_snprintf_offset */
+
+fn(...) { ... }