Как да бъдете предупредени за потенциални аритметични грешки поради преобразуване на тип?

Работя върху изчислителен модул, използвайки C#, и се сблъсках с това:

double v = 4 / 100;

Знам, че това е грешна инициализация, която връща v = 0.0 вместо v = 0.04

Правилата на c# казват, че трябва да се уверя, че поне един от членовете е двоен, като това:

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
Има uservoice билет с искане за тази функция.   -  person Frédéric Hamidi    schedule 12.12.2012
comment
Използвам C# компилатора, предоставен с .NET 4.0 и Visual Studio 2010.   -  person Larry    schedule 12.12.2012


Отговори (2)


Добре, след малко игра и какво ли още не, имам решение. Използвах тази статия, за да стигна до това решение .Използвам StyleCop, така че ще трябва да го вземете и инсталирате. След това можете да изтеглите моя C# проект MathematicsAnalyzer.

Първо, не отчитах всички несъответствия при преобразуване на типове. Всъщност приемам само една част.

По принцип проверявам дали редът съдържа „double“, последван от интервал. Знам, че това може да доведе до фалшиви предупреждения, защото краят на клас може да бъде двоен или произволен брой други неща, но ще оставя това на вас да разберете как правилно да изолирате типа.

Ако бъде намерено съвпадение, проверявам дали съответства на този регулярен израз:

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