;sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/dev-tools/sparsemodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Simplified)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget$/translations/zh_CN/dev-tools/sparsemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget$/translations/it_IT/dev-tools/sparsemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget$/translations/ja_JP/dev-tools/sparsemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget$/translations/ko_KR/dev-tools/sparsemodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget$/translations/sp_SP/dev-tools/sparsemodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Traditional)uh1h hh _documenthsourceNlineNubh paragraph)}(h@Chinese translated version of Documentation/dev-tools/sparse.rsth]h@Chinese translated version of Documentation/dev-tools/sparse.rst}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhQ/var/lib/git/docbuild/linux/Documentation/translations/zh_TW/dev-tools/sparse.rsthKhhhhubh)}(hXEIf you have any comment or update to the content, please contact the original document maintainer directly. However, if you have a problem communicating in English you can also ask the Chinese maintainer for help. Contact the Chinese maintainer if this translation is outdated or if there is a problem with the translation.h]hXEIf you have any comment or update to the content, please contact the original document maintainer directly. However, if you have a problem communicating in English you can also ask the Chinese maintainer for help. Contact the Chinese maintainer if this translation is outdated or if there is a problem with the translation.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubhsection)}(hhh](htitle)}(hGTraditional Chinese maintainer: Hu Haowen <2023002089@link.tyut.edu.cn>h](h+Traditional Chinese maintainer: Hu Haowen <}(hhhhhNhNubh reference)}(h2023002089@link.tyut.edu.cnh]h2023002089@link.tyut.edu.cn}(hhhhhNhNubah}(h]h ]h"]h$]h&]refuri"mailto:2023002089@link.tyut.edu.cnuh1hhhubh>}(hhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhK ubh)}(h8Documentation/dev-tools/sparse.rst 的繁體中文翻譯h]h8Documentation/dev-tools/sparse.rst 的繁體中文翻譯}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(hX 如果想評論或更新本文的內容,請直接聯繫原文檔的維護者。如果你使用英文 交流有困難的話,也可以向繁體中文版維護者求助。如果本翻譯更新不及時或 者翻譯存在問題,請聯繫繁體中文版維護者。h]hX 如果想評論或更新本文的內容,請直接聯繫原文檔的維護者。如果你使用英文 交流有困難的話,也可以向繁體中文版維護者求助。如果本翻譯更新不及時或 者翻譯存在問題,請聯繫繁體中文版維護者。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(h繁體中文版維護者: 胡皓文 Hu Haowen <2023002089@link.tyut.edu.cn> 繁體中文版翻譯者: 胡皓文 Hu Haowen <2023002089@link.tyut.edu.cn>h](h1繁體中文版維護者: 胡皓文 Hu Haowen <}(hjhhhNhNubh)}(h2023002089@link.tyut.edu.cnh]h2023002089@link.tyut.edu.cn}(hjhhhNhNubah}(h]h ]h"]h$]h&]refuri"mailto:2023002089@link.tyut.edu.cnuh1hhjubh3> 繁體中文版翻譯者: 胡皓文 Hu Haowen <}(hjhhhNhNubh)}(h2023002089@link.tyut.edu.cnh]h2023002089@link.tyut.edu.cn}(hj#hhhNhNubah}(h]h ]h"]h$]h&]refuri"mailto:2023002089@link.tyut.edu.cnuh1hhjubh>}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubeh}(h]Dtraditional-chinese-maintainer-hu-haowen-2023002089-link-tyut-edu-cnah ]h"]Gtraditional chinese maintainer: hu haowen <2023002089@link.tyut.edu.cn>ah$]h&]uh1hhhhhhhhK ubh)}(hhh](h)}(h以下爲正文h]h以下爲正文}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjEhhhhhKubh)}(hyCopyright 2004 Linus Torvalds Copyright 2004 Pavel Machek Copyright 2006 Bob Copeland h](h;Copyright 2004 Linus Torvalds Copyright 2004 Pavel Machek <}(hjVhhhNhNubh)}(h pavel@ucw.czh]h pavel@ucw.cz}(hj^hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:pavel@ucw.czuh1hhjVubh> Copyright 2006 Bob Copeland <}(hjVhhhNhNubh)}(hme@bobcopeland.comh]hme@bobcopeland.com}(hjrhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:me@bobcopeland.comuh1hhjVubh>}(hjVhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjEhhubh)}(hhh](h)}(h#使用 sparse 工具做類型檢查h]h#使用 sparse 工具做類型檢查}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hD"__bitwise" 是一種類型屬性,所以你應該這樣使用它::h]hG“__bitwise” 是一種類型屬性,所以你應該這樣使用它:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh literal_block)}(htypedef int __bitwise pm_request_t; enum pm_request { PM_SUSPEND = (__force pm_request_t) 1, PM_RESUME = (__force pm_request_t) 2 };h]htypedef int __bitwise pm_request_t; enum pm_request { PM_SUSPEND = (__force pm_request_t) 1, PM_RESUME = (__force pm_request_t) 2 };}hjsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1jhhhK hjhhubh)}(hXM這樣會使 PM_SUSPEND 和 PM_RESUME 成爲位方式(bitwise)整數(使用"__force" 是因爲 sparse 會抱怨改變位方式的類型轉換,但是這裡我們確實需要強制進行轉 換)。而且因爲所有枚舉值都使用了相同的類型,這裡的"enum pm_request"也將 會使用那個類型做爲底層實現。h]hXU這樣會使 PM_SUSPEND 和 PM_RESUME 成爲位方式(bitwise)整數(使用”__force” 是因爲 sparse 會抱怨改變位方式的類型轉換,但是這裡我們確實需要強制進行轉 換)。而且因爲所有枚舉值都使用了相同的類型,這裡的”enum pm_request”也將 會使用那個類型做爲底層實現。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK'hjhhubh)}(h而且使用 gcc 編譯的時候,所有的 __bitwise/__force 都會消失,最後在 gcc 看來它們只不過是普通的整數。h]h而且使用 gcc 編譯的時候,所有的 __bitwise/__force 都會消失,最後在 gcc 看來它們只不過是普通的整數。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK,hjhhubh)}(h~坦白來說,你並不需要使用枚舉類型。上面那些實際都可以濃縮成一個特殊的"int __bitwise"類型。h]h坦白來說,你並不需要使用枚舉類型。上面那些實際都可以濃縮成一個特殊的”int __bitwise”類型。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK/hjhhubh)}(h)所以更簡單的辦法只要這樣做::h]h(所以更簡單的辦法只要這樣做:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK2hjhhubj)}(htypedef int __bitwise pm_request_t; #define PM_SUSPEND ((__force pm_request_t) 1) #define PM_RESUME ((__force pm_request_t) 2)h]htypedef int __bitwise pm_request_t; #define PM_SUSPEND ((__force pm_request_t) 1) #define PM_RESUME ((__force pm_request_t) 2)}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhK4hjhhubh)}(hH現在你就有了嚴格的類型檢查所需要的所有基礎架構。h]hH現在你就有了嚴格的類型檢查所需要的所有基礎架構。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK9hjhhubh)}(hXU一個小提醒:常數整數"0"是特殊的。你可以直接把常數零當作位方式整數使用而 不用擔心 sparse 會抱怨。這是因爲"bitwise"(恰如其名)是用來確保不同位方 式類型不會被弄混(小尾模式,大尾模式,cpu尾模式,或者其他),對他們來說 常數"0"確實是特殊的。h]hXa一個小提醒:常數整數”0”是特殊的。你可以直接把常數零當作位方式整數使用而 不用擔心 sparse 會抱怨。這是因爲”bitwise”(恰如其名)是用來確保不同位方 式類型不會被弄混(小尾模式,大尾模式,cpu尾模式,或者其他),對他們來說 常數”0”確實是特殊的。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK;hjhhubeh}(h]sparseah ]h"]#使用 sparse 工具做類型檢查ah$]h&]uh1hhjEhhhhhKubh)}(hhh](h)}(h獲取 sparse 工具h]h獲取 sparse 工具}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'hhhhhKAubh)}(h;你可以從 Sparse 的主頁獲取最新的發布版本:h]h;你可以從 Sparse 的主頁獲取最新的發布版本:}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKChj'hhubh block_quote)}(h7https://www.kernel.org/pub/software/devel/sparse/dist/ h]h)}(h6https://www.kernel.org/pub/software/devel/sparse/dist/h]h)}(hjNh]h6https://www.kernel.org/pub/software/devel/sparse/dist/}(hjPhhhNhNubah}(h]h ]h"]h$]h&]refurijNuh1hhjLubah}(h]h ]h"]h$]h&]uh1hhhhKEhjHubah}(h]h ]h"]h$]h&]uh1jFhhhKEhj'hhubh)}(hF或者,你也可以使用 git 克隆最新的 sparse 開發版本:h]hF或者,你也可以使用 git 克隆最新的 sparse 開發版本:}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKGhj'hhubjG)}(h5git://git.kernel.org/pub/scm/devel/sparse/sparse.git h]h)}(h4git://git.kernel.org/pub/scm/devel/sparse/sparse.gith]h4git://git.kernel.org/pub/scm/devel/sparse/sparse.git}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKIhjxubah}(h]h ]h"]h$]h&]uh1jFhhhKIhj'hhubh)}(h?一旦你下載了源碼,只要以普通用戶身份運行:h]h?一旦你下載了源碼,只要以普通用戶身份運行:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKKhj'hhubjG)}(hmake make install h]h)}(hmake make installh]hmake make install}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKMhjubah}(h]h ]h"]h$]h&]uh1jFhhhKMhj'hhubh)}(h4它將會被自動安裝到你的 ~/bin 目錄下。h]h4它將會被自動安裝到你的 ~/bin 目錄下。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKPhj'hhubeh}(h]id2ah ]h"]獲取 sparse 工具ah$]h&]uh1hhjEhhhhhKAubh)}(hhh](h)}(h使用 sparse 工具h]h使用 sparse 工具}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKSubh)}(hX用"make C=1"命令來編譯內核,會對所有重新編譯的 C 文件使用 sparse 工具。 或者使用"make C=2"命令,無論文件是否被重新編譯都會對其使用 sparse 工具。 如果你已經編譯了內核,用後一種方式可以很快地檢查整個源碼樹。h]hX'用”make C=1”命令來編譯內核,會對所有重新編譯的 C 文件使用 sparse 工具。 或者使用”make C=2”命令,無論文件是否被重新編譯都會對其使用 sparse 工具。 如果你已經編譯了內核,用後一種方式可以很快地檢查整個源碼樹。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKUhjhhubh)}(hmake 的可選變量 CHECKFLAGS 可以用來向 sparse 工具傳遞參數。編譯系統會自 動向 sparse 工具傳遞 -Wbitwise 參數。h]hmake 的可選變量 CHECKFLAGS 可以用來向 sparse 工具傳遞參數。編譯系統會自 動向 sparse 工具傳遞 -Wbitwise 參數。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKYhjhhubeh}(h]id3ah ]h"]使用 sparse 工具ah$]h&]uh1hhjEhhhhhKSubeh}(h]id1ah ]h"]以下爲正文ah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj,error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jBj?jjj$j!jjjju nametypes}(jBjj$jjuh}(j?hjjEj!jjj'jju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}j:KsRparse_messages]transform_messages] transformerN include_log] decorationNhhub.