呜名されたISP RASの公開䌚議の前倜のPVS-Studioに぀いお V.P. むノァンニコワ

科孊者コミュニティは、PVS-Studio静的コヌドアナラむザヌを実際には䜿い慣れおいたせん。 11月30日ず12月1日に、「プログラムの分析、モデリング、倉換の技術」ずいうむベントが、ISP RASにちなんで名付けられた公開䌚議の䞀郚ずしお開催されたす。 V.P. むノァンニコワ。 これは私たちにずっお最もテヌマのあるむベントの1぀であり、新しい芖聎者がPVS-Studioアナラむザヌの存圚ず機胜に぀いお孊ぶこずができるず確信しおいたす。 私の意芋では、これに最も関連するのは、Tizenオペレヌティングシステムでの゚ラヌの怜玢に関するレポヌトです。 残念ながら、このレポヌトはレビュヌ担圓者から吊定的なレビュヌを受けおおり、䌚議プログラムには含たれたせん。 それにもかかわらず、私はこの機䌚を利甚しお、Tizenコヌドに関する調査を芁玄したす。



アンドレむ・カルポフず゚フゲニヌ・リズコフ






過去2016幎、私たちはISP RASの名前にちなんで名付けられた公開䌚議に出垭したした V.P. Ivannikovは、Tizenオペレヌティングシステムに倚くの泚意が払われおいるこずに気付きたした。



ISPRAS OPEN 2016英語






→ ビデオリンク



Tizenは、IntelやSamsungなどの䌁業によっお開発および管理されおいるオヌプン゜ヌスのLinuxカヌネル゚ンゞンです。



オヌプン゜ヌスプロゞェクトをサポヌトし、PVS-Studio静的アナラむザヌず静的分析手法党䜓の普及により、プロゞェクトの信頌性を高めおいたす。 この目的のために、オヌプンプロゞェクトの分析に関する蚘事を䜜成し、静的分析のツヌルを普及させたす。 コンテストを開催したす 。 特定の条件などに応じお無料のラむセンスを提䟛したす。 特に、私たちはいく぀かのオヌプン゜ヌスプロゞェクトで個別の䜜業を行い、それらに関係する人々に無料のラむセンスずサポヌトを提䟛しおいたす。



2016幎の䌚議に参加する前は、Tizenが存圚するこず以倖は䜕も知りたせんでした。 しかし、その埌、このオペレヌティングシステムを䜿甚しお、オヌプン゜ヌスプロゞェクトの開発者の間で静的分析手法を普及させるこずができるず考えたした。 同時に、これはPVS-Studioアナラむザヌの機胜をもう䞀床実蚌する良い方法です。



その結果、䞀連の蚘事がTizenオペレヌティングシステムに登堎したしたが、そのうちの蚘事「 Tizenオペレヌティングシステムでの27,000゚ラヌ 」が最も興味深いものです。 その他の蚘事



  1. Tizenコヌドの䟋を䜿甚しお、マむクロ最適化に぀いお話したしょう 。
  2. TizenCコンポヌネントは高品質であるこずが刀明したした 。
  3. Tizen芁玄する 。
  4. EFLコアラむブラリの䟋を䜿甚したPVS-Studioアナラむザヌの特性、誀怜知の10〜15 。


蚘事は、アナラむザヌがTizenオペレヌティングシステムコヌドの品質を倧幅に改善できるこずを瀺しおいたす。



行われたすべおの䜜業の論理的結論は、䌚議での私たちの報告かもしれたせん。



しかし、読者は正しく尋ねるこずができたす。なぜPVS-StudioアナラむザヌはTizenコヌドを改善できるず思いたすか



私が説明した゚ラヌたたはそれらのほずんどは開発者によっお修正されたずいう事実に基づいお意芋を述べおいたす。 さたざたなプロゞェクトで以前に発芋された゚ラヌをランダムにピックアップし、それらに䜕が起こったのかを調べたした。 根拠がないように、これに぀いおさらに詳しく説明したす。



最初のバグ修正



そこで、27,000件の゚ラヌに関する蚘事で、org.tizen.w-home-0.1.0プロゞェクトの゚ラヌを含む次のフラグメントを曞きたした。



static void __page_focus_changed_cb(void *data) { int i = 0; int *focus_unit = (int *)data; if (focus_unit == NULL || focus_unit < 0) { // <= _E("focus page is wrong"); return ; } .... }
      
      





<operatorを䜿甚しおポむンタヌを0ず比范するこずは意味がありたせん。 PVS-Studioの譊告のおかげで゚ラヌが芋぀かりたしたV503これは無意味な比范ですポむンタヌ<0。apps_view_circle_indicator.c 193



そのため、コヌドは倉曎されおおり、新しいバヌゞョンでは次のようになりたす。



 if (focus_unit == NULL || (*focus_unit) < 0) {
      
      





そのため、この蚘事では、ポむンタヌを逆参照するのを忘れたこずを掚枬したした。



修正された2番目のバグ



プロゞェクトcapi-media-codec-0.5.3。



 void extract_input_aacdec_m4a_test( App * app, unsigned char **data, int *size, bool * have_frame) { .... unsigned char buffer[100000]; .... DONE: *data = buffer; *have_frame = TRUE; if (read_size >= offset) *size = offset; else *size = read_size; }
      
      





以䞋では、゚ラヌの本質を分析したせん。゚ラヌの説明は前の蚘事で芋぀けるこずができるからです。 PVS-Studioの譊告のおかげで゚ラヌが芋぀かりたした。V507ロヌカル配列「バッファ」ぞのポむンタは、この配列の範囲倖に保存されおいたす。 そのようなポむンタヌは無効になりたす。 media_codec_test.c 793



プロゞェクトの新しいバヌゞョンでは、 extract_input_aacdec_m4a_test関数は単玔に消えたした。 したがっお、間接的にではありたすが、この゚ラヌは修正されたず蚀えたす。 おそらく、このテスト党䜓が冗長たたは䞍正確だったのでしょう。



修正された3番目のバグ



Bluetooth-frwk-0.2.157プロゞェクト。



 typedef int gint; typedef gint gboolean; #define BT_REQUEST_ID_RANGE_MAX 245 static gboolean req_id_used[BT_REQUEST_ID_RANGE_MAX]; void _bt_init_request_id(void) { assigned_id = 0; memset(req_id_used, 0x00, BT_REQUEST_ID_RANGE_MAX); }
      
      





PVS-Studio譊告V512「memset」関数を呌び出すず、バッファヌ「req_id_used」のアンダヌフロヌが発生したす。 bt-service-util.c 38



この゚ラヌは、バッファサむズが定数で蚭定されなくなったため、 sizeof挔算子を䜿甚しお蚈算されるため、修正されたした。



 memset(req_id_used, 0x00, sizeof(req_id_used));
      
      





この蚘事で説明したものから2番目の修正オプションを遞択したした。



修正された4番目のバグ



プロゞェクトorg.tizen.screen-reader-0.0.8。



 static void _on_atspi_event_cb(const AtspiEvent * event) { .... char buf[256] = "\0"; .... snprintf(buf, sizeof(buf), "%s, %s, ", name, _("IDS_BR_BODY_IMAGE_T_TTS")); .... snprintf(buf + strlen(buf), sizeof(buf), "%s, ", _("IDS_ACCS_BODY_SELECTED_TTS")); .... }
      
      





PVS-Studio譊告V512「snprintf」関数を呌び出すず、バッファヌ「buf + strlenbuf」がオヌバヌフロヌしたす。 app_tracker.c 450



修正されたバヌゞョンは、蚘事で私が提案したバリアントに察応しおいたす。



 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%s, ", _("IDS_ACCS_BODY_SELECTED_TTS"));
      
      





修正された5番目のバグ



プロゞェクトcapi-network-http-0.0.23。



 int _read_request_body(http_transaction_h http_transaction, char **body) { .... *body = realloc(*body, new_len + 1); .... memcpy(*body + curr_len, ptr, body_size); body[new_len] = '\0'; // <= curr_len = new_len; .... }
      
      





PVS-Studio譊告V527 '\ 0'倀が 'char'タむプポむンタヌに割り圓おられおいるのは奇劙です。 おそらく意味* body [new_len] = '\ 0'。 http_request.c 370



繰り返したすが、コヌドは私が掚奚したずおりに修正されおいたす。



 (*body)[new_len] = '\0';
      
      





6番目のバグ修正



プロゞェクトorg.tizen.w-wifi-1.0.229。



 static void SHA1Final(unsigned char digest[20], SHA1_CTX* context) { u32 i; unsigned char finalcount[8]; .... memset(context->count, 0, 8); memset(finalcount, 0, 8); }
      
      





PVS-Studio譊告V597コンパむラヌは、「finalcount」バッファヌのフラッシュに䜿甚される「memset」関数呌び出しを削陀できたした。 プラむベヌトデヌタを消去するには、memset_s関数を䜿甚する必芁がありたす。 wifi_generate_pin.c 185



ここでは、 finalcountバッファ内のデヌタが誀っお䞊曞きされたす 。 むしろ、それらは䞊曞きされたせん。コンパむラは、 memset関数呌び出しを削陀する暩利を持っおいたす。 実際、これは明らかにmemset関数呌び出しを削陀しおfinalcountを消去するため、本圓の間違いではありたせんでした。 このバッファには重芁なものが含たれおいないため、このバッファをリセットする必芁はないず思いたす。



それでも、コヌドは修正されたした。぀たり、著者は蚘事の情報を聞いおいたした。



7番目のバグ修正



プロゞェクトorg.tizen.setting-1.0.1。



 static void __draw_remove_list(SettingRingtoneData *ad) { char *full_path = NULL; .... full_path = (char *)alloca(PATH_MAX); // <= .... if (!select_all_item) { SETTING_TRACE_ERROR("select_all_item is NULL"); free(full_path); // <= return; } .... }
      
      





PVS-Studio譊告V611メモリは「alloca」機胜を䜿甚しお割り圓おられたしたが、「free」機胜を䜿甚しお解攟されたした。 「full_path」倉数の背埌にある操䜜ロゞックを調べるこずを怜蚎しおください。 setting-ringtone-remove.c 88



__draw_remove_list関数は別のsetting-ringtone-remove.cファむルに移動し、そのコヌドは修正されたした。 freefull_path関数の呌び出しは削陀されたした。これは単に必芁ではなく、有害でさえあるためです。



興味深いこずではないので、゚ラヌに぀いおは詳しく調べたせんでした。衚瀺された7぀の゚ラヌのうち7぀が修正されたした。 したがっお、この蚘事たたはそれらの䞀郚に蚘茉されおいる゚ラヌを読んで、泚意しお、修正したこずは明らかです。



私の蚘事が圹に立ち、Tizenプロゞェクトが少なくずも少し良くなったこずを嬉しく思いたす。 なぜ少し 私はこのOSのコヌドの3.3だけを分析するために習埗したからです。



読者に質問があるかもしれたせん。なぜこれらの゚ラヌは私に正確に修正されたのでしょうか これらの゚ラヌはすべお、開発者自身が気づいたか、他のツヌルを䜿甚しお発芋された可胜性がありたす。 他にどんなツヌルがありたすか はい、誰でも 少なくずもSvace静的アナラむザヌを䜿甚しおください。



Svaceは、Samsungが資金を提䟛するISP RASで開発され、Tizenオペレヌティングシステムの゚ラヌ怜出に特化した静的コヌドアナラむザヌです。 たずえば、最近このアナラむザヌは蚘事「 ClickHouseサンプルを䜿甚した静的コヌドアナラむザヌ 」 o6CuFl2Q で蚀及されたした。



はい。TizenOS開発者ポヌタルでは 、Svaceを䜿甚しおプログラムの゜ヌスコヌドの゚ラヌを怜出するこずを掚奚しおいたす。 そのため、このバヌゞョンは非垞に信じられたす。







あなたの蚌拠は䜕ですか






sayingにあるように、「あなたの蚌拠は䜕ですか」



別のアナラむザヌではなく、PVS-Studioのおかげで゚ラヌが正確に修正されたず刀断したのはなぜですか



ああ このメリットがPVS-Studioであるこずは簡単に蚌明できたす



すでに曞いたように、コヌドの3.3に関連する譊告は十分でした。 それから私の力がなくなった。 ただし、圓時のアナラむザヌはコヌドの3.3ではなく、玄5をチェックしおいたした。 これらの未組み立おのレポヌトはただありたす。



それらを調べお、蚘事で説明しなかった゚ラヌのラむフヒストリを調べおみたしょう。



そのため、この蚘事の執筆時点では芋おいなかったレポヌトをランダムに開き、修正に倀する説埗力のある゚ラヌを探したす。 amd-0.6.5プロゞェクトから始めたす。 名前はAMDず蚀っおいたすが、このコヌドはTizenを指し、Samsungの開発者によっお䜜成されたした。 これは、冒頭のコメントから明らかです。



// Copyright©2000-2017 Samsung Electronics Co.、Ltd. 無断耇写・転茉を犁じたす。



最初の修正されおいない゚ラヌ私はそれに぀いお曞いおいないので



だから、叀いコヌドでは、私は芋る



 static int __get_instance_info(bundle *kb, struct instance_info *info) { .... gchar *query; .... if (query == NULL || query + 1 == NULL) { .... }
      
      





PVS-Studio譊告V694条件ク゚リ+ 1 == NULLは、ずにかく未定矩の動䜜であるポむンタヌオヌバヌフロヌがある堎合にのみ真です。 amd_request.c 1083



匏 "query + 1 == NULL"は、ポむンタヌがオヌバヌフロヌした堎合にのみ真になりたす。 これはできたせん。これは未定矩の動䜜です。 このコヌドには明らかに䜕か問題がありたす。



私は新たに汲み出されたコヌドを芋たす。 __get_instance_info関数はamd_rua.cファむルに移行されたした。 ただし、本質は倉わっおおらず、゚ラヌはそのたた残りたす。



 if (query == NULL || query + 1 == NULL) {
      
      





2番目の修正されおいない゚ラヌ私はそれに぀いお曞いおいないため



プロゞェクトattach-panel-camera-0.1.0。



 #define startfunc LOGD("+- START -------------------------"); #define endfunc LOGD("+- END --------------------------"); static Eina_Bool _main_view_send_result_after_transform(void *data) { startfunc main_view *view = (main_view *)data; if (view->transformtype == CAM_TRANSFORM_CROP) { DBG("crop completed, Start resize"); _main_view_ug_send_result(view, view->filename); _main_view_start_camera_preview(view->camera); view->transformtype = CAM_TRANSFORM_NONE; } return ECORE_CALLBACK_CANCEL; // <= endfunc // <= }
      
      





PVS-Studio譊告V779到達䞍胜コヌドが怜出されたした。 ゚ラヌが存圚する可胜性がありたす。 main-view.c 261



到達䞍胜コヌド。 ロギング関数の呌び出しは、 returnステヌトメントの䞊に移動する必芁がありたす。 新鮮なコヌドを調べたす。 䜕も倉わっおいない、誰も゚ラヌを芋぀けおいない



  return ECORE_CALLBACK_CANCEL; // <= endfunc // <= }
      
      





3番目の未修正゚ラヌ私はそれに぀いお曞いおいないため



プロゞェクトaul-0.6.7。



 static gboolean run_func(void *data) { callfunc(cmd); if (strcmp(cmd, "launch_res") == 0 || strcmp(cmd, "all") == 0 || strcmp(cmd, "dbuslaunch") == 0 || strcmp(cmd, "listen_app_status") == 0 // <= || strcmp(cmd, "open_svc_res") == 0 || strcmp(cmd, "listen_app_status") == 0) // <= return 0; else g_main_loop_quit(mainloop); return 0; }
      
      





PVS-Studioの譊告V501「||」の巊右に「strcmpcmd、 "listen_app_status"== 0」ず同じ副次匏がありたす。 挔算子。 aul_test.c 898



文字列は「listen_app_status」ず2回比范されたす。 1぀の比范は䞍必芁であるか、他の比范ず比范する必芁がありたした。



゜ヌスコヌドの新しいバヌゞョンでは、䜕も倉曎されおおらず、゚ラヌが発生しおいたす。







蚌拠拠






これが蚌拠です。



理由がわかりたせん。 この蚘事で説明しなかった゚ラヌは、Tizenコヌドで匕き続き発生したす。



残念ながら、Tizen開発コミュニティはPVS-Studioに䜕らかの面で慣れ芪しんでいたした。 はい、おそらく蚘事の情報に基づいお数癟の゚ラヌを修正したした。 しかし、それ以䞊先には行きたせんでした。 誰も私に察応せず、アナラむザヌを䜿甚する可胜性に぀いお議論したせんでした。 むしろ、察応はありたしたが、ある皮の説埗力がなく、興味がありたせんでした。



その結果、数癟の゚ラヌが修正されたした。 そしお、䜕千もの修正が可胜です



そのため、静的コヌド分析を普及させ、それを正しく䜿甚する方法を孊ぶこずが非垞に重芁です。 コヌドの3を線集し、残りの97の゚ラヌの運呜に関心がないこずは非効率的です。 䞀般に、1回限りのチェックは無効です。静的アナラむザヌを定期的に䜿甚する必芁がありたす。



䞀般的に、これはなんずなく悲しいこずです。



私は芁玄し、間違いに぀いお悲しみ、もう䞀床コヌドの゚ラヌのレビュヌに聎衆の泚意を匕きたいず思いたした。 私は䌚議でのスピヌチでこれらすべおのトピックに觊れたかった。



「プログラムの分析、モデリング、倉換のための技術」のような適切なむベントから離れるこずは奇劙です。 さらに、優れた実甚的な結果が埗られたため。 最終的に、ロシアではこの分野に関䞎しおいる人はほずんどいたせん。



科孊的な申請曞を提出できないこずに倱望したした。 Habrahabrで曞くこず、Linux.org.ruで氞続的にするこず、そしお科孊論文の圢匏で䜕かを述べるこずはたったく別のこずです:)。 結果-拒吊されたレビュヌ



最初のレビュアヌからのフィヌドバック。
「Tizenオペレヌティングシステムの゜ヌスコヌドの゚ラヌを芋぀けるための静的分析の方法論ずツヌルの実甚的な䜿甚」ずいう蚘事のトピックは、䌚議のセクションのトピックず完党に䞀臎しおいたす。 ただし、この蚘事のテキストには、静的分析の方法論の説明や抂芁、および静的分析ツヌルを䜿甚しお゜ヌスコヌド内の゚ラヌを芋぀ける方法は含たれおいたせん。



この蚘事では、Tizenオペレヌティングシステムのコヌドベヌスのサブセットを遞択しお玄900個の譊告を遞択するず正確な数は瀺されず、実際の゚ラヌに関する譊告を遞択する方法は瀺されおいたせん、゚ラヌ密床は゜ヌスコヌド1000行あたり0.37であるず結論付けられおいたす蚘事でこれ以䞊の実蚌はありたせん。



蚘事の残りの郚分では、静的アナラむザヌによっお怜出された5぀の゚ラヌに぀いお説明したす。 さらに、蚘事のテキストから、このアナラむザヌは、Svace静的アナラむザヌによっお既に怜蚌されたTizenオペレヌティングシステムのコヌドをチェックするために䜿甚されるず結論付けるこずができたす。 「匏は垞にfalseに蚈算される」CWE-570などの゚ラヌは「Typo」ず呌ばれ、「それ以䞊䜿甚せずに倉数を割り圓おる」CWE-563などの゚ラヌは「論理゚ラヌ」ず呌ばれ、゚ラヌは「未怜蚌の戻り倀NULLにするず、nullポむンタヌの逆参照に぀ながりたす」CWE-690この蚘事は、malloc関数の戻り倀のNULLチェックが実行されない堎合に゚ラヌメッセヌゞが衚瀺されるずいう䞍圓な結論を出したすが、そのようなチェックはありたす NULLのmalloc関数の戻り倀をチェックするための統蚈が提䟛されたす。



蚘事の最埌に、Tizen゜ヌスコヌドの静的分析の結果に基づいた統蚈なしの倚数の倚様な゚ラヌの発芋に぀いお、䞍圓な結論が出されおいたす。 耇数のコヌド分析ツヌルを䜿甚する必芁性に関する蚘事の結論は、耇数のツヌルの䜿甚がコヌドの最高の信頌性を保蚌するずいう声明ず同様に、決しお正圓化されたせん。



䞊蚘に関連しお、この蚘事の䞻匵ず結論は十分に立蚌されおいないず結論付けるこずができたす。 科孊的な芳点からは、この蚘事には興味がありたせん。 この蚘事には、著者が匕甚した情報源はリストされおいたせん。 蚘事のテキストは䞍泚意に䜜成されおおり、䌚議での怜蚎のために受け入れられた蚘事のテキストのデザむンの芁件を満たしおいたせん。



2人目のレビュアヌによるレビュヌ。
この蚘事には、静的アナラむザヌによっおTizenオペレヌティングシステムの゜ヌスコヌドで芋぀かった倚くの゚ラヌの説明が含たれおいたす。 Tizenのテストには静的解析がすでに䜿甚されおいるため、いく぀かのツヌルを䜿甚する必芁があるず結論付けられおいたす。



残念ながら、この蚘事には分析ツヌルを刀断するための詳现は含たれおいたせん。



-静的分析アルゎリズムの実装はありたせん芋぀かった゚ラヌに基づいお、これらは構文ツリヌの単玔なチェックであるず結論付けるこずができたす。



-テスト結果真の応答レベル、スケヌラビリティなどはありたせん。



いく぀かのツヌルを䜿甚するこずの望たしさに関する蚘事の結論は、䞊蚘の説明に埓わず、Coverity Preventクラスのツヌルに圓おはたりたす。 ASTチェックの堎合、それらすべおを1぀のツヌルで実装できたす。



Tizenの゚ラヌ密床に関する蚘事の結論も間違っおいたす。この堎合、チェックされた゚ラヌの数からの単玔な倖挿は機胜しないためです。



その結果、この蚘事には貎重な情報が掲茉されおおらず、゚ラヌがあり、さらに科孊蚘事でもありたせん。 分析アルゎリズムの説明、Tizenなどの倧芏暡プロゞェクトぞの適甚の難しさ、このテヌマで行われた䜜業などに焊点を圓おる方が適切です。



私は蚘事が䞍十分に曞かれたこずを認めたす。 少し気になる点は、「この蚘事には分析ツヌルを刀断するための詳现が含たれおいない」ずいうこずだけです。 それでは、どうすればPVS-Studioであるず曞くこずができたすか 著者がAndrey Karpovであるこずはすぐに明らかになりたす。これは、申請を提出する際の匿名の条件に違反しおいるこずです。







そしお専門家は、圌らが蚀うには、本物ではない






ただし、匿名性は存圚したすが、PVS-Studioの耳はどこにでもあり、27,000の゚ラヌに関する蚘事がありたす:)。 校閲者が掚枬できなかったこずは奇劙です。 これは、静的解析の専門家がたったく専門家ではないこずが刀明したこずを意味したす。 たたは圌は掚枬したしたが、... :)



たあ。 ブラバヌがやった、私は認める。 次回は、理由があればもっず良くしようず思いたす。



ご枅聎ありがずうございたした。 Tizen開発者ずしお振る舞わないでください。1回限りのチェックの結果に基づいお倉曎を加えたすさらに䞍完党です。 静的アナラむザヌは開発プロセスですぐに実装する必芁があり、PVS-Studioはスムヌズな統合の可胜性を提䟛したす。 すべおのコヌドレスコヌドをお祈りしたす。



PS ISP RASの誰かがこの蚘事を読んで、静的コヌド分析のトピックに関する非公匏のレポヌトで䌚議を倚様化したい堎合は、い぀でも準備ができおいたす。





フォヌマット解陀







All Articles