AddressSanitizer leetcodeエラーレポートまとめ

1542 ワード

概要


Address Sanitizer(ASan)は、高速メモリエラー検出ツールです.非常に速く、プログラムの2倍程度しか遅延しません(Valgrindよりずっと速いです).コンパイラinstrumentationモジュールとmalloc()/free()の代替を提供するランタイムライブラリが含まれます.gcc 4.8からAddressSanitizerはgccの一部となる.もちろん、より良い体験を得るには、gcc 4.8のAddressSanitizerがまだ完備していないため、4.9以上のバージョンを使用することが望ましい.最大の欠点は記号情報がないことだ.

エラーのタイプ

  • (heap) use after free
  • heap buffer overflowスタックキャッシュアクセスオーバーフロー
  • stack buffer overflowスタックキャッシュアクセスオーバーフロー
  • global buffer overflowグローバルバッファアクセスオーバーフロー
  • use after returnが戻ると
  • が使用されます.
  • use after scope
  • initializations order bugs
  • memory leaksメモリ漏洩
  • インスタンスの共有


    これはポインタの運用エラーによるheap-usr-after-freeのエラーです

    疑問


    しかし、私はやはり新聞の間違いに少し理解していません.私がleetcodeをしてチェーンテーブルの最後からN番目の要素を削除する時、次のコードを書いて通過しました
    class Solution {
    public:
        ListNode* removeNthFromEnd(ListNode* head, int n) {
          ListNode *part = new ListNode(NULL);
          ListNode *p = part,*q = part;
            part->next = head;
            for(int i = 0;inext;
            // 
            while(q->next)
            {
                p = p->next;
                q = q->next;
            }
            // 
            ListNode *j = p->next;
            p->next = j->next;
            delete j;
            return part->next;
        }
    };
    
    return part->nextのみをreturn headに変更すると、heap-usr-after-freeとエラーが発生します.headに戻るとチェーンテーブルのヘッダノードが削除されるべきだと知っていますが、最後にdelete partが追加されても同様にエラーが報告されるので疑問です.もし誰かが知っていたらコメントエリアで一緒に議論してほしい!