簡體   English   中英

為什么ulimit -v不能在clang的地址清潔劑下工作?

[英]why does ulimit -v not work under clang's address sanitizer?

我正在使用libFuzzer來模糊API。
API正在反序列化一個位數組(由libFuzzer提供)
並將它們轉換為c ++類實例化。

由於序列化格式,libFuzer能夠構造一個序列化對象,告訴解串器保留大量數據(無法滿足)。
這是通過調用std::vector::resize() 向量拋出std::bad_alloc ,雖然捕獲並安全地減輕了問題,但它會導致模糊器出現極端延遲(如以下 OOM問題文檔中所述)。

為了降低運行模糊器時使用的內存量,我希望設置ulimit -v並調整進程的可用虛擬內存。 但這樣做會導致

==27609==ERROR: AddressSanitizer failed to allocate 0xdfff0001000 (15392894357504) bytes at address 2008fff7000 (errno: 12)
==27609==ReserveShadowMemoryRange failed while trying to map 0xdfff0001000 bytes. Perhaps you're using ulimit -v

為什么地址消毒劑不能在ulmit -v下工作?
我希望它可以,然后我可以更有效地模糊。

其他信息:
我的構建標志是:

copts = [
    "-fsanitize=address,fuzzer",
    "-fsanitize-trap=undefined,integer",
    "-fsanitize-coverage=trace-pc,trace-cmp,trace-pc-guard",
    "-g",
    "-O0",
    "-fno-omit-frame-pointer",
    "-fno-sanitize=vptr",
],
linkopts = [
    "-fsanitize=address,fuzzer",
    "-fsanitize-trap=undefined,integer",
    "-fno-sanitize=vptr",
    "-fsanitize-link-c++-runtime",
],

我嘗試關閉標志,所以我可以設置ulimit並運行模糊器:

copts = [
    "-fsanitize=fuzzer",
    "-g",
    "-O0",
    "-fno-omit-frame-pointer",
],
linkopts = [
    "-fsanitize=fuzzer",
],

但這會導致立即發生段錯誤。

Asan在啟動時為影子存儲器保留1/8的進程地址空間,以保存用戶數據的狀態(已分配,釋放等)。 這是設計上的,沒有什么可以做的。

請注意,您通常不關心虛擬內存,而是關注虛擬內存(在您的情況下也會導致new內存失敗)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM