Почему CodeContracts Static Analyzer не выдает предупреждений? - PullRequest
3 голосов
/ 18 ноября 2011

У меня есть несколько пользовательских элементов управления, которые подписаны на обработчик событий в другом классе. Я изучаю 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 ]

3 голосов
/ 18 ноября 2011

Вы должны включить «Неявные ненулевые обязательства» в параметрах статического анализатора (Параметры проекта | Анализ кода).

0 голосов
/ 01 марта 2013

У меня была похожая проблема.Мне пришлось включить ползунок уровня предупреждения на той же панели, что и флажок «Неявные ненулевые обязательства».

0 голосов
/ 18 ноября 2011

В свойствах страница вашего проекта на Анализ кода вкладка вы можете изменить Правила .

0 голосов
/ 18 ноября 2011

«Как я могу получать уведомления об ошибках, подобных этой?»: Resharper предупредит вас в этом случае.

Контракты кода предупредят вас, что объект может быть нулевым, если есть «Требуетсяmsgstr "чтобы объект был ненулевым.Вы просите неявное «Требуется» для разыменования объекта, что кажется разумным на первый взгляд, но которое CC по какой-либо причине не предоставляет.

Документация на http://msdn.microsoft.com/en-us/library/dd264808.aspx говорит, что он обеспечивает выполнение такого неявного контракта.Я углубляюсь в это.

RedHat побил меня этим.Подробнее: установите флажок «Неявные ненулевые обязательства» в разделе «Статическая проверка» на вкладке «Контракты кода» в свойствах вашего проекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...