При помощи механизма пользовательских аннотаций можно дополнительно настроить диагностические правила анализатора. Одним из вариантов пользовательских аннотаций являются аннотации функций.
Пример такой аннотации:
//V_FORMATTED_IO_FUNC, function:Log, format_arg:1, ellipsis_arg:2 void Log(const char *fmt, ...);
Однако аннотации по умолчанию не применяются к виртуальным функциям. Диагностическое предупреждение V016 сообщает пользователю о том, что его аннотация не была применена к виртуальной функции, и рекомендует исправить это при помощи специальных флагов, которые дописываются в аннотацию:
Например, аннотация для виртуальной функции 'Log' класса 'Base' будет выглядеть следующим образом:
// Комментарий должен быть расположен на одной линии //V_FORMATTED_IO_FUNC, function:Base::Log, format_arg:1, ellipsis_arg:2, enable_on_virtual struct Base { virtual void Log(const char *fmt, ...); }
Вместо 'enable_on_virtual' может быть указан флаг 'propagate_on_virtual'. Тогда аннотация будет применена и к переопределениям функции в дочерних классах:
// Комментарий должен быть расположен на одной линии //V_FORMATTED_IO_FUNC, function: Base::Log, format_arg:1, ellipsis_arg:2, propagate_on_virtual struct Base { virtual void Log(const char *fmt, ...); } struct Derived { // Аннотация будет действовать и на эту функцию virtual void Log(const char *fmt, ...) override; }