Комментарии 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) и при этом не присвоил результат другой переменной, то вызов не имеет смысла — скорее всего, он думал, что поменяется как раз вектор, переданный в качестве аргумента. Аннотации помогают такие штуки ловить. Без них часто нельзя быть уверенными в том, имеет ли вызов метода смысл, если результат вызова не использован (очевидно, бывают методы, возвращаемые значения которых можно не использовать).
Конечно, это лишь пример работы аннотаций, они используются не только для таких случаев.
Ммм… Вот это пример вообще который авто-выводим, разве нет?
Если никакого побочного эффекта кроме возвращаемого значения нет…
Впрочем, это может быть ассерт, например. Но тогда возвращаемое значение должно быть тривиальным.
Перефразирую: реквестирую статью про чуть больше внутренней кухни тут :)
С подводными камнями. А то я сейчас рассуждаю про рисование совы и хорошо это понимаю.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Информация

Дата основания
2008
Местоположение
Россия
Сайт
www.viva64.com
Численность
31–50 человек
Дата регистрации

Блог на Хабре