2016-11-17 88 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訣竅就是讓GCC不優化出的memcpy調用,基本上我們的代碼它結束了作爲memcpy(dst, NULL, 0)這將導致運行時錯誤/警告。

我會期望'後'將不會在運行時錯誤後輸出,但它是和程序退出代碼是0.這是一個錯誤?手冊說它應該停止。

回答

0

事實證明這個錯誤是來自UBSAN,答案是使用編譯器開關-fno-sanitize-recover,如所見here

1

如果您不想重新編譯,也可以使用UBSAN_OPTIONS = halt_on_error = 1運行。