mallocから初期化されていないメモリへ

1653 ワード

最近の開発過程でmallocからメモリを初期化していないエラーが発見された.
CLISH(コマンドラインオープンソースソフトウェア)を使用する場合、このプログラムが終了するたびにcore dumpが発生し、invalid pointer:0 x 0007 ffff 02 b 35 d 8とエラーが発生する.
しかし、このエラーは、ある機器でのみエラーが発生する、全く同じ構成(ソフト・ハードウェア)の別の機器ではエラーは発生せず、clishがロードしたxmlファイルを調整すると、このエラーも消える.
gdbデバッグによりcoreがfreeのptypeで発生していることが判明しました.tポインタの場合に発生するエラーであり、そのポインタアドレスは不正なアドレスであり、このポインタが指す構造は参照を宣言しているが、定義のタイプ(PTYPE)は宣言していない.
この参照の定義を宣言すると、エラーは消えます.
デバッグ中に最後のfreeの前にNULLにポインタを向けるとcoreは発生しません.
このタイプを最初に初期化すると、後で多くのコードがこの構造のポインタを変更する機会があり、すべてのコードを探して分析することはできません.
最後に初期化に目を向ける
 
clish_ptype_t *
clish_ptype_new(const char              *name,
                const char              *help,
                const char              *pattern,
                clish_ptype_method_e     method,
                clish_ptype_preprocess_e preprocess)
{
    clish_ptype_t *this = malloc(sizeof(clish_ptype_t));
    memset(this, 0, sizeof(clish_ptype_t)); //      

    if(NULL != this)
    {
        clish_ptype_init(this,name,help,pattern,method,preprocess);
    }
    return this;
}

 
 
この関数は初期化後、initを行い、ポインタが指すアドレスを塗りつぶすが、このタイプは定義されていないため、一部のコンテンツは塗りつぶされず、mallocのアドレスがまた初期化されていないアドレスであると、中のコンテンツはアドレスとして最後尾freeの時に解放され、このアドレスは不正であるため、最後のinvalid pointerエラーが発生する.
 
このエラーは実は構成エラーで、xmlで参照されるすべてのタイプは定義されるべきで、定義されたタイプはcoredumpが発生しません.
別の角度から言えば、このエラーもmallocメモリの後に初期化が行われていないため、後のinitメソッドが正しく初期化することを完全に信頼しているため、これもclishのバグであり、mallocの後に必ず初期化を行うが、このエラーの発生は絶対的ではない.
すべての申請のメモリを初期化することを提案した以上、なぜこの標準api万年は変わらないのでしょうか.
もう一つの問題は、このメモリの解放はプログラムの終了のタイミングで発生しますが、プログラムの終了後、すべてのメモリがオペレーティングシステムに返されます.このメモリの解放は蛇足ではありませんか.