Comments 8
А что из аннотаций автоматически выводится? Ручками обязательно прописывать даже для фреймворков?
Аннотации методов – это особый механизм, использующийся в PVS-Studio. Он позволяет предоставить анализатору всю необходимую информацию о каком-нибудь конкретном методе. Она прописывается в специальном коде самими разработчиками анализатора (то есть, нами же).
Так как речь идёт о доступном ядре, я ожидал что аннотации анализатор может вывести из него.
Я понимаю, что когда есть только заголовники, толку от них немного для проверки произвольного проекта, аннотации нужны тут.
Но чтобы проверять проекты когда исходники либы есть — можно же пропрепроцессить либу, не требуя ручной работы в своей основе?
Всё, что можно автоматически узнать о функциях, имея их объявления/определения, анализатор узнаёт автоматически. По возможности и необходимости, конечно.
Аннотации же нужны для предоставления эвристической информации, которую обычно нельзя "вытянуть" программно. Аннотации призваны отвечать на вопросы вроде:
- Является ли функция assert'ом?
- Создана ли она только для ввода/вывода в файл?
- Меняет ли она состояние памяти?
- Является ли она аналогом memcpy?
- Может ли она считать небезопасные данные?
- … и тому подобное.
Поэтому такие вещи мы делаем руками. Это позволяет не только улучшить работу анализатора с популярными функциями, но и расширить его кругозор со стандартных функций до их аналогов (например, провести ему аналогию между malloc и calloc, realloc, _aligned_malloc, _recalloc, strdup и т.д). И еще много плюшек даёт.
Надеюсь, я правильно понял ваш вопрос :)
UnityEngine.Vector3
Например, есть замечательный метод Vector3.Normalize. В доках, кстати, написано 'Note that this function will change the current vector', хотя статическая версия этого метода (которая вроде как там и описывается) при всём желании не сможет этого сделать. Если пользователь вызвал Vector3.Normalize(vector) и при этом не присвоил результат другой переменной, то вызов не имеет смысла — скорее всего, он думал, что поменяется как раз вектор, переданный в качестве аргумента. Аннотации помогают такие штуки ловить. Без них часто нельзя быть уверенными в том, имеет ли вызов метода смысл, если результат вызова не использован (очевидно, бывают методы, возвращаемые значения которых можно не использовать).
Конечно, это лишь пример работы аннотаций, они используются не только для таких случаев.
Если никакого побочного эффекта кроме возвращаемого значения нет…
Впрочем, это может быть ассерт, например. Но тогда возвращаемое значение должно быть тривиальным.
С подводными камнями. А то я сейчас рассуждаю про рисование совы и хорошо это понимаю.
Как статический анализ кода помогает в сфере GameDev