6

次のような注釈を探しています

-(SomeStruct *) structFromInternals __attribute__((returns_malloced_ptr))
{
    SomeStruct *ret = malloc(sizeof(SomeStruct));
    //do stuff
    return ret;
}

クラング静的アナライザー獣をなだめるために。私が見つけることができる唯一の実行可能な属性リンクはGCC 用ns_returns_retainedですが、拡張機能にあるも含まれていないと思います。

編集:

これが必要な理由については、単純なケースでは再現できないというシナリオがあるため、Objective-C プロジェクトの ac lib に関係している可能性があります...要点は、静的アナライザーの警告が表示されることです。 createStruct の malloc がリークしていること:

typedef struct{
    void * data;
    size_t len;
}MyStruct;

void destroyStruct(MyStruct * s)
{
    if (s && s->data) {
        free(s->data);
    }
    if (s) {
        free(s);
    }
}
MyStruct * createStructNoCopy(size_t len, void * data)
{
    MyStruct * retStruct = malloc(sizeof(MyStruct));
    retStruct->len = len;
    retStruct->data = data;
    return retStruct;
}
MyStruct * createStruct(size_t len, void * data)
{
    char * tmpData = malloc(len);
    memcpy(tmpData, data, len);
    return createStructNoCopy(len, tmpData);
}
MyStruct * copyStruct(MyStruct * s)
{
    return createStruct(s->len, s->data);
}
4

1 に答える 1

6

関数注釈は、Clang 静的アナライザーに、関数が、ある時点でownership_returns(malloc)渡される必要があるポインター(または を含む関数) を返すことを伝えます。例えば:free()ownership_takes(malloc, ...)

void __attribute((ownership_returns(malloc))) *my_malloc(size_t);
void __attribute((ownership_takes(malloc, 1))) my_free(void *);
...
void af1() {
    int *p = my_malloc(1);
    return; // expected-warning{{Potential leak of memory pointed to by}}
}
void af2() {
    int *p = my_malloc(1);
    my_free(p);
    return; // no-warning
}

(その他の使用例については、malloc-annotations.cテスト ファイルを参照してください。)

現時点では、これらの注釈はalpha.unix.MallocWithAnnotationsチェッカーの実行時にのみ有効になります (デフォルトでは実行されません)。Xcode を使用している場合は-Xclang -analyzer-checker=alpha.unix.MallocWithAnnotations、ビルド フラグに追加する必要があります。

于 2013-04-29T23:44:18.387 に答える