Pull to refresh

Comments 38

Хочу выразить благодарность компании Microsoft за то, что она создала этот открытый проект. Он окажет большое влияние на развитие C#-инфраструктуры. Да он уже оказывает влияние! Например, на базу Rolsyn переносятся такие известные проекты как ReSharper или CodeRush:
И по вашей же ссылке текст:
The short answer to this tremendously popular question is, no, ReSharper will not use Roslyn. There are at least two major reasons behind this.
Вы вообще читаете то, на что ссылаетесь?
Можно было и в личную почту написать. У меня было мало времени на подготовку статьи. :)
+ есть замечательное видео с конференции DotNext 2015

Поразительно! Я был довольно скептически настроен, но за час нашел кучу ошибок, некоторые критичные, которые случаются в редких случаях

Не реклама, просто огромная благодарность :)
Надеемся что когда-нибудь PVS улучшит вид этого окна в темной теме Visual Studio
А решарпер почему не используете?
используем, но только как помощник для написания кода. все его warnings уже давно все игнорируют.
Вот на том же проекте он сейчас выдал 5429 issues, понятно что никто не будет с этим разбираться
Лучше уж кому нибудь разобраться с ними и отключить все шумные предупреждения для проекта (там можно настройки закомитить с проектом), а самые полезные исправлять
Вот на том же проекте он сейчас выдал 5429 issues, понятно что никто не будет с этим разбираться

все его warnings уже давно все игнорируют.

Если вы отключили решарперовские варнинги — то где гарантия, что и предупреждения PVS не отправятся в тот же игнор?
Я думаю у нас получится в PVS-Studio сделать C# анализ с очень низким уровнем ложных срабатываний.
Все эти identical subexpressions намекают на то, что вы не очень-то аккуратно программируете. Если switch не покрывает все кейсы, это нормально. Как вы умудрились посчитать All() по перечислению и при этом никуда не присвоить — большой вопрос.
почему-то перестал работать

Exception message:
There was no endpoint listening at net.pipe://localhost/33cde34b-307f-4abb-9c31-2a1dd644aa6b/PVSStudioAnalyzer that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details.

Exception type:
System.ServiceModel.EndpointNotFoundException

Stack:
Server stack trace:
at System.ServiceModel.Channels.ConnectionUpgradeHelper.DecodeFramingFault(ClientFramingDecoder decoder, IConnection connection, Uri via, String contentType, TimeoutHelper& timeoutHelper)
at System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.SendPreamble(IConnection connection, ArraySegment`1 preamble, TimeoutHelper& timeoutHelper)
at System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.DuplexConnectionPoolHelper.AcceptPooledConnection(IConnection connection, TimeoutHelper& timeoutHelper)
at System.ServiceModel.Channels.ConnectionPoolHelper.EstablishConnection(TimeSpan timeout)
at System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.OnOpen(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel channel, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan timeout, CallOnceManager cascade)
at System.ServiceModel.Channels.ServiceChannel.EnsureOpened(TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at ProgramVerificationSystems.PVSStudio.Analyzer.Integration.IAnalyzerContract.StartAnalysis(IDictionary`2 projectToFilesMap, Boolean obfuscateResults)
at ProgramVerificationSystems.PVSStudio.Analyzer.Integration.AnalyzerServiceSession.StartRemoteAnalysis(IDictionary`2 projectFilesMap, String channelName) in D:\CCNetProjects\PVS-Studio Setup\WorkDir\PVS-Studio\PVS-Studio\Analyzer\Integration\AnalyzerServiceSession.cs:line 192
at ProgramVerificationSystems.PVSStudio.Analyzer.Integration.AnalyzerServiceSession.Execute(IDictionary`2 projectFilesMap, String platform, String configuration, String solutionName, CancellationToken cancelToken, Boolean obfuscateResults) in D:\CCNetProjects\PVS-Studio Setup\WorkDir\PVS-Studio\PVS-Studio\Analyzer\Integration\AnalyzerServiceSession.cs:line 106
at ProgramVerificationSystems.PVSStudio.ProcessingEngine.<>c__DisplayClass53_0.b__10() in D:\CCNetProjects\PVS-Studio Setup\WorkDir\PVS-Studio\PVS-Studio\ProcessingEngine.cs:line 799

PVS-Studio Version: 6.0.15162.1

Visual Studio Version: 14.0 Professional

Visual Studio LocaleID: en

Windows Version: Microsoft Windows NT 10.0.10240.0
Отпишите, пожалуйста, баг на support@viva64.com, мы попробуем разобраться.
Примеры ошибок в коде:

			if (totalReadsCount <= 0 || totalReadsCount <= 0 || noOptimizedSessions <= 0 || noOptimizedViews <= 0)
				return;


			SessionId = SessionId;


method always returns false
		private bool FixRelativeUrl(ref string url, Uri frameUrl)
		{
			if (Uri.TryCreate(url, UriKind.Relative, out frameUrl))
			{
				try
				{
					var frameUriBuilder = new UriBuilder("http", frameUrl.ToString());
					url = frameUriBuilder.Uri.AbsoluteUri;
				}
				catch
				{
					return false;
				}
			}
			return false;
		}


V3010 The return value of function 'Remove' is required to be utilized. FeedProcessor.cs 429
            if (str[str.Length - 1] == ',')
                str.Remove(str.Length - 1);


break is unconditional
		foreach (string author in authors)
                {
                    ...
                    break;
                }


Давно не следил за вашими постами, потому есть вопрос:
Могу ли я бесплатно проверить коммерческий проект с открытым кодом? Если да, то как мне это сделать? А можете ли это сделать вы и написать статью? :)
Скачайте триал и проверьте проект — это самый лучше способ познакомиться с анализатором. Сделать мы можем. Можем даже ошибки поправить. Но «за дорого» :-).
Кажется, вы меня неправильно поняли. Я имею к этому проекту отношение только как пользователь. Ну и я имел ввиду в рамках обычного цикла статей, таких, как эта.

В любом случае, спасибо за ответ. А вот вашим, хм, клиентом, я смогу стать когда вы научите PVS-Studio в Objective-C/Swift :)
Тоже проверил свои почти 2 миллиона строк. Нашел около 70 High/Medium ошибок, из них:
  1. ~20 ложных (в основном V3029, V3002, V3005, V3019)
  2. ~40 стилистических/устоявшихся (легаси код, поведение для совместимости, старый стиль кода и др.)
  3. 3 низкоприоритетных бага (V3025, V3001)
  4. 1 среднеприоритетный баг (V3003 — «if (A) { } else if (A) { }»)
  5. 2 высокоприоритетных (V3041 — целочисленное деление с результатом 0)

Удивительно, что последние два не нашел решарпер, хотя случаи очень простые. Спасибо.
Спасибо за подробную статистику! Однако не забывайте, что польза от статического анализа — в регулярном использовании.
Забыл багрепорт/пожелание. В high-dpi (scaling = 175%) иконки слишком маленькие:
Небольшой вопрос возник:
Предупреждение PVS-Studio: V3004 The 'then' statement is equivalent to the 'else' statement. GetSemanticInfoTests.cs 2269
Смущает именование выделенных частей, почему не if statement?
If <expression> then <action> else <action>

Т.е. ветки выполнения называются then и else, а if — это условие.
Ну да, логично же. А вот будь проблема в условии, вот тогда бы if statement был.
В своем проекте триалом нашел 2 серьезные ошибки, остальное ложные срабатывания, но эти 2 ошибки стоят аплодисментов.
Расскажите что за ошибки.
Расскажите, пожалуйста, про ошибки. Статистика по диагностикам очень поможет нам при принятии решений по доработке существующих правил и разработке новых.

Например, интересная статистика была в этом комментарии: habrahabr.ru/company/pvs-studio/blog/273811/#comment_8714091
Сразу скажу, я использовал пререлизную версию приложения.

Первая ошибка связана с ошибкой в условии следующего вида.

var i = 2;
if(i < 0 && i > 2)…

Вторая ошибка это присвоение значения поля/переменной самой себе.

fieldName = fieldName;

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

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

Дмитрий, я уверен, что в низком количестве ошибок не малая заслуга вашего продукта :)

Было бы круто, если бы ваш анализатор выкупил Microsoft за очень большие деньги.
Как Скайп? Не, спасибо.
Лучше бы просто содействовали в совершенствовании и интеграции, как в случае с Python-Tools
Как со Скайпом не будет. Включат в Visual Studio. А это совсем другая группа команд.
После этой статьи решил-таки попробовать. И кое-что интересное нашёл :)
source.OrderBy(String.Format("{0}.{1}", source.Name, MembersOf<TSource>.GetPath(keySelector), new ObjectParameter[] { }));


И как должно быть:
source.OrderBy(String.Format("{0}.{1}", source.Name, MembersOf<TSource>.GetPath(keySelector)), new ObjectParameter[] { });


Т.е. у обеих функций одинаковая сигнатура: string format, params object [] и закрывающая скобка стояла не там. Сам даже если бы вчитывался, не заметил бы.
V3025 Incorrect format. A different number of format items is expected while calling 'Format' function.

Это очень здорово, спасибо команде :)
к счастью, в C# 6 можно теперь использовать $"{}"
Да, в новых проектах выручает сильно
Раз уж проверили Roslyn, то было бы также интересно узнать про ошибки в ANTLR C# Runtime.
Sign up to leave a comment.