ブログ 約2分

C/C++プロジェクトで難読化された名前を検出する

Share this article
C/C++プロジェクトで難読化された名前を検出する

このようなコードに何度遭遇したことがあるでしょうか。

obfuscatednames

場合によっては、このようなコードは大きな問題ではないかもしれません。しかし、開発者がこのコーディング習慣を頻繁に使うと、企業にとってコストがかさむ可能性があります。コードをデバッグしたり新機能を追加したりする必要がある新しいメンバーは、既存のコードベースを理解するために多くの時間を費やすことになります。

これらの難読化された名前を検出してリファクタリングするには、どうすればよいでしょうか。

1. clang-query と AST Matchers を使う

Clangの LibASTMatchers は、AST内のノードを照合し、照合されたノードを使用するコードを実行するための強力なライブラリです。 LibToolingと組み合わせることで、コード変換ツールやクエリツールを作成できます。

The clang-query は LibASTMatchers を基盤としており、特定のソースファイルのASTノードを簡単に照会できます。

たとえば、名前が1文字だけの関数を検出したい場合は、次のASTマッチャーを実行できます。

functionDecl(matchesName("^[a-zA-Z]$"))

AST Matchers は、コードベースを照会する強力な方法を提供します。以下は AST Matchers のドキュメント

ASTマッチャーは、AST内のノードに対する述語です。マッチャーは、マッチャーのツリーを構築できる作成関数を呼び出して作成します。内部マッチャーを使うことで、一致条件をより具体的にできます。

たとえば、翻訳単位のAST内にあるすべてのクラス宣言または共用体宣言に一致するマッチャーを作成するには、 recordDecl()を呼び出します。一致を絞り込み、たとえば名前が「Foo」のすべてのクラス宣言または共用体宣言を検索する場合は、 hasName マッチャーを挿入します。次の呼び出し recordDecl(hasName("Foo")) は、任意の名前空間内で「Foo」という名前のクラスまたは共用体に一致するマッチャーを返します。既定では、複数の内部マッチャーを受け取るマッチャーは暗黙の allOf()を使用します。これにより一致をさらに絞り込めます。たとえば、「Bar」から派生したすべてのクラスに一致させるには次のようにします。 recordDecl(hasName("Foo"), isDerivedFrom("Bar"))

2. CppDepend と CQLinq を使う

CppDependには、コードベースを照会するためのコードクエリ言語 CQLinq が付属しています。

CQLinqでは、次を含む複数の定義済みドメインを照会できます。 TypesMethodsFieldsNamespacesProjects

これらのドメインには、照会対象のコードベース内のすべてのコード要素だけでなく、コードベースで使用されているすべての サードパーティ コード要素も含まれます(たとえば、型 string と、コードベースで使用されている型 string のすべてのメソッドとフィールドが含まれます)。

構文は次のようにシンプルです。

from m in Methods where m.NbLinesOfCode > 30 select m

名前が1文字だけの関数を検出するには、次のCQLinqクエリを実行できます。

Untitled2

まとめ:

シンボル名の重要性を過小評価してはいけません。適切な名前は、コードベースを理解しやすく保守しやすくします。不適切な名前のシンボルを検出するようビルドプロセスを自動化すれば、コードベース全体の品質向上に役立ちます。

Share this article