5


1

C ++コードを64ビットに移植するための自動変換ツールはありますか?

私は、大量(1,000万行以上)のC ++コードを64ビットに移植する方法を研究しています。 静的コードアナライザーとコンパイラフラグを調べましたが、現在、一般的な繰り返しの変更を行うことができるマクロまたは他のツールを調べています。

実際にどのように機能するかを確認するためにいくつかの正規表現を作成しましたが、予想どおり、非常に効果的です。 そうは言っても、そもそも式を作成するには時間がかかるので、そのような式のリストや、変更を自動的に実行できるソフトウェアツールがあるかどうかを確認したいと思います。

次の行は、照合および修正されるコードの典型的な例です。 (明確にするために、これらの行はコードの単一ブロックを表すものではなく、異なる場所から引き出された行です。)

int i = 0;
long objcount;
int count = channels.count(ch);
for (int k = 0; k < n; k++) { /*...*/ }

目的は、コードを完全に64ビットに移植するのではなく、コードの最初のパスを実行して、手動で検査する必要があるコードの量を減らすことです。 いくつかの必要な変更を見逃すことは問題ありませんし、間違った変更を行うことは「おそらく」問題ありませんが、それらは最小限に抑える必要があります。

Visual Studioは変換作業に使用されるIDEであるため、VSでうまく機能するものはプラスです。 コストは問題ではありません。

2 Answer


1


Rexexpsは高い偽陽性率に悩まされています。定義上、「正規表現」はC ++などのコンテキストのない言語を解析できません。 さらに、正規表現ではタイプ情報を考慮できません。は

   fooT i=0;

わかりました、いくつかのtypedefされたfooTですか? 最後に、正規表現はコードを変更できません。 PerlまたはSED(変更を駆動するために正規表現を使用)を検討するかもしれませんが、正規表現の誤検知により誤った変更を取得します。 10M SLOCでは、それは楽しいことではありません。 5%のエラー率は、手作業で修正するコードが50,000行になる可能性があることを意味します。

http://en.wikipedia.org/wiki/Program_transformation [プログラム変換]ツールを検討してください。 このようなエンジンは、テキストではなく言語構造で動作し、より洗練されたバージョンは、スコープ、タイプ、およびシンボルの意味を知っています(たとえば、fooTとは正確に何ですか?)。 ターゲット言語の表面構文を使用して、言語固有およびコンテキスト固有のパターンを記述し、構造的に正しいコード変更を提案する機能を提供します。 これにより、大規模なコード変更の信頼できる適用が可能になります。

DMS Software Reengineering Toolkitとhttp://www.semanticdesigns.com/Products/FrontEnds/CppFrontEnd.html[C Front End]は大規模なC システムに対する大規模な変更を構文および型に正確な方法で実行するために使用されます。 (Akers、R.、Baxter、I.、Mehlich、M。 、エリス、B。 、Luecke、K。、ケーススタディ:自動プログラム変換によるC ++コンポーネントモデルのリエンジニアリング、情報とソフトウェアテクノロジー49(3):275-291 2007.)


0


使用しているコンパイラのバージョンは何ですか? 64ビット問題への移植性を検出するために、/ Wp64フラグを使用してコンパイラーを実行しようとしましたか?

MS Webサイトから:「/ Wp64は、__ w64キーワードでもマークされている型で64ビットの移植性の問題を検出します。 / Wp64は、Visual C 32ビットコンパイラではデフォルトでオフになっており、Visual C 64ビットコンパイラではデフォルトでオンになっています。