ãåç¥ã®ããã«ãMicrosoftã¯Xamarinãè²·åããŸããã ãã€ã¯ããœããã¯æè¿ã補åã®ãœãŒã¹ã³ãŒããåŸã ã«ãªãŒãã³ãå§ããŸããããXamarin.Formsã³ãŒãã®ãªãŒãã³ã¯å€§ããªé©ãã§ããã ç§ã¯ãã®ãããªã€ãã³ããéãæããããšãã§ããªãã£ããããéçã³ãŒãã¢ãã©ã€ã¶ãŒã䜿çšããŠãã®ãããžã§ã¯ãã®ãœãŒã¹ã³ãŒãããã§ãã¯ããããšã«ããŸããã
åæããããããžã§ã¯ã
Xamarin.Formsã¯ãããŸããŸãªãã©ãããã©ãŒã ïŒWindowsãWindows PhoneãiOSãAndroidïŒã«å ±éã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãäœæã§ããã¯ãã¹ãã©ãããã©ãŒã ããŒã«ãããã§ãã ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã¯ãæçµãã©ãããã©ãŒã ã®ãã€ãã£ãã³ã³ããŒãã³ãã䜿çšããŠã¬ã³ããªã³ã°ãããŸããããã«ãããXamarin.Formsã䜿çšããŠäœæãããã¢ããªã±ãŒã·ã§ã³ã¯ãåãã©ãããã©ãŒã ã®å ±éãã¥ãŒãç¶æã§ããŸãã CïŒãŸãã¯XAMLããŒã¯ã¢ããã䜿çšããŠãããŒã¿ãã€ã³ãã£ã³ã°ãšããŸããŸãªã¹ã¿ã€ã«ã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãäœæã§ããŸãã
ãã¬ãŒã ã¯ãŒã¯èªäœã®ã³ãŒããCïŒã§èšè¿°ãããŠãããGitHubã®ãªããžããªã§å ¥æã§ããŸã ã
åæããŒã«
ãããžã§ã¯ãã¯PVS-Studioéçã³ãŒãã¢ãã©ã€ã¶ãŒã䜿çšããŠãã§ãã¯ããããã®éçºã§ã¯ç§ãç©æ¥µçã«åå ããŠããŸãã æ¢åã®ã«ãŒã«ã®å€æŽãæ°ãã蚺æã«ãŒã«ã®è¿œå ãªã©ãåžžã«æ¹åã«åãçµãã§ããŸãã ãããã£ãŠãæ°ãããããžã§ã¯ãã®åãã¹ãã§ãããå€ãã®çš®é¡ã®ãšã©ãŒãç¹å®ããããšãã§ããŸãã
å蚺æã«ãŒã«ã«ã¯ããšã©ãŒã®èª¬æãšãæ£ãããªãã³ãŒããšæ£ããã³ãŒãã®äŸãå«ãããã¥ã¡ã³ããå«ãŸããŠããŸãã ã¢ãã©ã€ã¶ãŒã®è©Šçšçã¯ãã¡ãããããŠã³ããŒãã§ããŸãã ãŸããæè¿ååãæžããã¡ã¢ãç¥ãããšãææ¡ããŸãã 圌女ã¯ããã¢ããŒãžã§ã³ã®ãã®ãããªå¶éãéžæãããçç±ãšããã¹ãŠã®æ©èœãè©Šãããã«äœãããå¿ èŠããããã説æããŸãã èªãã®ãé¢åãªäººã®ããã«ãããã«ããªãã«è©±ããŸã-ç§ãã¡ã«æžããŠãã ããã
PSããã«ããã®ãµã€ãã«ã¯ããªãŒãã³ãœãŒã¹ãããžã§ã¯ãã§èŠã€ãã£ããšã©ãŒã®ããŒã¿ããŒã¹ãšã èšäºã®ã«ã¿ãã° ïŒãªãŒãã³ãœãŒã¹ãããžã§ã¯ããæè¡ãã©ãŒã«ã¹ãªã©ã®ãã§ãã¯ã«é¢ãã ïŒããããŸãã ããç解ããŠããããšããå§ãããŸãã
çãããã³ãŒãã¹ãããã
蚺æã«ãŒã«V3001ã§æ€åºããããã¯ã©ã·ãã¯ããšã©ãŒããå§ããŸãããã
const int RwWait = 1; const int RwWrite = 2; const int RwRead = 4; .... public void EnterReadLock() { .... if ((Interlocked.Add(ref _rwlock, RwRead) & (RwWait | RwWait)) == 0) return; .... }
PVS-StudioèŠåïŒ V3001 ã|ãã®å·Šãšå³ã«åãå¯æ¬¡åŒãRwWaitãããããŸã æŒç®åã SplitOrderedList.cs 458
ã³ãŒããããããããã«ãäžéšã®åŒã®å€ã¯ãããæŒç®ã䜿çšããŠèšç®ãããŸãã ããã«ãéšååŒã®1ã€-RwWait | RwWaitã«ã¯ãåãå®æ°ãã£ãŒã«ããå«ãŸããŸãã æå³ããããŸãã äžèšã§å®£èšãããå®æ°ã®ã»ããã¯2ã®çŽ¯ä¹ã«çããå€ãæã€ããããã©ã°ãšããŠã®äœ¿çšãæ瀺ãããŠããããšã¯æããã§ãïŒãããæäœã®äœ¿çšäŸã§èŠãããã«ïŒã [Flags]å±æ§ã§ããŒã¯ãããåæã«ããããé 眮ããæ¹ãããå®çšçã ãšæããŸããããã¯ããã®åæã§äœæ¥ãããšãã«å€ãã®å©ç¹ããããããŸãïŒ V3059ã®ããã¥ã¡ã³ããåç §ïŒã
çŸåšã®äŸã«é¢ããŠã¯ãããããã RwWriteå®æ°ã®äœ¿çšãæ瀺ãããŠããŸãã ããã¯ãIntelliSenseã®æ¬ ç¹ã®1ã€ã«èµ·å ããå¯èœæ§ããããŸãããã®ããŒã«ã¯ã³ãŒãã®èšè¿°ã«éåžžã«åœ¹ç«ã¡ãŸãããééã£ãå€æ°ããäŒãããããšããããããäžæ³šæã§ãã¹ãç¯ãå¯èœæ§ããããŸãã
åæ§ã®ãšã©ãŒãçºçãã次ã®ã³ãŒãäŸïŒ
public double Left { get; set; } public double Top { get; set; } public double Right { get; set; } public double Bottom { get; set; } internal bool IsDefault { get { return Left == 0 && Top == 0 && Right == 0 && Left == 0; } }
PVS-StudioèŠåïŒ V3001 ã&&ãæŒç®åã®å·ŠåŽãšå³åŽã«åäžã®å¯æ¬¡åŒãLeft == 0ãããããŸãã Thickness.cs 29
åŒã«2åããµãåŒLeft == 0ããããŸãã æããã«ãããã¯ééãã§ãã æåŸã®éšååŒã®ä»£ããã«ã次ã®ã³ãŒããé 眮ããå¿ èŠããããŸã-Bottom == 0ãããã¯ããã®åŒã§ãã§ãã¯ãããªãå¯äžã®ããããã£ïŒããžãã¯ã«åŸããäžé£ã®ããããã£ã«åºã¥ãïŒã§ããããã§ãã
次ã®ãšã©ãŒã¯ãåãååã§éšåçã«é¡äŒŒããã³ãŒããæã€2ã€ã®ãã¡ã€ã«ã«ãããšããç¹ã§èå³æ·±ããã®ã§ãã ãããŠãããã¯ãšã©ãŒãå¢å ããããšãããããŸã-圌ãã¯1ã€ã®å Žæã§ééããç¯ãããã®ã³ãŒããå¥ã®å Žæã«ã³ããŒããŸãã-opïŒ -ããã«ããªãã®ããã®å¥ã®ééã£ãå ŽæããããŸãã
public override SizeRequest GetDesiredSize(int widthConstraint, int heightConstraint) { .... int width = widthConstraint; if (widthConstraint <= 0) width = (int)Context.GetThemeAttributeDp(global::Android .Resource .Attribute .SwitchMinWidth); else if (widthConstraint <= 0) width = 100; .... }
PVS-Studio èŠå ïŒ V3003 ãifïŒAïŒ{...} else ifïŒAïŒ{...}ããã¿ãŒã³ã®äœ¿çšãæ€åºãããŸããã è«çãšã©ãŒãååšããå¯èœæ§ããããŸãã è¡ã確èªããŠãã ããïŒ28ã30ãXamarin.Forms.Platform.Android SwitchRenderer.cs 28
ãã®ã³ãŒãã§ã¯ã ifã¹ããŒãã¡ã³ãã«å¥åŠãªããžãã¯ããããŸãã ç¹å®ã®æ¡ä»¶ããã§ãã¯ããïŒ widthConstraint <= 0 ïŒãæºããããªãå Žåã¯ãåãæ¡ä»¶ãå床ãã§ãã¯ãããŸãã ãšã©ãŒïŒ ãšã©ãŒã ãããããããä¿®æ£ããæ¹æ³ã¯èšãã®ãããå°é£ã§ãã ãã®ã¿ã¹ã¯ã¯ããã§ã«ã³ãŒããæžããããã°ã©ããŒã®è©ã«ããã£ãŠããŸãã
ç§ãèšã£ãããã«ããŸã£ããåããšã©ãŒãåãååã®ãã¡ã€ã«ã§èŠã€ãããŸããã 察å¿ããã¢ãã©ã€ã¶ãŒã¡ãã»ãŒãžã¯æ¬¡ã®ãšããã§ããV3003 'ifïŒAïŒ{...} else ifïŒAïŒ{...}'ãã¿ãŒã³ã®äœ¿çšãæ€åºãããŸããã è«çãšã©ãŒãååšããå¯èœæ§ããããŸãã 26ã28è¡ã確èªããŠãã ãããXamarin.Forms.Platform.AndroidSwitchRenderer.cs 26
ä»®æ³å€ã¡ã«ããºã ã«ãããåŒã®å€ãåžžã«trueãŸãã¯falseã§ãããšå€æããV3022蚺æãå«ããå€ãã®èšºæã«ãŒã«ãå€§å¹ ã«æ¹åãããŸããã ãã®å©ããåããŠçºèŠãããããã€ãã®äŸãèŠãããšããå§ãããŸãïŒ
public TypeReference ResolveWithContext(TypeReference type) { .... if (genericParameter.Owner.GenericParameterType == GenericParameterType.Type) return TypeArguments[genericParameter.Position]; else return genericParameter.Owner.GenericParameterType == GenericParameterType.Type ? UnresolvedGenericTypeParameter : UnresolvedGenericMethodParameter; .... }
PVS-Studio èŠå ïŒ V3022åŒ 'genericParameter.Owner.GenericParameterType == GenericParameterType.Type'ã¯åžžã«falseã§ãã ICSharpCode.Decompiler TypesHierarchyHelpers.cs 441
èå³ã®ãªãã¡ãœããã®éšåãåé€ãããšããäºå®ã«ãããããããä»ã§ããšã©ãŒã¯ããŸãç®ç«ããªããããããŸããã ãã®ç¶æ³ãä¿®æ£ããããã«ãçãå€æ°åã§ã³ãŒããæžãçŽããŠãã³ãŒããããã«åçŽåããããšãææ¡ããŸãã
if (a == enVal) return b; else return a == enVal ? c : d;
ããã§ãã¹ãŠãå°ãæ確ã«ãªããŸããã åé¡ã®åå ã¯ãäžé æŒç®åã«ãã2çªç®ã®ãã§ãã¯a == enValïŒgenericParameter.Owner.GenericParameterType == GenericParameterType.TypeïŒã§ãã ifã¹ããŒãã¡ã³ãã® elseãã©ã³ãã®äžé æŒç®åã¯æå³ããããŸãã-ãã®å Žåãã¡ãœããã¯åžžã«d ïŒ UnresolvedGenericMethodParameter ïŒãè¿ããŸãã
ããªãã¯åé¡ãäœã§ããããæšæž¬ããŠããªãå Žå-ç§ã¯èª¬æããŸãã ããã°ã©ã ãäžé æŒç®åã®å€ã®èšç®ã«éãããšãåŒa == enValãfalseã§ããããšã¯ãã§ã«ããã£ãŠãããããäžé æŒç®åã§ã¯åãå€ã«ãªããŸãã çµè«ïŒäžé æŒç®åã®çµæã¯åžžã«åãã§ãã ééã
ã¡ãœããããäœåãªã³ãŒããã«ãããããšããŠããæ®ãã®éšåã§ã¯ãšã©ãŒãå·§åŠã«é ãããŠããããããã®ãããªæ¬ é¥ãããã«æ€åºããããšã¯å°é£ã§ãã ãã®ãèœãšãç©Žããç¹å®ããããã«ãããã«ç°¡ç¥åããå¿ èŠããããŸããã ãã ããã¢ãã©ã€ã¶ãŒã«ã¯ãã®ãããªåé¡ã¯ãªããã¿ã¹ã¯ã«ç°¡åã«å¯ŸåŠã§ããŸããã
ãã¡ãããããã¯ãã®ãããªå Žåã ãã§ã¯ãããŸããã ããã«å¥ã®ãã®ããããŸãïŒ
TypeReference DoInferTypeForExpression(ILExpression expr, TypeReference expectedType, bool forceInferChildren = false) { .... if (forceInferChildren) { .... if (forceInferChildren) { InferTypeForExpression(expr.Arguments.Single(), lengthType); } } .... }
PVS-StudioèŠåïŒ V3022åŒãforceInferChildrenãã¯åžžã«trueã§ãã ICSharpCode.Decompiler TypeAnalysis.cs 632
ç¹°ãè¿ããŸããããã£ããã«æ°ã¥ããããããããã«ãäœåãªã³ãŒãããã¹ãŠåãåããŸãã ãããŠããã«ãããŸã-forceInferChildrenæ¡ä»¶ã¯2åãã§ãã¯ãããŸããããã®å€æ°ã¯ifã¹ããŒãã¡ã³ãã®éã§ã¯äœ¿çšãããŸããã ãããã¡ãœããã®ãã©ã¡ãŒã¿ãŒã§ãããšèãããšãä»ã®ã¹ã¬ãããã¡ãœãããçŽæ¥ã¢ã¯ã»ã¹ããã«å€æŽããããšã¯ã§ããªããšçµè«ä»ããããšãã§ããŸãã ãããã£ãŠãæåã®ifã¹ããŒãã¡ã³ããå®è¡ããããšã2çªç®ã®ã¹ããŒãã¡ã³ããåžžã«å®è¡ãããŸãã å¥åŠãªè«çã
V3022-V3063ã«é¡äŒŒãã蚺æããããŸãã ãã®èšºæã«ãŒã«ã¯ãæ¡ä»¶åŒã®äžéšãåžžã«trueãŸãã¯falseã§ããããšã決å®ããŸãã 圌女ã®ãããã§ãããã€ãã®èå³æ·±ãã³ãŒããæ€åºããããšãã§ããŸããã
static BindableProperty GetBindableProperty(Type elementType, string localName, IXmlLineInfo lineInfo, bool throwOnError = false) { .... Exception exception = null; if (exception == null && bindableFieldInfo == null) { exception = new XamlParseException( string.Format("BindableProperty {0} not found on {1}", localName + "Property", elementType.Name), lineInfo); } .... }
PVS-StudioèŠåïŒ V3063æ¡ä»¶åŒã®äžéšã¯åžžã«çã§ãïŒäŸå€== nullã Xamarin.Forms.Xaml ApplyPropertiesVisitor.cs 280
å¯åŒã®äŸå€== nullã«èå³ããããŸã ã æããã«ãããã¯åžžã«çå®ã§ãã ãªããã®ãã§ãã¯ã§ããïŒ äžæã ã¡ãªã¿ã«ããããã°äžã«å€ãå€æŽã§ããããšãäœããã®åœ¢ã§ç¥ãããã³ã¡ã³ãã¯ãããŸããïŒ // new ExceptionïŒïŒ;ãªã© ïŒã¯ããã«ãããŸããã
ãããã¯ã蚺æã«ãŒã«V3022ããã³V3063ã«ãã£ãŠæ€åºãããå¯äžã®çãããã¹ãããã§ã¯ãããŸããã ãããããããã«çŠç¹ãåãããããšã¯ããŸããããä»ã«äœãé¢çœããšæã£ãã®ãèŠãŠã¿ãŸãããã
void WriteSecurityDeclarationArgument(CustomAttributeNamedArgument na) { .... output.Write("string('{0}')", NRefactory.CSharp .TextWriterTokenWriter .ConvertString( (string)na.Argument.Value).Replace("'", "\'")); .... }
èŠåPVS-StudioïŒ V3038 'Replace'é¢æ°ã®æåã®åŒæ°ã¯2çªç®ã®åŒæ°ãšåãã§ãã ICSharpCode.Decompiler ReflectionDisassembler.cs 349
ãã®ã³ãŒããããæååã«å¯ŸããŠåŒã³åºãããReplaceã¡ãœããã«èå³ããããŸãã ã©ããããããã°ã©ããŒã¯ãã¹ãŠã®åäžåŒçšç¬Šæåãã¹ã©ãã·ã¥ãšåŒçš 笊ã«çœ®ãæãããã£ãããã§ãã ããããå®éã«ã¯ã2çªç®ã®å Žåãã¹ã©ãã·ã¥æåããšã¹ã±ãŒããããããããã®ã¡ãœãããåŒã³åºããšãåäžåŒçšç¬Šãããã«çœ®ãæããããŸãã ä¿¡ããããªãïŒ çããïŒ "'"ã "\'"ïŒ ã äžéšã®äººã«ãšã£ãŠã¯ãããã¯æããã§ã¯ãªããããããŸããããã¢ãã©ã€ã¶ãŒã«ãšã£ãŠã¯ããã§ã¯ãããŸããã ãšã¹ã±ãŒããåé¿ããã«ã¯ãæååãªãã©ã«ã®åã«@æåã䜿çšã§ããŸãã 次ã«ã Replaceã¡ãœããã®æ£ããåŒã³åºãã¯æ¬¡ã®ããã«ãªããŸãã
Replace("'", @"\'")
åžžã«åãå€ãè¿ãã¡ãœããããããŸããã äŸïŒ
static bool Unprocessed(ICollection<string> extra, Option def, OptionContext c, string argument) { if (def == null) { .... return false; } .... return false; }
PVS-StudioèŠåïŒ V3009ãã®ã¡ãœãããåžžã«1ã€ã®åãå€ãfalseããè¿ãã®ã¯å¥åŠã§ãã Xamarin.Forms.UITest.TestCloud OptionSet.cs 239
ãã®ã¡ãœããã§ã©ã®åŒæ°ãå ¥åãããäœãè¡ãããŠããåžžã«falseãè¿ããŸãã åæããŠãããã¯ãªããšãªãå¥åŠã«èŠããã
ãšããã§ããã®ã³ãŒãã¯åäŒããŸãã-ã¡ãœããã¯å®å šã«ã³ããŒãããå¥ã®å Žæã«ç§»åãããŸããã ã¢ãã©ã€ã¶ãŒã¡ãã»ãŒãžïŒV3009ãã®ã¡ãœãããåžžã«1ã€ã®åãå€ãfalseããè¿ãã®ã¯å¥åŠã§ãã Xamarin.Forms.Xaml.Xamlg Options.cs 1020
æœåšçã«ãšã©ãŒãå«ãäŸå€ã®åçæã§ãããã€ãã®ã³ãŒããã©ã°ã¡ã³ããæ€åºãããŸããã
static async Task<Stream> GetStreamAsync (Uri uri, CancellationToken cancellationToken) { try { await Task.Delay (5000, cancellationToken); } catch (TaskCanceledException ex) { cancelled = true; throw ex; } .... }
PVS-StudioèŠåïŒ V3052å ã®äŸå€ãªããžã§ã¯ããexãã飲ã¿èŸŒãŸããŸããã å ã®äŸå€ã®ã¹ã¿ãã¯ã倱ãããå¯èœæ§ããããŸãã Xamarin.Forms.Core.UnitTests ImageTests.cs 221
ããžãã¯ã¯åçŽã«æããŸãã äŸå€ãçºçããå Žåãããã€ãã®ã¢ã¯ã·ã§ã³ãå®è¡ããŠåçæããŸãã ããããæªéã¯è©³çŽ°ã«ãããŸãã ãã®å ŽåãäŸå€ãå床ã¹ããŒããããšãå ã®äŸå€ã®ã¹ã¿ãã¯ã¯å®å šã«äžæžããããŸãã ãããåé¿ããããã«ãåãäŸå€ãæ°ãã«ã¹ããŒããå¿ èŠã¯ãªãã ã¹ããŒæŒç®åãåŒã³åºããŠæ¢åã®äŸå€ãã¹ããŒããã ãã§ãã 次ã«ã catchãããã¯ã®ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
cancelled = true; throw;
åæ§ã®äŸïŒ
public void Visit(ValueNode node, INode parentNode) { .... try { .... } catch (ArgumentException ae) { if (ae.ParamName != "name") throw ae; throw new XamlParseException( string.Format("An element with the name \"{0}\" already exists in this NameScope", (string)node.Value), node); } }
PVS-StudioèŠåïŒ V3052å ã®äŸå€ãªããžã§ã¯ã 'ae'ã飲ã¿èŸŒãŸããŸããã å ã®äŸå€ã®ã¹ã¿ãã¯ã倱ãããå¯èœæ§ããããŸãã Xamarin.Forms.Xaml RegisterXNamesVisitor.cs 38
ã©ã¡ãã®å Žåãã以åã®äŸå€ã«é¢ããæ å ±ã¯å€±ãããŸãã ãããŠã2çªç®ã®ã±ãŒã¹ã§ããã®æ å ±ãé¢é£ããŠããªããšãŸã ä»®å®ã§ããå ŽåïŒãŸã å¥åŠã§ããïŒã1çªç®ã®ã±ãŒã¹ã§ã¯ãäŸå€ãã¹ããŒãããå¯èœæ§ã¯äœãã§ããã代ããã«æ°ããäŸå€ãçæããŸãã 解決çã¯åã®äŸãšåãã§ã-åŒæ°ãªãã§throwæŒç®åãåŒã³åºããŸãã
次ã®æçãç ç²ã«ããŠ-ãããééãã§ãããã©ããã¯ç¢ºãã«èšããŸããããå¥åŠã«èŠããŸãã
void UpdateTitle() { if (Element?.Detail == null) return; ((ITitleProvider)this).Title = (Element.Detail as NavigationPage) ?.CurrentPage?.Title ?? Element.Title ?? Element?.Title; }
PVS-StudioèŠåïŒ V3042 NullReferenceExceptionã®å¯èœæ§ããããŸãã ãïŒãã ããã³ããã æŒç®åã¯ãElementãªããžã§ã¯ãã®ã¡ã³ããŒã«ã¢ã¯ã»ã¹ããããã«äœ¿çšãããŸãXamarin.Forms.Platform.WinRT MasterDetailPageRenderer.cs 288
ã¢ãã©ã€ã¶ãŒã¯ã Titleããããã£ãElement.TitleãšElementïŒ.Titleã®ããŸããŸãªæ¹æ³ã§ã¢ã¯ã»ã¹ãããæåã¯çŽæ¥ã¢ã¯ã»ã¹ããã次ã«ãã«æ¡ä»¶æŒç®åã䜿çšããŠã¢ã¯ã»ã¹ãããããšãèŠåããŸããã ããããããã§ã¯ãã¹ãŠãããã»ã©æ確ã§ã¯ãããŸããã
ãæ°ã¥ããããããŸããããã¡ãœããã®éå§æã«ElementïŒ.Detail == nullãã§ãã¯ãå®è¡ãããŸããElement== nullã®å Žåãããã§åºå£ãå®è¡ããã以éã®æäœã«å°éããªããšæ³å®ãããŸãã
åæã«ãåŒElementïŒ.Titleã¯ãå®è¡æã«Elementãnullã§ããããšã瀺åããŠããŸã ã ãã®å Žåãåã®æ®µéã§Titleããããã£ã«çŽæ¥ã¢ã¯ã»ã¹ãããšã NullReferenceExceptionåã®äŸå€ãçæããããããnullæ¡ä»¶æŒç®åã䜿çšããŠãæå³ããããŸããã
ãããã«ããããã®ã³ãŒãã¯éåžžã«å¥åŠã«èŠããä¿®æ£ããå¿ èŠããããŸãã
ãªããžã§ã¯ããç¬èªã®åã«ãã£ã¹ãããããšãå¥åŠã«èŠããŸããã ãã®ãããªã³ãŒãã®äŸã次ã«ç€ºããŸãã
public FormsPivot Control { get; private set; } Brush ITitleProvider.BarBackgroundBrush { set { (Control as FormsPivot).ToolbarBackground = value; } }
èŠåPVS-StudioïŒ V3051éå°ãªåãã£ã¹ãã ãªããžã§ã¯ãã¯ãã§ã«ãFormsPivotãã¿ã€ãã§ãã Xamarin.Forms.Platform.UAP TabbedPageRenderer.cs 73
ãã®å Žåãããã¯ãšã©ãŒã§ã¯ãããŸãããã Controlãªããžã§ã¯ãã«FormsPivotã¿ã€ããæ¢ã«ãããããã³ãŒãã¯å°ãªããšãçãããèŠããŸãã ãšããã§ãããã¯ãã®çš®ã®å¯äžã®èŠåã§ã¯ãªããä»ã®äººãåºäŒã£ãïŒ
- V3051éå°ãªåãã£ã¹ãã ãªããžã§ã¯ãã¯ãã§ã«ãFormsPivotãã¿ã€ãã§ãã Xamarin.Forms.Platform.UAP TabbedPageRenderer.cs 78
- V3051éå°ãªåãã£ã¹ãã ãªããžã§ã¯ãã¯ãã§ã«ãFormsPivotãã¿ã€ãã§ãã Xamarin.Forms.Platform.UAP TabbedPageRenderer.cs 282
- V3051éå°ãªåãã£ã¹ãã ãªããžã§ã¯ãã¯ãã§ã«ãFormsPivotãã¿ã€ãã§ãã Xamarin.Forms.Platform.WinRT.Phone TabbedPageRenderer.cs 175
- V3051éå°ãªåãã£ã¹ãã ãªããžã§ã¯ãã¯ãã§ã«ãFormsPivotãã¿ã€ãã§ãã Xamarin.Forms.Platform.WinRT.Phone TabbedPageRenderer.cs 197
- V3051éå°ãªåãã£ã¹ãã ãªããžã§ã¯ãã¯ãã§ã«ãFormsPivotãã¿ã€ãã§ãã Xamarin.Forms.Platform.WinRT.Phone TabbedPageRenderer.cs 205
åçŽåã§ããæ¡ä»¶ããããŸãã ãããã®1ã€ã®äŸïŒ
public override void LayoutSubviews() { .... if (_scroller == null || (_scroller != null && _scroller.Frame == Bounds)) return; .... }
PVS-StudioèŠåïŒ V3031éå°ãªãã§ãã¯ã¯åçŽåã§ããŸãã ã||ã æŒç®åã¯å察ã®åŒã§å²ãŸããŠããŸãã Xamarin.Forms.Platform.iOS.Classic ContextActionCell.cs 102
ãã®åŒã¯ã _scrollerïŒ= NulléšååŒãåé€ããããšã§ç°¡ç¥åã§ããŸãã ã||ãæŒç®åã®å·ŠåŽã®åŒãåœã®å Žåã«ã®ã¿èšç®ãããŸã -_scroller == null ããããã£ãŠ-_scroller㯠nullã§ã¯ãªãã NullReferenceExceptionãååŸããå¿é ã¯ãããŸããã 次ã«ãç°¡ç¥åãããã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
if (_scroller == null || _scroller.Frame == Bounds))
è»èã§é£ã¶
æ®å¿µãªããããœãªã¥ãŒã·ã§ã³ãå®å šã«çµã¿ç«ãŠãããšã¯ã§ããŸããã§ãã-çŽ6ã€ã®ãããžã§ã¯ããæªæ€èšŒã®ãŸãŸã§ãããã¯ã©ã¹ãäœããã®æ¹æ³ã§äœ¿çšãããå Žæã¯ãå¯èœãªéã培åºçãªåæãåããŸããã§ããã ããããã圌ãã¯äœãä»ã®èå³æ·±ããã®ãèŠã€ããããšãã§ãããããããŸããããæ²ããããªã
ãšããã§ãã¬ãã«3ã«ããã¡ãã»ãŒãžV051ã«ãã£ãŠãåæã®åé¡ã«ã€ããŠèª¿ã¹ãããšãã§ããŸãã ååãšããŠããã®ãããªèŠåã®ååšã¯ãCïŒãããžã§ã¯ãã«äœããã®ã³ã³ãã€ã«ãšã©ãŒãå«ãŸããŠããããšã瀺ãã·ã°ãã«ã§ãããã¢ãã©ã€ã¶ãŒã¯è€éãªåæãå®è¡ããããã«å¿ èŠãªãã¹ãŠã®æ å ±ãååŸã§ããŸããã ããã§ãã圌ã¯ãã¿ã€ããšãªããžã§ã¯ãã«é¢ãã詳现æ å ±ãäžèŠãªãã§ãã¯ãå®è¡ããããšããŸãã
ãããžã§ã¯ãããã§ãã¯ãããšããèŠåV051ããªãããšã確èªããããšããå§ãããŸãã ãããŠãããããååšããå Žåã¯ãããããåé€ããŠã¿ãŠãã ããïŒãããžã§ã¯ããã³ã³ãã€ã«ãããŠããããšã確èªãããã¹ãŠã®äŸåé¢ä¿ãããŒããããŠããããšã確èªããŠãã ããïŒã
ãããã«
Xamarin.Formsãã§ãã¯ã¯åãå¥ããŸãã-æããã«ééãããããéåžžã«çãããããŸãã¯å¥åŠãªããŸããŸãªèå³æ·±ãå ŽæããããŸããã éçºè ããã®èšäºãè¿åããŠãããã§æžãããã³ãŒãã®æçãä¿®æ£ããªãããšãé¡ã£ãŠããŸãã ã¢ãã©ã€ã¶ãŒã®è©ŠçšçãããŠã³ããŒãããããšã§ãçºèŠããããã¹ãŠã®çãããå Žæã衚瀺ã§ããŸãã PVS-Studioãç¶ç¶çã«å®è£ ããããšã¯ããšã©ãŒã衚瀺ãããçŽåŸã«æ€åºããã³ä¿®æ£ã§ããããã«ãããããã«åªãããããæ£ç¢ºãªãœãªã¥ãŒã·ã§ã³ã§ãã
ãã®èšäºãè±èªåã®èŽè¡ãšå ±æãããå Žåã¯ã翻蚳ãžã®ãªã³ã¯ã䜿çšããŠãã ããïŒã»ã«ã²ã€ãŽã¡ã·ãªãšãã Microsoftã¯Xamarin.Formsã®ãœãŒã¹ã³ãŒããéããŸããã PVS-Studioã§ç¢ºèªããæ©äŒãéãããšã¯ã§ããŸããã§ãã ã
èšäºãèªãã§è³ªåããããŸããïŒ
å€ãã®å Žåãèšäºã«ã¯åã質åãå¯ããããŸãã ããã§åçãéããŸããïŒ PVS-StudioããŒãžã§ã³2015ã«é¢ããèšäºã®èªè
ããã®è³ªåãžã®åç ã ãªã¹ããã芧ãã ããã