1

Linux でレガシー アプリケーションを 64 ビットに移植する作業を行っています。long と int が同じ意味で使用されている場所はたくさんありますが、ソース コードがかなり大きいため、テストですべてを把握することは困難です。コードを静的に分析し、安全でないコードを修正するために使用するプラグインを計画しています。そのようなパターンの1つは

void foo(unsigned long *x){
    *x = *x + 1; //x is pointing to a 32-bit space
    return;
}

int main(){
    unsigned int x = ;
    foo(reinterpret_cast<unsigned long*>(&x)); 
}

アプリケーションのビルドには gcc-4.2.1 を使用します。そして、 -Wall と -Wextra が有効になっていても、これらのタイプのキャストについて警告しません。

-Weverything で clang を実行しようとしましたが、成功しませんでした。これらのタイプの危険な明示的なキャストについて警告するフラグがclangにありますか? そうでない場合、どうすれば追加できますか?

4

3 に答える 3

2

探している状況についてclangが直接警告するとは思いません。ただし、C スタイルのキャストやreinterpret_cast<>()s のすべての使用を検出するプラグインを作成するのはかなり簡単です。tools/clang/examples/PrintFunctionNamesソースツリーがある場合、ディレクトリにプラグインを作成する方法の例があります。ロンドン地域にお住まいの方は、来週月曜日の私のプレゼンテーションに興味があるかもしれません。

于 2012-11-22T08:02:48.850 に答える
2

頭に浮かぶ最も簡単な方法は、単にすべてを検索/置換しreinterpret_caststatic_castコンパイルすることです.GCCは無効に関する多くのエラーを表示します.static_cast

于 2012-11-22T08:08:29.567 に答える
1

を使用して明示的にキャストしてreinterpret_castいるため、コンパイラは、ユーザーが何をしているのかを知っていると想定します。そうしないと、どこでもキャストを行うたびに警告が表示されます。

于 2012-11-22T07:58:34.130 に答える