Почему CodeContracts Static Analyzer не делает предупреждений?
У меня есть несколько пользовательских элементов управления, которые подписаны на обработчик событий в другом классе. Я изучаю CodeContracts на C#, и мне интересно, почему Static Analyzer позволяет писать такой код:
void MyUserControl_MouseEnter(object sender, MouseEventArgs e)
{
MyUserControl item = sender as MyUserControl;
item.DoSomething(); // I expect some warning here, because item can be null
sender.Equals(testObject); // This doesn't yield warning either
}
Здесь у меня есть потенциально небезопасный код, который может привести к исключению нулевой ссылки. Я понимаю, что статический анализатор, вероятно, не может проверить, какой будет действительный тип sender
быть. Но в случае, если это не может доказать это, я ожидаю некоторого предупреждения, как CodeContracts: Possibly calling a method on a null reference
,
Или я неправильно понимаю контракты? Как я могу получать уведомления об ошибках, подобных этой?
UPD:
Да я включил Implicit Non-Null Obligation
как было предложено в ответах, но я все еще не получаю предупреждение от Static Analyzer. Также я попытался запустить анализ кода с Microsoft All Rules
правила установлены, тоже без предупреждения. (Но я бы предпочел иметь дело с Code Contracts и выполнять некоторые дополнительные проверки с использованием класса Contract, а не if-then-throw или чего-то еще)
4 ответа
Вы должны включить "Неявные ненулевые обязательства" в параметрах статического анализатора (Параметры проекта | Анализ кода).
У меня была похожая проблема. Мне пришлось включить ползунок уровня предупреждения на той же панели, что и флажок "Неявные ненулевые обязательства".
"Как я могу получить уведомление об ошибках, подобных этой?": Resharper предупредит вас в этом случае.
Контракты кода предупреждают вас, что объект может быть нулевым, если есть "Требуется", чтобы объект был ненулевым. Вы просите неявное "Требуется" для разыменования объекта, что на первый взгляд кажется разумным, но которое CC по какой-либо причине не обеспечивает.
Документация по адресу http://msdn.microsoft.com/en-us/library/dd264808.aspx гласит, что она обеспечивает выполнение такого неявного контракта. Я смотрю на это дальше.
RedHat побил меня к этому. Более подробно: установите флажок "Неявные ненулевые обязательства" в разделе "Статическая проверка" на вкладке "Контракты кода" в свойствах вашего проекта.
На странице свойств вашего проекта на вкладке Анализ кода вы можете изменить Правила.