2

アドレスサニタイザーが何かをキャッチしたときに中止したいと思います。デフォルトでそれを行うように設計されていると思いましたが、うまくいかないようです。効果のないものも試しASAN_OPTIONS=halt_on_error=1ました。詳細は次のとおりです。

私が取り組んでいるプロジェクトでは、アドレスサニタイザーを使用していますが、誰も気付かないうちにこの警告/エラーが数週間発生しました。

実行時エラー: null ポインターが引数 xx として渡されましたが、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 のトリックは、gcc が memcpy 呼び出しを最適化しないようにするためのものです。基本的に、私たちのコードでmemcpy(dst, NULL, 0)は、実行時エラー/警告の原因となります。

実行時エラーの後に「after」が出力されないことを期待しますが、出力され、プログラムの終了コードは 0 です。これはバグですか? 説明書には止めてくださいと書いてあります。

4

2 に答える 2

5

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

于 2016-11-26T08:51:17.487 に答える
2

判明したエラーは UBSAN によるものであり、答えはここ-fno-sanitize-recoverに見られるようにコンパイラ スイッチを使用することです。

于 2016-11-17T03:05:17.643 に答える