CïŒã§ããã°ã©ãã³ã°ãããšãã«ã·ãªã¢ã«åã¡ã«ããºã ã䜿çšããã®ã¯éåžžã«ç°¡åã§äŸ¿å©ã§ãããšããäºå®ã«ãããããããæ€èšãã䟡å€ã®ããç¹ããããŸãã ã·ãªã¢ã«åã®äœæ¥äžã«ã©ã®ã¬ãŒãã匷åã§ãããããã®ã¬ãŒããé衚瀺ã«ãªã£ãŠããã³ãŒãäŸãããã³PVS-Studioãé¡ã®åéãé¿ããã®ã«ã©ã®ããã«åœ¹ç«ã€ãã«ã€ããŠããããŠãã®èšäºã¯ãããªããŸãã
誰ã®ããã®èšäºã§ããïŒ
ãã®èšäºã¯ãã·ãªã¢ã«åã¡ã«ããºã ã«ç²Ÿéãå§ããã°ããã®éçºè
ã«ãšã£ãŠç¹ã«åœ¹ç«ã¡ãŸãã ããçµéšè±å¯ãªããã°ã©ããŒã¯ãèªåèªèº«ã«ãšã£ãŠèå³æ·±ãããšãåŠã¶ããšããå°é家ã§ããééããç¯ãããšã確èªããããšãã§ããŸãã
ãã ããèªè
ã¯ãã§ã«ã·ãªã¢ã«åã¡ã«ããºã ã«ç²ŸéããŠããããšãç解ãããŸãã
PVS-Studioã¯ãããšäœã®é¢ä¿ããããŸããïŒ
ãªãªãŒã¹6.05ã§ã¯ãã·ãªã¢ã«åã¡ã«ããºã ã®äœ¿çšã«é¢é£ããçãããã³ãŒããæ€åºãã6ã€ã®èšºæã«ãŒã«ãè¿œå ãããŸããã ãããã®èšºæã¯ãäž»ã«
[Serializable]å±æ§ãŸãã¯
ISerializableã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£
ã«é¢é£ããåé¡é åã
æ¢ããŸãã
ã泚æãã®èšäºã«èšèŒãããŠããã¹ããŒãã¡ã³ãã¯ã
BinaryFormatterã
SoapFormatterãªã©ã®äžéšã®
ã·ãªã¢ã©ã€ã¶ãŒã«é¢é£ããŠãããä»ã®äŸãäŸãã°
ææžãã®ã·ãªã¢ã©ã€ã¶ãŒã«é¢é£ããŠããããšãç解ããŠããå¿
èŠããããŸãã ããšãã°ãã¯ã©ã¹ã«
[Serializable]å±æ§ãååšããªãå Žåã§ããç¬èªã®ã·ãªã¢ã©ã€ã¶ãŒã§ã®ã·ãªã¢ã«åãšéã·ãªã¢ã«åãé²ãããšã¯ã§ããŸããã
ãšããã§ãã·ãªã¢ã«åã䜿çšããå Žåã¯ãã¢ãã©ã€ã¶ãŒã®è©Šçšçã
ããŠã³ããŒãããçãããå Žæããªããã³ãŒãã確èªããããšããå§ãããŸãã
ISerializableãå®è£
ãããšãã¯ãã·ãªã¢ã«åã³ã³ã¹ãã©ã¯ã¿ãŒãå¿ããªãã§ãã ãã
ISerializableã€ã³ã¿ãŒãã§ã€ã¹
ã¿ã€ãã®å®è£
ã«ããã
ã·ãªã¢ã«åãå¿
èŠãªã¡ã³ããŒãããã§ãªãã¡ã³ããŒãã¡ã³ããŒãã·ãªã¢ã«åãããšãã«æžã蟌ãå€ãªã©ãéžæããããšã§ãã·ãªã¢ã«åãå¶åŸ¡ã§ã
ãŸã ã
ISerializableã€ã³ã¿ãŒãã§ã€ã¹ã«ã¯ããªããžã§ã¯ããã·ãªã¢ã«åããããšãã«åŒã³åºããã
GetObjectDataãšãã 1ã€ã®ã¡ãœããã®å®£èšãå«ãŸããŠããŸãã ãã ãããã®ã¡ãœãããšçµã¿åãããŠããªããžã§ã¯ããéã·ãªã¢ã«åããããšãã«åŒã³åºãããã³ã³ã¹ãã©ã¯ã¿ãŒãå®è£
ããå¿
èŠããããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ã§ã¯ãããçš®ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãåã«å®è£
ããå¿
èŠã¯ãªãããããã®ã¿ã¹ã¯ã¯ãã·ãªã¢ã©ã€ãºå¯èœãªåãå®è£
ããããã°ã©ããŒãæ
åœããŸãã ã·ãªã¢ã«åã³ã³ã¹ãã©ã¯ã¿ãŒã«ã¯ã次ã®ã·ã°ããã£ããããŸãã
Ctor(SerializationInfo, StreamingContext)
ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒããªãå Žåããªããžã§ã¯ãã¯æ£åžžã«ã·ãªã¢ã«åãããŸãïŒ
GetObjectDataã¡ãœãããæ£ããå®è£
ãããŠããå ŽåïŒãã埩å
ïŒéã·ãªã¢ã«åïŒã§ããŸãã
-SerializationExceptionã¿ã€ãã®äŸå€ãã¹ããŒãããŸãã
Glimpseãããžã§ã¯ãã®åæ§ã®ã³ãŒãã®äŸãèŠãŠã¿ãŸãããã
[Serializable] internal class SerializableTestObject : ISerializable { public string TestProperty { get; set; } public void GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue("TestProperty", this.TestProperty); } }
PVS-StudioèŠåïŒ V3094ã·ãªã¢ã«å
解é€æã«äŸå€ãçºçããå¯èœæ§ããããŸãã SerializableTestObjectïŒSerializationInfoãStreamingContextïŒã³ã³ã¹ãã©ã¯ã¿ãŒããããŸããã Glimpse.Test.AspNet SessionModelConverterShould.cs 111
ãã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã®ã·ãªã¢ã«åã¯æåããŸããã察å¿ããã³ã³ã¹ãã©ã¯ã¿ãŒããªããããéã·ãªã¢ã«åãããšäŸå€ãçºçããŸãã ã»ãšãã©ã®å Žåãããã¯ééãã§ã¯ãããŸããïŒã¯ã©ã¹ãšãã¡ã€ã«ã®ååã«åºã¥ããŠããŸãïŒãã説æãããŠããç¶æ³ã®äŸãšããŠããããå¿
èŠãªãã®ã§ãã
ãã®ã¯ã©ã¹ã®ã·ãªã¢ã«åã³ã³ã¹ãã©ã¯ã¿ãŒã¯æ¬¡ã®ããã«ãªããŸãã
protected SerializableTestObject(SerializationInfo info, StreamingContext context) { TestProperty = info.GetString(nameof(TestProperty)); }
ã·ãªã¢ã«åã³ã³ã¹ãã©ã¯ã¿ãŒã®ã¢ã¯ã»ã¹ä¿®é£Ÿåã«æ³šæããŠãã ãã
ISerializableã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããåãèšèšããå Žåãã·ãªã¢ã«åã³ã³ã¹ãã©ã¯ã¿ãŒã®ã¢ã¯ã»ã¹ä¿®é£Ÿåãæ£ããå®çŸ©ããããšãéèŠã§ãã ããã§ã¯ããã€ãã®ã±ãŒã¹ãèããããŸãïŒ
- ã·ãªã¢ã«åã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãå°å°ãããŠããªãã¯ã©ã¹ã®private修食åã§å®£èšãããŸãã
- ã·ãªã¢ã«åã³ã³ã¹ãã©ã¯ã¿ãŒã¯ã ãããªãã¯ãŸãã¯å
éšã¢ã¯ã»ã¹ä¿®é£Ÿåã§å®£èšãããŸãã
- ã·ãªã¢ã«åã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãsealedã¯ã©ã¹ã®protected修食åã§å®£èšãããŸãã
æ倧ã®é¢å¿äºã¯ãæ倧ã®å±éºã«æºã¡ãŠãããããäžèšã®éžæè¢ã®æåã®ãã®ã§ãã 2çªç®ã®æ®µèœã«ã€ããŠç°¡åã«èª¬æããŸããã3çªç®ã®æ®µèœã«ã€ããŠã¯èæ
®ããŸãã-ã³ã³ãã€ã©ãŒã¯ãæ§é å
ã®
protected修食åãæã€ã¡ã³ããŒãæäŸããŸããïŒã³ã³ãã€ã«ãšã©ãŒïŒããã®ãããªã¡ã³ããŒãã·ãŒã«ãã¯ã©ã¹ã§å®£èšãããŠããå Žåãã³ã³ãã€ã©ãŒã¯èŠåãåºããŸãã
å°å°ãããŠããªãã¯ã©ã¹ã®ã·ãªã¢ã«åã³ã³ã¹ãã©ã¯ã¿ãŒã«ã¯ãã©ã€ããŒã修食åããããŸã
ããã¯ãã·ãªã¢ã«åã³ã³ã¹ãã©ã¯ã¿ãŒãžã®ã¢ã¯ã»ã¹ä¿®é£Ÿåã®äžé©åãªäœ¿çšã®ç¶æ³ã®æãå±éºãªã±ãŒã¹ã§ãã ã¿ã€ããå°å°ãããŠããªãå Žåãçžç¶äººãããå¯èœæ§ããããŸãã ãã ããã·ãªã¢ã«åã³ã³ã¹ãã©ã¯ã¿ãŒã«
ãã©ã€ããŒãã¢ã¯ã»ã¹ä¿®é£Ÿåãããå Žåãåã¯ã©ã¹ããåŒã³åºãããšã¯ã§ããŸããã
ãã®å Žåãåã¯ã©ã¹ã®éçºè
ã«ã¯2ã€ã®ãªãã·ã§ã³ããããŸã-ãã®èŠªã¯ã©ã¹ã®äœ¿çšãæåŠããããåºæ¬ã¯ã©ã¹ã®ã¡ã³ããŒãæåã§éã·ãªã¢ã«åããŸãã 2çªç®ã®ã±ãŒã¹ã¯åé¡ã®è§£æ±ºçãšã¯ã»ãšãã©èŠãªãããªãããšã«æ³šæããŠãã ããã
- åºæ¬ã¯ã©ã¹ã§ã¡ã³ããŒã®åçŽãªéã·ãªã¢ã«åãæäŸããããšããäºå®ã§ã¯ãããŸããã
- åã¯ã©ã¹ã®éçºè
ã¯ãåºæ¬ã¯ã©ã¹ã®ã¡ã³ããŒã®å®è£
ãå¿ããããšããããŸãã
- ãã¹ãŠã®èŠæãããã°ãåºæ¬ã¯ã©ã¹ã®ãã©ã€ããŒãã¡ã³ããŒã®éã·ãªã¢ã«åã¯å€±æããŸãã
ãããã£ãŠãå°å°ãããŠããªãçŽååå¯èœã¯ã©ã¹ãéçºãããšãã¯ãçŽååã³ã³ã¹ãã©ã¯ã¿ãŒãæã€ã¢ã¯ã»ã¹ä¿®é£Ÿåã«æ³šæããŠãã ããã
ãããžã§ã¯ããåæãããšãäžèšã®ã«ãŒã«ãå®ãããŠããªããã®ãããã€ãèŠã€ãããŸããã
NHibernate [Serializable] public class ConnectionManager : ISerializable, IDeserializationCallback { .... private ConnectionManager(SerializationInfo info, StreamingContext context) { .... } .... }
PVS-StudioèŠåïŒ V3103掟çåããã·ãªã¢ã©ã€ãºãããšããé
å¯éåã®ãã©ã€ããŒãCtorïŒSerializationInfoãStreamingContextïŒã³ã³ã¹ãã©ã¯ã¿ãŒã«ã¢ã¯ã»ã¹ã§ããŸããã NHibernate ConnectionManager.cs 276
ããºãªã³ [Serializable] private class TestDiagnostic : Diagnostic, ISerializable { .... private TestDiagnostic (SerializationInfo info, StreamingContext context) { .... } .... }
PVS-StudioèŠåïŒ V3103掟çåããã·ãªã¢ã©ã€ãºãããšããé
å¯éåã®ãã©ã€ããŒãTestDiagnosticïŒSerializationInfoãStreamingContextïŒã³ã³ã¹ãã©ã¯ã¿ãŒã«ã¢ã¯ã»ã¹ã§ããŸããã DiagnosticAnalyzerTests.cs 100
äžèšã®äž¡æ¹ã®äŸã§ãã·ãªã¢ã«åã³ã³ã¹ãã©ã¯ã¿ãŒã«ã¯ãã¢ã¯ã»ã¹å¶åŸ¡ä¿®é£Ÿåã
ä¿è·ããå¿
èŠããããŸããããã«ãããéã·ãªã¢ã«åãããšãã«åã¯ã©ã¹ãåŒã³åºãããšãã§ããŸãã
'public'ãŸã㯠'internal'修食åã§ã·ãªã¢ã«åã³ã³ã¹ãã©ã¯ã¿ãŒã宣èšããªãã§ãã ãã
ããã¯ãåªããããã°ã©ãã³ã°ã¹ã¿ã€ã«ã®ãã³ãã§ãã
public修食åãŸãã¯
internal修食åã䜿çšããŠã·ãªã¢ã«åã³ã³ã¹ãã©ã¯ã¿ãŒã宣èšããŠããšã©ãŒã«ã¯ãªããŸããããæå³ã¯ãããŸããããã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯å€éšããåŒã³åºãããã¹ãã§ã¯ãªããã³ã³ã¹ãã©ã¯ã¿ãŒãã©ã®ã¢ã¯ã»ã¹ä¿®é£Ÿåãæã€ãã¯ã·ãªã¢ã©ã€ã¶ãŒã«ã¯é¢ä¿ãããŸããã
ãªãŒãã³ãœãŒã¹ãããžã§ã¯ãããã§ãã¯ãããšãããã®ã«ãŒã«ãå°éãããªãããã€ãã®äŒè°ããããŸããã
Msbuild [Serializable] private sealed class FileState : ISerializable { .... internal SystemState(SerializationInfo info, StreamingContext context) { .... } .... }
PVS-StudioèŠåïŒ V3103ãã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ã«ã¯CtorïŒSerializationInfoãStreamingContextïŒã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããå¿
èŠããããŸãã å
éšã«ããããšã¯æšå¥šãããŸããã ãã©ã€ããŒãã«ããããšãæ€èšããŠãã ããã Microsoft.Build.Tasks SystemState.cs 218
[Serializable] private sealed class FileState : ISerializable { .... internal FileState(SerializationInfo info, StreamingContext context) { .... } .... }
PVS-StudioèŠåïŒ V3103ãã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ã«ã¯CtorïŒSerializationInfoãStreamingContextïŒã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããå¿
èŠããããŸãã å
éšã«ããããšã¯æšå¥šãããŸããã ãã©ã€ããŒãã«ããããšãæ€èšããŠãã ããã Microsoft.Build.Tasks SystemState.cs 139
ã©ã¡ãã®å Žåããäžèšã®ã¯ã©ã¹ã¯äž¡æ¹ãšãã·ãŒã«ãããŠãããããã·ãªã¢ã«åã³ã³ã¹ãã©ã¯ã¿ãŒã«
ãã©ã€ããŒãã¢ã¯ã»ã¹ä¿®é£Ÿåãèšå®ããå¿
èŠããããŸãã
NHibernate [Serializable] public class StatefulPersistenceContext : IPersistenceContext, ISerializable, IDeserializationCallback { .... internal StatefulPersistenceContext(SerializationInfo info, StreamingContext context) { .... } .... }
PVS-StudioèŠåïŒ V3103ãã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ã«ã¯CtorïŒSerializationInfoãStreamingContextïŒã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããå¿
èŠããããŸãã å
éšã«ããããšã¯æšå¥šãããŸããã ä¿è·ããããšãæ€èšããŠãã ããã NHibernate StatefulPersistenceContext.cs 1478
[Serializable] public class Configuration : ISerializable { .... public Configuration(SerializationInfo info, StreamingContext context) { .... } .... }
PVS-StudioèŠåïŒ V3103ãã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ã«ã¯CtorïŒSerializationInfoãStreamingContextïŒã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããå¿
èŠããããŸãã å
¬éããããšã¯ãå§ãããŸããã ä¿è·ããããšãæ€èšããŠãã ããã NHibernate Configuration.cs 84
äž¡æ¹ã®ã¯ã©ã¹ã¯å°å°ãããŠããªããããã·ãªã¢ã«åã³ã³ã¹ãã©ã¯ã¿ãŒã«å¯ŸããŠ
ä¿è·ãããã¢ã¯ã»ã¹ä¿®é£Ÿåãèšå®ããå¿
èŠããããŸãã
å°å°ãããŠããªãã¯ã©ã¹ã§GetObjectDataä»®æ³ã¡ãœãããå®è£
ãã
ã«ãŒã«ã¯åçŽã§ã
-ISerializableã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ãã
éã·ãŒã«ã¯ã©ã¹ãéçºããŠããå Žåã
ä»®æ³ä¿®é£Ÿåã
䜿çšããŠ
GetObjectDataã¡ãœããã宣èšããŸãã ããã«ãããããªã¢ãŒãã£ãºã ã䜿çšãããšãã«ãåã¯ã©ã¹ããªããžã§ã¯ããæ£ããã·ãªã¢ã«åã§ããŸãã
åé¡ã®æ¬è³ªãããããç解ããããã«ãããã€ãã®äŸãæ€èšããããšãææ¡ããŸãã
次ã®èŠªã¯ã©ã¹ãšåã¯ã©ã¹ã®å®£èšããããšããŸãã
[Serializable] class Base : ISerializable { .... public void GetObjectData(SerializationInfo info, StreamingContext context) { .... } } [Serializable] sealed class Derived : Base { .... public new void GetObjectData(SerializationInfo info, StreamingContext context) { .... } }
次ã®åœ¢åŒã®ãªããžã§ã¯ããã·ãªã¢ã«åããã³éã·ãªã¢ã«åããã¡ãœããããããšããŸãã
void Foo(BinaryFormatter bf, MemoryStream ms) { Base obj = new Derived(); bf.Serialize(ms, obj); ms.Seek(0, SeekOrigin.Begin); Derived derObj = (Derived)bf.Deserialize(ms); }
ãã®å Žåã
GetObjectDataã¡ãœããã¯åã§ã¯ãªã芪ã¯ã©ã¹ããåŒã³åºããã
ãã ãã·ãªã¢ã«åã¯
倱æããŸãã ãããã£ãŠãåã¯ã©ã¹ã®ã¡ã³ããŒã¯ã·ãªã¢ã«åãããŸããã éã·ãªã¢ã«åäžã«ãåã¯ã©ã¹ã®
GetObjectDataã¡ãœããã§è¿œå ãããã¡ã³ããŒã®å€ã
SerializationInfoã¿ã€ãã®ãªããžã§ã¯ãããååŸããããšã
SerializationInfoã¿ã€ãã®ãªããžã§ã¯ãã«ã¯èŠæ±ãããããŒãå«ãŸããªããããäŸå€ãçæãããŸãã
芪ã¯ã©ã¹ã®ãšã©ãŒãä¿®æ£ããã«ã¯ã
ä»®æ³ä¿®é£ŸåãGetObjectDataã¡ãœããã«è¿œå ãã掟çã¡ãœããã§
ãªãŒããŒã©ã€ãããå¿
èŠããã
ãŸã ã
ISerializableã€ã³ã¿ãŒãã§ã€ã¹ã®æ瀺çãªå®è£
ã®ã¿ã芪ã¯ã©ã¹ã«ååšããå Žåãããã«
ä»®æ³ä¿®é£Ÿåãè¿œå ããããšã¯ã§ããŸããã ãã ãããã¹ãŠããã®ãŸãŸã«ããŠãããšãåã¯ã©ã¹ã®éçºè
ã®ç掻ãè€éã«ããå±éºããããŸãã
芪ã¯ã©ã¹ãšåã¯ã©ã¹ã®å®è£
äŸãèããŠã¿ãŸãããã
[Serializable] class Base : ISerializable { .... void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { .... } } [Serializable] sealed class Derived : Base, ISerializable { .... public void GetObjectData(SerializationInfo info, StreamingContext context) { .... } }
ãã®å Žåãåã¯ã©ã¹ãã芪ã¯ã©ã¹ã®
GetObjectDataã¡ãœããã«ã¢ã¯ã»ã¹ããããšã¯ã§ããŸããã ãŸãããã©ã€ããŒãã¡ãœãããããŒã¹ã¡ãœããã§ã·ãªã¢ã«åãããŠããå Žåãåã¯ã©ã¹ããã¢ã¯ã»ã¹ããããšãã§ããŸãããã€ãŸããæ£ããã·ãªã¢ã«åããããšã¯ã§ããŸããã ãšã©ãŒãä¿®æ£ããã«ã¯ãæ瀺çãªå®è£
ã«å ããŠã
GetObjectDataä»®æ³ã¡ãœããã®æé»çãªå®è£
ãåºæ¬ã¯ã©ã¹ã«è¿œå ããå¿
èŠããããŸãã ä¿®æ£ãããã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
[Serializable] class Base : ISerializable { .... void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { GetObjectData(info, context); } public virtual void GetObjectData(SerializationInfo info, StreamingContext context) { .... } } [Serializable] sealed class Derived : Base { .... public override void GetObjectData(SerializationInfo info, StreamingContext context) { .... base.GetObjectData(info, context); } }
ãŸãã¯ããã®ã¯ã©ã¹ã®ç¶æ¿ãæ瀺ãããŠããªãå Žåã¯ãã¯ã©ã¹å®£èšã«
sealed修食åãè¿œå ããŠãã¯ã©ã¹ãç¶æ¿ããå¿
èŠããããŸãã
ããºãªã³ [Serializable] private class TestDiagnostic : Diagnostic, ISerializable { private readonly string _kind; .... private readonly string _message; .... void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue("id", _descriptor.Id); info.AddValue("kind", _kind); info.AddValue("message", _message); info.AddValue("location", _location, typeof(Location)); info.AddValue("severity", _severity, typeof(DiagnosticSeverity)); info.AddValue("defaultSeverity", _descriptor.DefaultSeverity, typeof(DiagnosticSeverity)); info.AddValue("arguments", _arguments, typeof(object[])); } .... }
PVS-Studioã® èŠå ïŒ V3104 'GetObjectData'ã®éã·ãŒã«å 'TestDiagnostic'ã®å®è£
ã¯ä»®æ³ã§ã¯ãªãããã掟çåã®èª€ã£ãã·ãªã¢ã«åãå¯èœã§ãã CSharpCompilerSemanticTest DiagnosticAnalyzerTests.cs 112
TestDiagnosticã¯ã©ã¹ã¯å°å°ãããŠã
ãŸãã ïŒãã©ã€ããŒãã§ãããããåãã¯ã©ã¹å
ã§ç¶æ¿ã§ããŸãïŒããç¹ã«ãã©ã€ããŒãã¡ã³ããŒãã·ãªã¢ã«åããã
ISerializableã€ã³ã¿ãŒãã§ã€ã¹ã®æ瀺çãªå®è£
ã®ã¿ããããŸãã ã€ãŸããåã¯ã©ã¹ã®éçºè
ã¯å¿
èŠãªã¡ã³ããŒãã·ãªã¢ã«åã§ããŸãã
ãGetObjectDataã¡ãœããã¯äœ¿çšã§ãããã¢ã¯ã»ã¹ä¿®é£Ÿåã¯ã¡ã³ããŒã«çŽæ¥ã¢ã¯ã»ã¹ããŸããã
äžèšã®ãã¹ãŠã®ã·ãªã¢ã«åã³ãŒãããæ瀺çãªã€ã³ã¿ãŒãã§ã€ã¹å®è£
ããåç
§ããã
GetObjectDataä»®æ³ã¡ãœããã«åã蟌ãæ¹ãé©å
ã§ã ã
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { GetObjectData(info, context); } public virtual void GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue("id", _descriptor.Id); info.AddValue("kind", _kind); info.AddValue("message", _message); info.AddValue("location", _location, typeof(Location)); info.AddValue("severity", _severity, typeof(DiagnosticSeverity)); info.AddValue("defaultSeverity", _descriptor.DefaultSeverity, typeof(DiagnosticSeverity)); info.AddValue("arguments", _arguments, typeof(object[])); }
ãã¹ãŠã®ã·ãªã¢ã«åå¯èœãªã¡ã³ããŒã¯ãã·ãªã¢ã«åå¯èœãªåã§ããå¿
èŠããããŸãã
ãã®æ¡ä»¶ã¯ãèªåã·ãªã¢ã«åãçºçããïŒã¿ã€ãã
[Serializable]å±æ§ã§è£
食ããã
ISerializableã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããªãå ŽåïŒããã·ãªã¢ã«åãæåã§å®è¡ãããïŒ
ISerializableã«ãã£ãŠå®è£
ã
ãã ïŒãã©ããã«é¢ä¿ãªãããªããžã§ã¯ãã®æ£ããã·ãªã¢ã«åã«å¿
èŠã§ãã
ãã以å€ã®å Žåãã·ãªã¢ã«åäžã«
[Serializable]å±æ§ã§è£
食ãããŠããªãã¡ã³ããŒãæ€åºããããšã
SerializationExceptionåã®äŸå€ãã¹ããŒãããŸãã
å®çŸäžå¯èœãªåã®ã¡ã³ããŒãèæ
®ããã«ãªããžã§ã¯ããã·ãªã¢ã«åããå Žåãããã€ãã®ã¢ãããŒããå¯èœã§ãã
- ã·ãªã¢ã©ã€ãºäžå¯èœãªåãã·ãªã¢ã©ã€ãºå¯èœã«ããŸãã
- èªåã·ãªã¢ã«åãçºçããå Žåã [NonSerialized]å±æ§ã§ã·ãªã¢ã«åããå¿
èŠã®ãªããã£ãŒã«ããè£
食ããŸãã
- æåã®ã·ãªã¢ã«åãçºçããå Žåãå¿
èŠã®ãªãã¡ã³ããŒã¯ç¡èŠããŠãã ããã
[NonSerialized]å±æ§ã¯ãã£ãŒã«ãã«ã®ã¿é©çšãããããšã«æ³šæããŠãã ããã ãããã£ãŠãããããã£ã®ã·ãªã¢ã«åãçŠæ¢ããããšã¯ã§ããŸããããããããã£ãã·ãªã¢ã«åã§ããªãã¿ã€ãã®å ŽåãäŸå€ãçºçããŸãã ããšãã°ã
SerializedClassã¯ã©ã¹ãã·ãªã¢ã«
åããããšãããšããã®å®çŸ©ã¯ä»¥äžã®ãšããã§ãã
sealed class NonSerializedType { } [Serializable] sealed class SerializedClass { private Int32 value; public NonSerializedType NSProp { get; set; } }
[NonSerialized]å±æ§ã§è£
食ããããã£ãŒã«ããä»ããŠããããã£ãå®è£
ããããšã«ãã
ããã®ç¶æ³ã
åé¿ã§ããŸãã
[Serializable] sealed class SerializedClass { private Int32 value; [NonSerialized] private NonSerializedType nsField; public NonSerializedType NSProp { get { return nsField; } set { nsField = value; } } }
ã·ãªã¢ã«åå¯èœãªã¿ã€ãã«
[NonSerialized]å±æ§ã§è£
食ãããŠããªãå®çŸäžå¯èœãªã¿ã€ãã®ã¡ã³ããŒãããå Žåã®åæ§ã®ãšã©ãŒã¯ãPVS-Studioéçã³ãŒãã¢ãã©ã€ã¶ãŒã®èšºæã«ãŒã«
V3097ã«ãã£ãŠæ€åºãããŸãã
ãã®èŠåã¯å¿
ããããšã©ãŒã瀺ããŠããããã§ã¯ãªãããšãæãåºããŠãã ãã-ããã¯ãã¹ãŠäœ¿çšããã·ãªã¢ã©ã€ã¶ãŒã«äŸåããŸãã
説æãããæ¡ä»¶ã«éåããããã€ãã®ã³ãŒãäŸãèŠãŠã¿ãŸãããã
ãµãããã¹ã public class BlogUrlHelper { .... } [Serializable] public class AkismetSpamService : ICommentSpamService { .... readonly BlogUrlHelper _urlHelper; .... }
PVS-StudioèŠåïŒ V3097å¯èœæ§ã®ããäŸå€ïŒ[Serializable]ã§ããŒã¯ããã 'AkismetSpamService'ã¿ã€ãã«ã¯ã[NonSerialized]ã§ããŒã¯ãããŠããªãã·ãªã¢ã«åã§ããªãã¡ã³ããŒãå«ãŸããŠããŸãã Subtext.Framework AkismetSpamService.cs 31
_urlHelperãã£ãŒã«ãã®
BlogUrlHelperã¿ã€ãã¯ã·ãªã¢ã«åã§ããªããããããã€ãã®
ã·ãªã¢ã©ã€ã¶ãŒã§AkismetSpamServiceã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãã·ãªã¢ã«åããããšãããšã
SerializationExceptionã¿ã€ãã®äŸå€ãã¹ããŒãããŸãã ç¶æ³ã«åºã¥ããŠåé¡ã解決ããå¿
èŠããããŸãã
BinaryFormatterãŸãã¯
SoapFormatterã¿ã€ãã®
ã·ãªã¢ã©ã€ã¶ãŒã
䜿çšããå Žåããã£ãŒã«ãã
[NonSerialized]å±æ§ã§è£
食ãããã
BlogUrlHeplerã¿ã€ãã
[Serializable] å±æ§ã§è£
食ããå¿
èŠããã
ãŸã ã
ã·ãªã¢ã©ã€ãºå¯èœãªãã£ãŒã«ãã§
[Serializable]å±æ§ãå¿
èŠãšããªãä»ã®ã·ãªã¢ã©ã€ã¶ãŒã䜿çšããå Žåãé ãçããªãããã«ããããšãã§ããŸãã
NHibernate public class Organisation { .... } [Serializable] public class ResponsibleLegalPerson { .... private Organisation organisation; .... }
PVS-StudioèŠåïŒ V3097èããããäŸå€ïŒ[Serializable]ã§ããŒã¯ããã 'ResponsibleLegalPerson'ã¿ã€ãã«ã¯ã[NonSerialized]ã§ããŒã¯ãããŠããªãéã·ãªã¢ã«åå¯èœãªã¡ã³ããŒãå«ãŸããŠããŸãã NHibernate.Test ResponsibleLegalPerson.cs 9
ç¶æ³ã¯äžèšã®ç¶æ³ãšäŒŒãŠããŸã-ãã³ãŸãã¯æ¶ããŸãã ããã¯ãã¹ãŠäœ¿çšããã·ãªã¢ã©ã€ã¶ãŒã«äŸåããŸãã
ISerializableã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ãããšãã¯ã[Serializable]å±æ§ãèŠããŠãããŠãã ãã
ãã®ã¢ããã€ã¹ã¯ãã·ãªã¢ã«åã®äœæ¥ãå§ããã°ããã®äººã«ãšã£ãŠããå¯èœæ§ãé«ãã§ãã
ISerializableã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£
ãä»ããŠã·ãªã¢ã«åãæåã§ç®¡çãããšã
Serializableåã®äŸå€ã®çæã«ã€ãªããå¯èœæ§ã®ãã
[Serializable]å±æ§ã§åã修食ããããšãå¿ããã¡ã§ãã
BinaryFormatterãªã©ã®
ã·ãªã¢ã©ã€ã¶ãŒã«ã¯ããã®å±æ§ãå¿
èŠã§ãã
ã·ã£ãŒãéçºãã®ãšã©ãŒã®èå³æ·±ãäŸã¯ãSharpDevelopãããžã§ã¯ãã§èŠã€ãããŸããã
public class SearchPatternException : Exception, ISerializable { .... protected SearchPatternException(SerializationInfo info, StreamingContext context) : base(info, context) { } }
PVS-StudioèŠåïŒ V3096 'SearchPatternException'ã¿ã€ããã·ãªã¢ã«åãããšãã«äŸå€ãçºçããå¯èœæ§ããããŸãã [Serializable]å±æ§ããããŸããã ICSharpCode.AvalonEdit ISearchStrategy.cs 80
public class DecompilerException : Exception, ISerializable { .... protected DecompilerException(SerializationInfo info, StreamingContext context) : base(info, context) { } }
PVS-StudioèŠåïŒ V3096 'DecompilerException'ã¿ã€ããã·ãªã¢ã«åãããšãã«äŸå€ãçºçããå¯èœæ§ããããŸãã [Serializable]å±æ§ããããŸããã ICSharpCode.Decompiler DecompilerException.cs 28
ã¢ããªã±ãŒã·ã§ã³ãã¡ã€ã³éã§äŸå€ãªããžã§ã¯ããæž¡ãã«ã¯ãã·ãªã¢ã«åãšéã·ãªã¢ã«åãè¡ããŸãã ãããã£ãŠããã€ãã£ãäŸå€ã¿ã€ãã¯ã·ãªã¢ã«åå¯èœã§ãªããã°ãªããŸããã äžèšã®äŸã§ã¯ã
SearchPatternExceptionåãš
DecompilerExceptionåã¯
Exceptionããç¶æ¿ãããã·ãªã¢ã«åã³ã³ã¹ãã©ã¯ã¿ãŒãå®è£
ããŠããŸããã
[Serializable]å±æ§ã§è£
食ãããŠããŸããã ãããã£ãŠãããšãã°ãå¥ã®ã¢ããªã±ãŒã·ã§ã³ãã¡ã€ã³ã§äŸå€ãã¹ããŒããå ŽåãçŸåšã®ãã¡ã€ã³ã§ã¯ãçæãããäŸå€ã§ã¯ãªã
SerializationExceptionããã£ããããŸãã
GetObjectDataã¡ãœãããå¿
èŠãªãã¹ãŠã®åã®ã¡ã³ããŒãã·ãªã¢ã«åããããšã確èªããŠãã ãã
ISerializableã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ãã
GetObjectDataã¡ãœãããå®çŸ©ããããšã«ããã
ã·ãªã¢ã«åãããåã¡ã³ããŒãšãããã«æžã蟌ãŸããå€ã«ã€ããŠè²¬ä»»ãè² ããŸãã ãã®å Žåãéçºè
ã¯ã·ãªã¢ã«åãå¶åŸ¡ããäœå°ãå€ããããŸããã¡ã³ããŒã«é¢é£ä»ããããã·ãªã¢ã«åå¯èœãªå€ãšããŠïŒããã³ä»»æã®æååã«å¯ŸããŠããæ£çŽã«èšããšïŒãã·ãªã¢ã«åããããªããžã§ã¯ãã®å®éã®å€ãã¡ãœããã®çµæãå®æ°ãŸãã¯ãªãã©ã«å€ãæžã蟌ãããšãã§ããŸã-ããªãã欲ãããã®ã
ãã ãããã®å Žåãåºæ¬ã¯ã©ã¹ã«å±ããŠããå Žåã§ããã·ãªã¢ã«åããã¡ã³ããŒãå¿ããªãããã«ããå¿
èŠããããããéçºè
ã«ã¯å€§ããªè²¬ä»»ããããŸãã ç§ãã¡ã¯ç人éãªã®ã§ãæã
ãäžéšã®ã¡ã³ããŒã¯ãŸã å¿ããããŠããŸãã
ãã®ãããªç¶æ³ã蚺æããããã«ãPVS-Studioéçã³ãŒãã¢ãã©ã€ã¶ãŒã¯èšºæã«ãŒã«
V3099ãæäŸããŸãã ãã®èŠåã«ãã£ãŠæ€åºãããã³ãŒãäŸã«ç²Ÿéããããšããå§ãããŸãã
ã·ã£ãŒãéçº [Serializable] public abstract class XshdElement { public int LineNumber { get; set; } public int ColumnNumber { get; set; } public abstract object AcceptVisitor(IXshdVisitor visitor); } [Serializable] public class XshdColor : XshdElement, ISerializable { .... public virtual void GetObjectData(SerializationInfo info, StreamingContext context) { if (info == null) throw new ArgumentNullException("info"); info.AddValue("Name", this.Name); info.AddValue("Foreground", this.Foreground); info.AddValue("Background", this.Background); info.AddValue("HasUnderline", this.Underline.HasValue); if (this.Underline.HasValue) info.AddValue("Underline", this.Underline.Value); info.AddValue("HasWeight", this.FontWeight.HasValue); if (this.FontWeight.HasValue) info.AddValue("Weight", this.FontWeight .Value .ToOpenTypeWeight()); info.AddValue("HasStyle", this.FontStyle.HasValue); if (this.FontStyle.HasValue) info.AddValue("Style", this.FontStyle.Value.ToString()); info.AddValue("ExampleText", this.ExampleText); } }
PVS-StudioèŠåïŒ V3099 ãXshdColorãã¿ã€ãã®ãã¹ãŠã®ã¡ã³ããŒããGetObjectDataãã¡ãœããå
ã§ã·ãªã¢ã«åãããããã§ã¯ãããŸããïŒLineNumberãColumnNumberã ICSharpCode.AvalonEdit XshdColor.cs 101
ã·ãªã¢ã«åã³ã³ã¹ãã©ã¯ã¿ãŒã®ç¡å¹ãªã¢ã¯ã»ã¹ä¿®é£Ÿåã
[Serializable]å±æ§ã®æ¬ åŠã
GetObjectDataã¡ãœããã®
ä»®æ³ä¿®é£Ÿåãªã©ããã®ã³ãŒãã§åè¿°ããåé¡ã¯ãããŸããã
æ²ããããªãããã«ã¯ãŸã ééãããããŸãã
GetObjectDataã¡ãœãã
ã¯åºæ¬ã¯ã©ã¹ã®ããããã£ãèæ
®
ããŸãããã€ãŸããã·ãªã¢ã«åäžã«ããŒã¿ã®äžéšã倱ãããŸãã ãã®çµæãéã·ãªã¢ã«åäžã«ãç°ãªãç¶æ
ã®ãªããžã§ã¯ãã埩å
ãããŸãã
ãã®å Žåãåé¡ã®è§£æ±ºçã¯ãããšãã°æ¬¡ã®ããã«ãå¿
èŠãªå€ãæåã§è¿œå ããããšã§ãã
info.AddValue(nameof(LineNumber), LineNumber); info.AddValue(nameof(ColumnNumber), ColumnNumber);
åºæ¬ã¯ã©ã¹ã
ISerializableã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããå Žåã掟çã¡ãœããã§åºæ¬
GetObjectDataãåŒã³åºãããšã«ããããœãªã¥ãŒã·ã§ã³ã¯ãããšã¬ã¬ã³ãã«ãªããŸãã
NHibernate [Serializable] public sealed class SessionImpl : AbstractSessionImpl, IEventSource, ISerializable, IDeserializationCallback { .... void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { log.Debug("writting session to serializer"); if (!connectionManager.IsReadyForSerialization) { throw new InvalidOperationException("Cannot serialize a Session while connected"); } info.AddValue("factory", Factory, typeof(SessionFactoryImpl)); info.AddValue("persistenceContext", persistenceContext, typeof(StatefulPersistenceContext)); info.AddValue("actionQueue", actionQueue, typeof(ActionQueue)); info.AddValue("timestamp", timestamp); info.AddValue("flushMode", flushMode); info.AddValue("cacheMode", cacheMode); info.AddValue("interceptor", interceptor, typeof(IInterceptor)); info.AddValue("enabledFilters", enabledFilters, typeof(IDictionary<string, IFilter>)); info.AddValue("enabledFilterNames", enabledFilterNames, typeof(List<string>)); info.AddValue("connectionManager", connectionManager, typeof(ConnectionManager)); } .... private string fetchProfile; .... }
PVS-StudioèŠåïŒ V3099 ãSessionImplãã¿ã€ãã®ãã¹ãŠã®ã¡ã³ããŒããGetObjectDataãã¡ãœããå
ã§ã·ãªã¢ã«åãããããã§ã¯ãããŸããïŒfetchProfileã NHibernate SessionImpl.cs 141
ä»åã¯ãçŸåšã®ã¯ã©ã¹ã®ãã£ãŒã«ããã·ãªã¢ã«åããã®ãå¿ããŠããŸããïŒ
fetchProfile ïŒã å®çŸ©ãããããããã«ã
[NonSerialized]å±æ§ã§è£
食ãããŠããŸããïŒ
GetObjectDataã¡ãœããã§ã·ãªã¢ã«åã§ããªãä»ã®ãã£ãŒã«ããšã¯ç°ãªããŸãïŒã
ãã®ãããžã§ã¯ãã«ã¯ãããã«2ã€ã®é¡äŒŒããå ŽæããããŸããã
- V3099ãConfigurationãã¿ã€ãã®ãã¹ãŠã®ã¡ã³ããŒããGetObjectDataãã¡ãœããå
ã§ã·ãªã¢ã«åãããããã§ã¯ãããŸããïŒcurrentDocumentNameãpreMappingBuildProcessedã NHibernate Configuration.cs 127
- V3099ãConnectionManagerãã¿ã€ãã®ãã¹ãŠã®ã¡ã³ããŒããGetObjectDataãã¡ãœããå
ã§ã·ãªã¢ã«åãããããã§ã¯ãããŸããïŒflushingFromDtcTransactionãNHibernate ConnectionManager.cs 290
èå³æ·±ãæ©èœã¯ããã®ãããªãšã©ãŒã«é¢é£ä»ããããŠããŸã-ãããã¯äŸå€ã®çæã«ã€ãªãããã埮åŠãªè«çãšã©ãŒã«ã€ãªãããŸããã·ãªã¢ã«åã³ã³ã¹ãã©ã¯ã¿ãŒã§ãè¿œå ãããŠããªãïŒäžè¶³ããŠããããŒã«ãã£ãŠã¢ã¯ã»ã¹ãããïŒãã£ãŒã«ãã®å€ãååŸããããšãããšãäŸå€ãã¹ããŒãããŸããã¡ã³ããŒãå®å
šã«å¿ããããå ŽåïŒGetObjectDataã¡ãœãããšã·ãªã¢ã«åã³ã³ã¹ãã©ã¯ã¿ãŒã®äž¡æ¹ã§ïŒããªããžã§ã¯ãã®ç¶æ
ãç ŽæããŸããäžè¬å
äžèšã®ãã¹ãŠã®æ
å ±ãç°¡åã«èŠçŽãããšãããã€ãã®ãã³ããšã«ãŒã«ãçå®ã§ããŸãã- [Serializable] , ISerializable ;
- , [Serializable] ;
- ISerializable , ( Ctor(SerializationInfo, StreamingContext) );
- private , â protected ;
- , ISerializable , GetObjectData ;
- GetObjectDataã¡ãœããããå¿
èŠã«å¿ããŠãããŒã¹ã¿ã€ãã®ã¡ã³ããŒãå«ããã¹ãŠã®ã¡ã³ããŒãã·ãªã¢ã«åããããšã確èªããŸãã
ãããã«
ãã®èšäºããäœãæ°ããããšãåŠã³ãã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ã®åé¡ã®çŽ æŽãããå°é家ã«ãªã£ãããšãé¡ã£ãŠããŸããäžèšã®ãã³ããšã«ãŒã«ãé å®ããããšã§ããããã°ã«è²»ããæéãççž®ããèªåèªèº«ãä»ã®éçºè
ãã¯ã©ã¹ã§äœæ¥ãããããªããŸãããŸããPVS-Studioã¢ãã©ã€ã¶ãŒã䜿çšãããšãããã«ç°¡åã«ãªãããšã©ãŒãçºçããçŽåŸã«ç¹å®ã§ããŸããè¿œå æ
å ±
- V3094 åãéã·ãªã¢ã«åãããšãã«çºçããå¯èœæ§ã®ããäŸå€ãCtorïŒSerializationInfoãStreamingContextïŒã³ã³ã¹ãã©ã¯ã¿ãŒããããŸãã
- V3096ãåãã·ãªã¢ã«åãããšãã«çºçããå¯èœæ§ã®ããäŸå€ã[Serializable]å±æ§ããããŸãã
- V3097 èããããäŸå€ïŒ[Serializable]ã§ããŒã¯ãããåã«ã¯ã[NonSerialized]ã§ããŒã¯ãããŠããªãã·ãªã¢ã«åã§ããªãã¡ã³ããŒãå«ãŸããŠããŸã
- V3099 typeã®ãã¹ãŠã®ã¡ã³ããŒã 'GetObjectData'ã¡ãœããå
ã§ã·ãªã¢ã«åãããããã§ã¯ãããŸãã
- V3103 é掟çåã®ãã©ã€ããŒãCtorïŒSerializationInfoãStreamingContextïŒã³ã³ã¹ãã©ã¯ã¿ãŒã¯ã掟çåãéã·ãªã¢ã«åãããšãã«ã¢ã¯ã»ã¹ã§ããŸãã
- V3104ãå°å°ãããŠããªãåã®ãGetObjectDataãå®è£
ã¯ä»®æ³ã§ã¯ãªãã掟çåã®äžæ£ãªã·ãªã¢ã«åãå¯èœã§ã
- MSDN .NET Frameworkã§ã®ã·ãªã¢ã«å
- MSDN ã«ã¹ã¿ã ã·ãªã¢ã«å

ãã®èšäºãè±èªåã®èŽè¡ãšå
±æãããå Žåã¯ã翻蚳ãžã®ãªã³ã¯ã䜿çšããŠãã ããïŒã»ã«ã²ã€ãŽã¡ã·ãªãšãã
ã·ãªã¢ã«åã§äœæ¥ãããšãã«èªåã®è¶³ã§æããªãæ¹æ³ã