2016-11-17 10 views
0

何かがキャッチされたときにアドレスサニタイザーを中止します。私はそれがデフォルトでそれを行うように設計されていると思ったが、それは私のために働いていないようだ。私はまた、効果がなかったASAN_OPTIONS=halt_on_error=1を試しました。ここでは詳細は以下のとおりです。私たちに取り組むプロジェクトでgcc ASANは実行時のエラーと考えて停止しません

は、アドレス消毒剤を使用し、それを実現する誰もせずに数週間のためにこの警告/エラーを発した:

runtime error: null pointer passed as argument xx, which is declared to never be null

そうでないランタイムエラーと呼ばれているにもかかわらず、プログラムを停止するか、不正な終了コードが発生する可能性があります。ここではそれを実証するための簡単なプログラムです:

/* 
gcc -fsanitize=address,undefined \ 
    -Wformat \ 
    -Werror=format-security \ 
    -Werror=array-bounds \ 
    -g -o xasan xasan.c 
*/ 

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(int argc, char *argv[]) { 
    fprintf(stderr, "before\n"); 
    memcpy(NULL, argc > 1 ? "" : NULL, argc > 1 ? 1 : 0); 
    fprintf(stderr, "after\n"); 
    return 0; 
} 

ARGCのトリックは、基本的には、私たちのコードでは、実行時エラー/警告が発生しmemcpy(dst, NULL, 0)として終わる、gccはmemcpyの呼び出しを最適化していないだけでそうです。

私は、 'after'は実行時エラーの後に出力されないだろうと思っていますが、プログラムの終了コードは0です。これはバグですか?マニュアルは、それが停止するはずだと言います。

答えて

0

このエラーはUBSANからのものです。その答えは、hereのようにコンパイラスイッチ-fno-sanitize-recoverを使用することです。

1

再コンパイルしない場合は、UBSAN_OPTIONS = halt_on_error = 1で実行することもできます。

関連する問題