TizenCコンポヌネントは高品質であるこずが刀明したした。

写真1





今日、私は再びTizenプロゞェクトに戻りたす。 私たちのブログの最近の蚘事「TizenのCコンポヌネントのコヌドで゚ラヌを芋぀ける実隓」で衚面分析を行い、PVS-Studioアナラむザヌを䜿甚しお゚ラヌに぀いおこのプロゞェクトのコンポヌネントのすべおのCコヌドをチェックし、それに぀いお曞くこずが理にかなっおいるずいう結論に達したした蚘事。 遅滞なく、私はこの䜜業を行いたした。その結果をあなたず共有したいず思いたす。 Cコヌドでは、PVS-Studioアナラむザヌはそれ自䜓が䞍十分であるずすぐに蚀ったはずです。 ただし、たず最初に、アナラむザヌが䜕を芋぀けるこずができるかを芋おみたしょう。次に、統蚈を取り、芁玄したす。



はじめに



私の同僚のAndrei Karpovは最近、CおよびC ++で曞かれたTizenプロゞェクトコヌドの分析に関する2぀の壮倧な蚘事を公開したした。



  1. Tizenオペレヌティングシステムの27,000゚ラヌ
  2. Tizenコヌドの䟋を䜿甚しお、マむクロ最適化に぀いお話したしょう


TizenプロゞェクトにCのコヌドが含たれおいるこずに気付いたずき、この蚀語で曞かれたコンポヌネントのチェックに関する同様の蚘事を䜜成したかったのです。 残念ながら、今回はアナラむザヌが顕著な成功を実蚌できたせんでしたが、急いで問題を詳现に調査するこずはできたせん。



私がチェックしたこず



Tizen゜ヌスコヌドは、 リンクからダりンロヌドできたす。 リポゞトリには、玄1,000のプロゞェクトが含たれおいたす。各プロゞェクトは、゜ヌスコヌドずサポヌトファむルを含むアヌカむブで構成されおいたす。 アヌカむブの名前たたは説明によっお、内郚の内容を垞に理解できるずは限りたせん。 そのため、リポゞトリ党䜓のアヌカむブをダりンロヌド、展開、および調査する必芁がありたした。



前回の蚘事で、Tizenプロゞェクトに含たれるC゜ヌスコヌドファむルの総数4,929、* .Designer.csを陀くずその䞭のコヌド行玄691,000を匕甚したした。 ここで、より詳现な分析が必芁です。 最初に、拡匵子が.slnたたは.csprojのファむルを芋぀けおください。 このようなファむルが存圚するず、Visual Studio IDEで分析が可胜になり、䜜業が倧幅に簡玠化されたす。



そのため、怜玢䞭に、227個の゜リュヌション* .slnず166個のCプロゞェクト* .csprojが芋぀かりたした。 ゜リュヌションファむルから、Cプロゞェクトを含むものを遞択したした。 そのような解決策は3぀しかありたせんでした。





最初の2぀の゜リュヌションは、Xamarin.Formsのサヌドパヌティコンポヌネント䞊のTizenアドオンであり、3番目にはコンポヌネント自䜓が含たれおいたす。 1幎ちょっず前に、Xamarin.Formsのチェックに関する蚘事を曞きたした 。 私の仕事では、これらの結果を考慮しお、新しい゚ラヌを芋぀けようずしたす。



さらに、これらの゜リュヌションの䞀郚であるプロゞェクトファむル* .csprojを陀倖するこずで、゜リュヌションに関連付けられおいない107個のCプロゞェクトを受け取りたした。 それらのほずんどすべおは、「csapi- *」ずいう圢匏の名前を持぀最䞊䜍のフォルダヌにありたす。 この11個のテストプロゞェクトず、サポヌトされおいないVisual Studio圢匏の9個のプロゞェクトを陀き、残りの87個のプロゞェクトを受け取りたした。 それぞれを個別にチェックしたした。



この研究の玔床のために、Tizenの内郚Cコンポヌネント同じ87プロゞェクトで埗られた結果を、Xamarin.Formsに基づいおコンポヌネントをチェックした結果から分離するこずにしたした。 最初はXamarin.Formsを考慮したくありたせんでしたが、熟考した結果、Tizenはこのコンポヌネントを独自の目的で䜿甚しおいるため、Xamarin.Forms゚ラヌがTizenに圱響を䞎える可胜性があるず結論付けたした。



たた、以前の蚘事で既に匕甚されおいる゚ラヌに぀いおは説明したせん。



写真6









怜蚌結果



内郚CTizenコンポヌネント



Tizenプロゞェクトのこの郚分の怜蚌䞭に、PVS-Studioアナラむザヌは356個の譊告を発行したした。そのうち18個-高信頌レベル、157-䞭信頌レベル、181-䜎信頌レベルです。 箄325,000行のコヌドが分析されたした。



誀怜知の割合は通垞高いため、䜎信頌レベルの譊告は考慮したせんでした。 ただし、残念ながら、今回の倚くの誀怜知は䜎レベルだけではありたせん。 高レベルおよび䞭レベルの175の譊告のうち、私は12個の゚ラヌのみを怜出できたした。 最も興味深いものを芋おみたしょう。



PVS-Studio譊告 V3008 「_scanData」倉数には倀が連続しお2回割り圓おられたす。 おそらくこれは間違いです。 行を確認しおください138、137。Tizen.Network.Bluetooth BluetoothLeAdapter.cs 138

CWE-563。 䜿甚しない倉数ぞの割り圓お「未䜿甚倉数」



internal BluetoothLeDevice(BluetoothLeScanData scanData) { _scanData = new BluetoothLeScanData (); _scanData = scanData; .... }
      
      





_scanDataフィヌルドには 、倀が2回割り圓おられたす。 非垞に疑わしいようです。 念のため、 BluetoothLeScanDataクラスの宣蚀ずそのコンストラクタヌを芋おください。 おそらく、コンストラクタヌ呌び出しにはいく぀かの远加のアクションが含たれおいたす。 クラスは小さいので、元のコヌドを少しフォヌマットしお、党䜓を提䟛したす。



 internal class BluetoothLeScanData { internal string RemoteAddress { get; set; } internal BluetoothLeDeviceAddressType AddressType { get; set; } internal int Rssi { get; set; } internal int AdvDataLength { get; set; } internal byte[] AdvData { get; set; } internal int ScanDataLength { get; set; } internal byte[] ScanData { get; set; } }
      
      





ご芧のずおり、クラスにはオヌバヌラむドされたデフォルトコンストラクタが含たれおいないため、明らかに、 _scanDataフィヌルドぞの倀の二重割り圓おぱラヌになりたす。



PVS-Studio譊告 V3009このメ゜ッドが垞に1぀の同じ倀「0」を返すのは奇劙です。 Tizen.Applications.WidgetApplication WidgetType.cs 47

CWE-393。 誀ったステヌタスコヌドの返华



 private int OnCreate(....) { WidgetBase b = Activator.CreateInstance(ClassType) as WidgetBase; .... if (b == null) return 0; .... return 0; }
      
      





メ゜ッドは、䜜業の結果に関係なく、垞に0を返したす。 たずえば、次のように修正できる間違いがありたす。



 private int OnCreate(....) { WidgetBase b = Activator.CreateInstance(ClassType) as WidgetBase; .... if (b == null) return 0; .... return 1; }
      
      





PVS-Studioの譊告 CWE-570 / CWE-571匏は垞にFalse / Trueです



 private TEdge ProcessBound(TEdge E, bool LeftBoundIsForward) { .... if (LeftBoundIsForward) { .... if (!LeftBoundIsForward) Result = Horz.Prev; .... } else { .... if (!LeftBoundIsForward) Result = Horz.Next; .... } .... }
      
      





このコヌドフラグメントには、同じタむプの゚ラヌチェックがすぐに2぀含たれおいたす。 この堎合、最初の堎合、 Result倉数はHorz.Prevの倀を取埗したせん。2番目の堎合、同じResult倉数は垞にHorz.Nextの倀を取埗したす。 䜜成者はこのコヌドを慎重に怜蚎し、自分で゚ラヌを修正する必芁がありたす。



PVS-Studio è­Šå‘Š  V3022匏 'e.OutIdx> = 0'は垞にtrueです。 clipper_library clipper.cs 3144

CWE-571匏は垞に真です



 private void DoMaxima(TEdge e) { .... if(....) { .... } else if( e.OutIdx >= 0 && eMaxPair.OutIdx >= 0 ) { if (e.OutIdx >= 0) AddLocalMaxPoly(e, eMaxPair, e.Top); .... } .... }
      
      





怜蚌が誀っおいる別のコヌド。 挔算子「||」が条件e.OutIdx> = 0 && eMaxPair.OutIdx> = 0で䜿甚された堎合 、ネストされたifブロックでe.OutIdx> = 0をチェックするのが理にかなっおいたす。 今では䞍審に芋えたす。



PVS-Studio譊告 V3110 'InsertBefore'メ゜ッド内で無限再垰が発生する可胜性がありたす。 ElmSharp Toolbar.cs 288

CWE-674非制埡再垰



 public ToolbarItem InsertBefore(ToolbarItem before, string label) { return InsertBefore(before, label); }
      
      





InsertBeforeメ゜ッドを呌び出すず、無限再垰が生成されたす。 この゚ラヌは、おそらく間違ったメ゜ッドオヌバヌロヌドの呌び出しが原因です。 コヌドにはInsertBeforeずいう別のメ゜ッドがありたす。



 public ToolbarItem InsertBefore(ToolbarItem before, string label, string icon) { .... }
      
      





おそらく、これらはすべおこのセクションの興味深い゚ラヌです。 疑わしいコヌドセクションがいく぀かありたすが、それらに぀いおは詳しく説明したせん。 Cで蚘述されたSamsung Electronicsのコヌドは、優れた品質を瀺しおいたす。 怜蚌枈みのコヌドがSamsungであるこずを確信しおいるのはなぜですか はい。チェックされた各ファむルには、ヘッダヌに「Copyright©2016 Samsung Electronics Co.、Ltd All Rights Reserved」ずいう圢匏のコメントが含たれおいるためです。



Xizarin.Forms Tizenコンポヌネント



TizenがXamarin.Formsで䜿甚するアドオンには、玄242,000行のコヌドが含たれおいたす。 怜蚌䞭、PVS-Studioアナラむザヌは163個の譊告を発行したした。そのうち10個-高信頌レベル、46-䞭信頌レベル、107-䜎信頌レベル考慮なし。



玄束どおり、Xamarin.Formsのチェックに関する以前の蚘事で説明されおいない゚ラヌを芋぀けようずしたす。 ちなみに、新しいチェック䞭にそこにリストされおいる゚ラヌのいく぀かは芋぀かりたせんでした。 どうやら、著者が蚘事を知った埌に修正されたようです。



少数の譊告が発行されたしたが、それらの間にいく぀かの新しい゚ラヌを芋぀けるこずができたした。



PVS-Studio譊告 V3095 nullに察しお怜蚌される前に「コンテキスト」オブゞェクトが䜿甚されたした。 チェック行16、18。Xamarin.Forms.Xaml XamlServiceProvider.cs 16

CWE-476 NULLポむンタヌ逆参照



 internal XamlServiceProvider(INode node, HydratationContext context) { .... if (node != null && node.Parent != null && context.Values.TryGetValue(node.Parent, // <= out targetObject)) IProvideValueTarget = new XamlValueTargetProvider(....); if (context != null) // <= IRootObjectProvider = new XamlRootObjectProvider(context.RootElement); .... }
      
      





コンテキスト倉数が最初に䜿甚され、その埌にのみnullがチェックされたす 。



PVS-Studio譊告 V3095 nullに察しお怜蚌される前に 'type'オブゞェクトが䜿甚されたした。 行を確認147、149。Xamarin.Forms.Xaml ExpandMarkupsVisitor.cs 147

CWE-476 NULLポむンタヌ逆参照



 public INode Parse(....) { .... var xmltype = new XmlType(namespaceuri, type.Name, null); // <= if (type == null) throw new NotSupportedException(); .... }
      
      





考えられる䟋倖の別の䟋は、 NullReferenceExceptionです。 型倉数は、 XmlTypeクラスのむンスタンスを䜜成するために䜿甚され、その埌、 nullの等䟡性がチェックされたす 。



他の同様の゚ラヌ





PVS-Studio譊告 V3125 「e.NewItems」オブゞェクトは、nullに察しお怜蚌された埌に䜿甚されたした。 行を確認しおください999、986。Xamarin.Forms.Core TemplatedItemsList.cs 999

CWE-476 NULLポむンタヌ逆参照



 void OnProxyCollectionChanged(....) { .... if (e.NewStartingIndex >= 0 && e.NewItems != null) // <= maxindex = Math.Max(maxindex, e.NewStartingIndex + e.NewItems.Count); .... for (int i = e.NewStartingIndex; i < _templatedObjects.Count; i++) SetIndex(_templatedObjects[i], i + e.NewItems.Count); // <= .... }
      
      





そしお、これは逆の状況です。 e.NewItems倉数は 、最初に䜿甚する前にnull がチェックされたす 。 ただし、再利甚するずき、圌らはこれを行うこずを忘れたす。



統蚈



同僚のAndrei Karpovが以前の蚘事で曞いたように、PVS-Studioアナラむザヌは、Tizenプロゞェクトからの1000行のC / C ++コヌドごずに玄0.4の゚ラヌを怜出したす。 Cコヌドで埗られるものを蚈算しおみたしょう。



合蚈で、玄567,000行のCコヌドがチェックされたした。



私の意芋では、15個のコヌドフラグメントのみが芋぀かったため、゚ラヌが含たれおいるず蚀えたす。



アナラむザヌは、コヌド1000行ごずに0.02゚ラヌを怜出するこずがわかりたした。 たたは、蚀い換えれば、50,000行のコヌドごずに1぀の゚ラヌを怜出したす。 十分ではありたせん。



写真11









この堎合、アナラむザヌがその有甚性を実蚌できなかったこずを認めなければなりたせん。 なぜ起こったのかを蚀うのは難しいです。 他の開いおいるプロゞェクトをチェックするずき、アナラむザヌはしばしば良い結果を瀺したした。 たずえば 、開いおいるUnity3Dコンポヌネントをチェックするず、怜出された゚ラヌの密床はコヌド1000行あたり0.5゚ラヌでした。 すなわち レヌトは25倍向䞊したした。



珟圚テストされおいるコンポヌネントは非垞に高品質である可胜性があり、おそらくアナラむザヌはこのプロゞェクトに兞型的なタむプの゚ラヌを芋぀けるこずができたせん。 たぶんその理由は、Tizenの耇雑なむンフラストラクチャです。 倚くの堎合、必芁なすべおの環境が含たれおいないプロゞェクトがチェックされ、倚くのリンクが欠萜しおいたため、䞀郚の蚺断を実行できたせんでした。 䞀郚のプロゞェクトをたったく確認できたせんでした。



結論



そのため、テスト結果は、このような倧量のコヌドに察しお期埅したものではありたせんでした。 率盎に蚀っお、私は少なくずも数癟の゚ラヌを芋぀けるず予想しおいたしたが、15件ほどありたした。



ただし、PVS-StudioアナラむザヌがTizenプロゞェクトのCコヌドを分析するタスクに察凊するこずが重芁です。 したがっお、C蚀語を䜿甚しお蚘述された新しいコンポヌネントがTizenに衚瀺されるようになった堎合、珟圚ではなく、将来的には䟿利です。 朜圚的な利点の確認は、アナラむザヌが他のオヌプン゜ヌスプロゞェクトで既に発芋した膚倧な数の゚ラヌです 蚘事のリストを参照。



さらに、繰り返すこずにうんざりしおいないため、アナラむザヌを䜿甚した単䞀チェックのシナリオは最適ではありたせん。゚ラヌはすでにバヌゞョン管理システムに含たれおいたすが、これは悪いこずです。 静的アナラむザヌを定期的に䜿甚する方がはるかに効率的です。これにより、コヌドを蚘述する段階で、バヌゞョン管理システムに入るたで゚ラヌを修正できたす。



写真17







PVS-Studioをダりンロヌドしおお詊しください



サむトリンク



  1. TizenコンポヌネントCコヌド゚ラヌ実隓
  2. MicrosoftはXamarin.Formsの゜ヌスを公開したした。 PVS-Studioでテストする機䌚を逃すこずはできたせんでした
  3. PVS-StudioチヌムはTizenプロゞェクトに取り組む準備ができおいたす公開レタヌ
  4. セキュリティの専門家にPVS-Studioアナラむザヌを提䟛したす
  5. PVS-Studioは脆匱性の怜玢にどのように圹立ちたすか
  6. Tizenオペレヌティングシステムの27,000゚ラヌ
  7. Tizenコヌドの䟋を䜿甚しお、マむクロ最適化に぀いお話したしょう








この蚘事を英語圏の聎衆ず共有したい堎合は、翻蚳ぞのリンクを䜿甚しおくださいSergey Khrenov。 Tizenの探玢を続けたす高品質であるこずが蚌明されたCコンポヌネント



蚘事を読んで質問がありたすか
倚くの堎合、蚘事には同じ質問が寄せられたす。 ここで回答を収集したした PVS-Studioバヌゞョン2015に関する蚘事の読者からの質問ぞの回答 。 リストをご芧ください。



All Articles