Как быть предупрежденным о возможных арифметических ошибках из-за преобразования типов?

Я работаю над модулем расчета с использованием С#, и я наткнулся на это:

double v = 4 / 100;

Я знаю, что это неправильная инициализация, которая возвращает v = 0.0 вместо v = 0.04

Правила С# говорят, что я должен убедиться, что хотя бы один из членов является двойным, например:

double v = (double) 4 / 100;
double v = 4.0 / 100;

Однако у меня есть много инициализаций такого рода, которые включают операции с целочисленными переменными, и мне лень просматривать мой код построчно, чтобы обнаружить такие ошибки.

Вместо этого возможно ли получить предупреждение об этом от компилятора?


person Larry    schedule 12.12.2012    source источник
comment
Это зависит от того, какой компилятор вы используете. Сообщения об ошибках и предупреждения не являются встроенной функцией языка, а добавляются компилятором. Если используемый вами компилятор не поддерживает его, то нет, это невозможно.   -  person Hoeloe    schedule 12.12.2012
comment
Существует голосовой билет с запросом на эту функцию.   -  person Frédéric Hamidi    schedule 12.12.2012
comment
Я использую компилятор С#, поставляемый с .NET 4.0 и Visual Studio 2010.   -  person Larry    schedule 12.12.2012


Ответы (2)


Хорошо, поиграв немного, а что нет, у меня есть решение. Я использовал эту статью, чтобы найти это решение. .Я использую StyleCop, поэтому вам нужно будет получить и установить его. Затем вы можете скачать мой проект C# MathematicsAnalyzer.

Во-первых, я не учитывал все несоответствия преобразования типов. На самом деле я размещаю только одну часть.

По сути, я проверяю, содержит ли строка «двойной», за которым следует пробел. Я знаю, что это может привести к ложным предупреждениям, потому что конец класса может быть двойным или любым другим, но я оставлю это вам, чтобы выяснить, как правильно изолировать тип.

Если совпадение найдено, я проверяю, соответствует ли оно этому регулярному выражению:

double[ ][A-Za-z0-9]*[ ]?=(([ ]?[0-9]*d[ ]?/[ ]?[0-9]*;)|[ ]?[0-9]*[ ]?/[ ]?[0-9]*d;)

Если оно не соответствует этому регулярному выражению, я добавляю нарушение. Это регулярное выражение будет соответствовать любому из следующих:

  • двойной i=4d / 100;
  • двойное i = 4d/100;
  • двойное i = 4/100d;
  • двойное i = 4/100d;
  • двойное i = 4/100d;
  • двойное i = 4/100d;
  • двойной i=4d / 100;
  • двойной i=4/100d;
  • двойной i=4/100d;

Любое из вышеперечисленного не создаст нарушения. Как сейчас написано, в значительной степени, если «d» не используется, это вызовет нарушение. Вам потребуется добавить дополнительную логику для учета других возможных способов явного приведения операнда. Когда я пишу это, я только что понял, что наличие «d» в обоих операндах, скорее всего, вызовет исключение. Упс.

И, наконец, я не мог заставить StyleCop правильно отображать мое нарушение. Он продолжал выдавать мне ошибку о том, что правило не существует, и даже со второй парой глаз мы не могли найти решение, поэтому я взломал его. Ошибка показывает имя правила, которое вы пытались найти, поэтому я просто указал имя правила как нечто описательное и включил в него номер строки.

Чтобы установить пользовательское правило, создайте проект MathematicalAnalyzer. Закройте Visual Studio и скопируйте DLL в каталог установки StyleCop. Когда вы открываете Visual Studio, вы должны увидеть правило в настройках StyleCop. Шаги 5 и 6 статьи, которую я использовал, показывают, где это сделать.

Это позволяет получить только одно нарушение за раз во всем решении, поэтому вам придется исправить указанное нарушение и снова запустить StyleCop, чтобы найти следующее. Возможно, есть способ обойти это, но у меня закончился сок, и я остановился здесь.

Наслаждаться!

person seekerOfKnowledge    schedule 21.12.2012
comment
Большое спасибо. Это не идеально, но очень помогает. - person Larry; 29.12.2012

В этой статье объясняется, как настроить пользовательские правила анализа кода, которые при запуске анализа кода могут отображать предупреждения, а что нет.

http://blog.tatham.oddie.com.au/2010/01/06/custom-code-analysis-rules-in-vs2010-and-how-to-make-them-run-in-fxcop-and-vs2008-too/

person seekerOfKnowledge    schedule 20.12.2012
comment
Большое спасибо за эту информацию. К сожалению, будет непросто реализовать пользовательское правило, которое анализирует мой код на предмет несоответствия преобразования типа. - person Larry; 21.12.2012
comment
Я полностью понимаю. Я думал об этом, но это единственный способ, который я смог найти в своих исследованиях. - person seekerOfKnowledge; 21.12.2012