Comments 26
for (int index = 1; index < a.Length; ++index) — Во, тут ошибка!
Возможно, обычно не допускает, но как говорится — и на старуху бывает проруха. Как и показывает пример из статьи. :)
if (a.Length > 0)
Метод публичный, где проверка на null
? Анализатор такого не ловит?
Просто при анализе параметров метода — сейчас нет.
Но здесь будет межпроцедурное срабатывание, если в метод будет передано значение, которое может быть null
. В таком случае анализатор выдаст предупреждение на место вызова с доп. навигацией на точку разыменования (как раз на a.Length
):
object[] arr = null;
var _ = ToString(arr);
Предупреждение PVS-Studio: V3080 Possible null dereference inside method at 'a.Length'. Consider inspecting the 1st argument: arr.
Если же вернуться к разговору про анализ исключительно параметров методов, безотносительно контекста вызова метода, есть более специфичное правило — V3115. Оно срабатывает на 'Equals' (идея из гайдлайнов MS на Equals, скорее всего).
Если говорить про более общий случай — ругаться на параметры публично-доступных методов, используемых без проверки — была такая идея. Уж мне то такие срабатывания могли бы быть удобны, статьи проверку исходников библиотек писать. ;) Но при первых прогонах на базе реальных проектов, насколько я помню, их оказалось просто какое-то неимоверное число — хотелось как-то сузить. Тогда были более приоритетные задачи / полезные диагностики, так что та идея ещё жива, но пока в TODO.
Анализатор VS выдает «CA1062: Validate arguments of public methods», но только если метод объявлен публичным. Если объявить его internal, уже не ругается. VS по сравнению с ReSharper очень скромен в этом плане. На возможную ошибку с неявной конверсией символа в int ReSharper тоже сразу начинает ругаться.
Ошибка на миллион долларов
Почему сразу ошибка, может так и было задумано?
Обфускация?
Она самая. И плюс толика сарказма, но я уже за это отхватил.
Забавно, что я тоже отхватил за подобное один раз. Бритва Хэнлона, все дела...
Именованные аргументы хорошо защищают от таких ошибок неявного кастинга. Сразу было бы видно «capacity: ‘[’», и сразу бы возник вопрос.
Да и вообще, нормальный проект должен быть покрыт тестами и бенчмарками. В данном случае есть подозрение, что это какой-то отладочный ToString.
sb.Append(", ").Append(a[index]);
Вот эта строчка у меня, как у питониста вызывает вопросы. Функция Append изменяет sb, но тогда по идее она не должна возвращает ничего, как к ней еще раз применяется Append?
Или это нормальная практика в C#, что функция изменяющая объект еще и ссылку какую-то на него возвращает?
Не какую-то, а ссылку на себя же. В питоне так тоже можно. Да пожалуй почти в любом языке, где это возможно, билдеры так устроены
https://stackoverflow.com/questions/17321167/calling-chains-methods-with-intermediate-results
++index
C# программист, испытай себя — найди ошибку