1

ディレクトリを作成し、ユーザーが所有するように強制する関数を記述します。

int mkdir_and_force_owner( const char *path, uid_t uid, gid_t gid )
{
    /* deref_ptr_in_call: Dereferencing pointer "path" */
    if( mkdir( path, S_IRWXU ) < 0 ) {
        if( errno != EEXIST ) {
            lfprintf( stderr, _("Cannot create %s: %s\n"), path, strerror( errno ) );
        } else {
            DIR *temp_dir = opendir( path );
            /* check_after_deref: Null-checking "path" suggests that it may be null, but it has already been dereferenced on all paths leading to the check */
            if( !path ) {
                lfprintf( stderr, _("Cannot open %s: %s\n"), path, strerror( errno ) );
            } else {
                closedir( temp_dir );
                return 1;
            }
            closedir( temp_dir );
        }
    } else {
        if( chown( path, uid, gid ) < 0 ) {
            lfprintf( stderr, _("Cannot change owner of %s: %s.\n"), path, strerror( errno ) );
        } else {
            return 1;
        }
    }

    return 0;
}

しかし、このコードは次の警告を受け取ります:

Null チェック「パス」は、それが null である可能性があることを示唆していますが、チェックにつながるすべてのパスで既に逆参照されています。この問題を解決するために同じヘルプが必要です ありがとう

4

1 に答える 1

5

「開くことができません」というメッセージを stderr に出力する行で、コンパイラは親切にも、定義上、lfprintf に NULL 文字列ポインタを渡そうとしていることを認識しています。if (!path) {}ブロックに囲まれているので。と言うつもりでしたif (!temp_dir)か?

于 2013-11-06T19:57:53.587 に答える