ollvmコンパイラ最適化バグ
最近ollvmでいくつかのコードをコンパイルして、主にsoに対していくつかの混同する操作を行う必要があって、1つのバグを発見して、以下のように記録します:コードセグメント1
上のコードセグメントは、スレッドの作成に失敗した場合、アプリケーションを直接終了するスレッドを作成するロジックです.このコードはandroid ndkのデフォルトのコンパイラやollvmコンパイラを使用せず、実行結果はコードロジックに従います.ただし、コードセグメント2の場合、次のようになります.
このコードは上のコードと比較してreturn 0が1つ少なくなった.この文のこの時、2つのコンパイラはコンパイルの結果に違いがあり、android ndkのデフォルトのコンパイラがコンパイルしたコードは依然としてコードロジックに従って実行することができます.ollvmコンパイラがコンパイルしたコードはretが0に最適化され、スレッドの作成に成功したが、プロセスもexit(1)を実行する.脱退した
このようなbad codeを防ぐ方法はAndroidではありません.mkは次の行に参加します.LOCAL_CFLAGS+=-Werror強化検査タイプ、warningとerrorが現れるのと同じ処理
jint begin_antidebug()
{
pthread_t antidebugtid;
int ret = 0;
ret = pthread_create(&antidebugtid, NULL, antidebug_listen_thread, NULL);
if(ret!=0)
{
LOGANTI("Create pthread error!
");
exit (1);
}
return 0;
}
上のコードセグメントは、スレッドの作成に失敗した場合、アプリケーションを直接終了するスレッドを作成するロジックです.このコードはandroid ndkのデフォルトのコンパイラやollvmコンパイラを使用せず、実行結果はコードロジックに従います.ただし、コードセグメント2の場合、次のようになります.
jint begin_antidebug()
{
pthread_t antidebugtid;
int ret = 0;
ret = pthread_create(&antidebugtid, NULL, antidebug_listen_thread, NULL);
if(ret!=0)
{
LOGANTI("Create pthread error!
");
exit (1);
}
}
このコードは上のコードと比較してreturn 0が1つ少なくなった.この文のこの時、2つのコンパイラはコンパイルの結果に違いがあり、android ndkのデフォルトのコンパイラがコンパイルしたコードは依然としてコードロジックに従って実行することができます.ollvmコンパイラがコンパイルしたコードはretが0に最適化され、スレッドの作成に成功したが、プロセスもexit(1)を実行する.脱退した
このようなbad codeを防ぐ方法はAndroidではありません.mkは次の行に参加します.LOCAL_CFLAGS+=-Werror強化検査タイプ、warningとerrorが現れるのと同じ処理