![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
Alticor |
|
||||||||||||||||||||||||||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 15.12.2015 Репутация: нет Всего: нет |
![]() Около года назад Microsoft выложила в открытый доступ исходный код таких проектов, как CoreCLR и CoreFX. Последний проект до недавнего времени не был нам интересен, потому что написан на языке C#, а не C++. Но с выходом новой версии PVS-Studio 6.00, поддерживающей проекты и на языке программирования C#, я решил вернуться к CoreFX и написать статью. Введение .NET Core это модульная реализация библиотек и среды выполнения, которая включает подмножество .NET Framework. .NET Core состоит из набора библиотек, называемых "CoreFX" и небольшой оптимизированной рабочей среды "CoreCLR". .NET Core распространяется с открытым исходным кодом, который доступен на GitHub:Это крупные продукты от Microsoft, содержащие качественный исходный код, но подозрительные участки кода всё равно можно найти. О проверке CoreCLR можно прочитать в статье "PVS-Studio: 25 подозрительных фрагментов кода из CoreCLR". Проект CoreFX, о котором подойдёт речь в статье, проверялся с помощью статического анализатора PVS-Studio 6.00, который теперь поддерживает и C#! Наиболее опасные найденные места V3027 The variable 'start.BaseMapping' was utilized in the logical expression before it was verified against null in the same logical expression. Mappings.cs 598
В коде присутствует серьёзная логическая ошибка! В теле цикла объект с именем 'start' изменяется на каждой итерации, и цикл выполняется, пока объект находится в определённом состоянии. НО проверка условия "start.BaseMapping != null" выполняется после обращения к "start.BaseMapping.IsSequence", а это может привести к разыменованию нулевой ссылки. V3019 Possibly an incorrect variable is compared to null after type conversion using 'as' keyword. Check variables 'comparand', 'comparedCredentialKey'. CredentialCache.cs 4007
В функцию может прийти объект любого типа или null. Если придёт null, этот случай будет обработан корректно. Если это будет объект такого типа, который не удастся преобразовать к типу "CredentialHostKey", то произойдёт ошибка при обращении к "comparedCredentialKey.AuthenticationType", т.к. переменная "comparedCredentialKey" может быть равна null. Скорее всего, хотели написать так:
Аналогичное место в коде:
Почему-то независимо от условия, переменная "HResult" всегда принимает одно и то же значение. Скорее всего функция должна быть реализована другим образом. V3008 The 'ResPrec' variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 1735, 1731. SQLDecimal.cs 1735
Очень подозрительно, что значение переменной "ResPrec" вычисляется по некой формуле, но потом просто перетирается другим значением. V3020 An unconditional 'return' within a loop. Enumerable.cs 517
Странно, в теле цикла "while" выполняется выход из функции без какого-либо условия. Возможно, в коде присутствует ошибка. Ещё один похожий цикл:
В переменную 'prefix' сохраняется подстрока из 'localName' длинной "colon", потом это значение перетирается другим. Дальше по коду видно, что используется оставшаяся подстрока из 'localName', а первая часть была потеряна. Очень сомнительный код. V3030 Recurring check. The 'baseTableRowCounts == null' condition was already verified in line 68. MetadataAggregator.cs 70
Анализатор обнаружил условие, которое уже проверялось. Если посмотреть на фрагмент кода, то последняя проверка в 'else' - "baseTableRowCounts == null" не имеет смысла. Зато выше по коду можно увидеть, что если переменная "baseTableRowCounts" равна null, то её значение пытаются изменить вызовом функции CalculateBaseCounts(). Вот после этой функции, скорее всего, и не хватает дополнительной проверки "baseTableRowCounts == null". Т.е. скорее всего код должен выглядеть так:
Остальные предупреждения V3022 Expression 'readercount >= 0' is always true. Unsigned type value is always >= 0. ReaderWriterLockSlim.cs 977
Переменная "readercount" имеет беззнаковый тип, поэтому условие "readercount >= 0" не имеет смысла. Скорее всего, раньше она была знакового типа, но тогда для функции ExitMyLOck() в последнем 'else' был хоть какой-то шанс выполниться. Теперь этот код никогда не получает управления. Необходимо переписать это место. V3014 It is likely that a wrong variable is being incremented inside the 'for' operator. Consider reviewing 'i'. RegexCharClass.cs 1094
Анализатор обнаружил изменение счётчика одного цикла в другом. Сложно сказать, есть ли в этой функции ошибка, но написано не очень понятно. Вполне можно где-нибудь ошибиться в индексе при обращении к массиву, т.к. в таком коде сложно следить за изменением одного счётчика в нескольких циклах. V3004 The 'then' statement is equivalent to the 'else' statement. XmlSerializationWriterILGen.cs 1213
Условие, которое ни на что не влияет, т.к. всегда будет выполнятся один код. Классический copy-paste. V3004 The 'then' statement is equivalent to the 'else' statement. SqlUtil.cs 93
Тут тоже что-то много одинакового кода в условии, хотя в комментарии написано, что ситуации разные. Заключение Вот проверен ещё один проект от Microsoft. Для такого объёма проект имеет довольно качественный код, но программисты всё равно могут допускать ошибки. Статья является обзорной и содержит далеко не все предупреждения анализатора, которые были получены в отчёте. Качественному коду способствуют два очень важных обстоятельства:
Спасибо за внимание. И безбажного вам кода в Новом Году! ![]() |
||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |