長さ> 2Gの場合、ライオンは読むことができません

Since Macosx Lion fread does not read file with length > 2G (int size, 2'147'483'648 bytes). It worked for years with macosx snow leopard.

私はそれをテストするプログラムを書いた:

#include 
#include 
#include 

int main(int argc, char *argv[])
{
FILE   *fin = NULL, *fout = NULL;
char   *ptr = NULL;
size_t len;
fpos_t flen;

if (!(fin = fopen(argv[1], "rb")))
{
    printf("The input file: %s could not be opened\n", argv[1]);
    return -1;
}
if ((fout = fopen(argv[2], "rb")))
{
    printf("The output file %s already exist\n", argv[2]);
    fclose(fin);
    return -1;
}
if (!(fout = fopen(argv[2],"wb")))
{
    printf("Cannot write on output file %s\n", argv[2]);
    fclose(fin);
    return -1;
}

fseek(fin, 0, SEEK_END);
fgetpos(fin, &flen);
len = flen;
printf("Input file length : %zd\n", len);
fseek(fin, 0, SEEK_SET);

if (!(ptr = malloc(len))) 
{
    printf("Canot allocate %zd bytes\n", len);
    fclose(fin);
    fclose(fout);
    return -1;
}
if (fread(ptr, sizeof(char), len, fin) != len)
{
    printf("Cannot read file\n");
    fclose(fin);
    fclose(fout);
    free(ptr);
    return -1;
}
fclose(fin);
if (fwrite(ptr, sizeof(char), len, fout) != len) 
{
    printf("Cannot write file\n");
    fclose(fout);
    free(ptr);
    return -1;
}
free(ptr);
fclose(fout);

return 1;
}

とにかく走れ :

  • ./ pgm inputfile outputfile
  • openssl sha inputfile
  • openssl sha出力ファイル

エラーはありません。 2つのファイルの長さは同じです。 2つの指紋は同じではありません。 (ポインタは十分に割り当てられ、出力ファイルに書き込まれます) 唯一のフリーダムではなく、fwriteである。

私は問題を理解していない。

I just see this program (i don't know if apple use this one on Lion) and r variable is defined as int. http://www.opensource.apple.com/source/Libc/Libc-186/stdio.subproj/fread.c

回答ありがとう

3
OSX 32ビットまたは64ビットですか? 32ビットであれば、2GB以上のデータを読み込むことはできませんし、メモリー内に大きなオブジェクトを作成することもできます。
追加された 著者 R..,

3 答え

MacOS X Lion(10.7.2)とXCode 4.2でうまく動作します。実行ファイルは64ビットプログラムです。あなたもあなたのことを確認してください。

$ make 2gb
/usr/bin/gcc -g -std=c99 -Wall -Wextra 2gb.c -o 2gb
2gb.c:5: warning: unused parameter ‘argc’
$ file 2gb
2gb: Mach-O 64-bit executable x86_64
$ dd if=/dev/zero of=input bs=1m count=3072
./2g3072+0 records in
3072+0 records out
3221225472 bytes transferred in 42.940363 secs (75016261 bytes/sec)
$ ls -l input
./2gb -rw-r--r--  1 jleffler  staff  3221225472 Oct 29 00:48 input
$ ./2gb input output
Input file length : 3221225472
$ openssl sha input
SHA(input)= c93bf6713a90e34554311f0a9e43cfd1f153475a
$ openssl sha output
SHA(output)= c93bf6713a90e34554311f0a9e43cfd1f153475a
$ ls -l input output
-rw-r--r--  1 jleffler  staff  3221225472 Oct 29 00:48 input
-rw-r--r--  1 jleffler  staff  3221225472 Oct 29 00:49 output
$ rm input output
$ /usr/bin/gcc --version
i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$

そして、32ビットコンパイルを余儀なくされると、

$ rm 2gb
$ make CC='/usr/bin/gcc -m32' 2gb
/usr/bin/gcc -m32 -g -std=c99 -Wall -Wextra 2gb.c -o 2gb
2gb.c:5: warning: unused parameter ‘argc’
$ dd if=/dev/zero of=input bs=1m count=3072
3072+0 records in
3072+0 records out
3221225472 bytes transferred in 38.326753 secs (84046397 bytes/sec)
$ ./2gb input output
Input file length : 0
$ ls -l input
-rw-r--r--  1 jleffler  staff  3221225472 Oct 29 00:57 input
$ 
1
追加された
/dev/zero はここでテストファイルを作成するのに悪い選択でした。非常に大きな malloc 呼び出しはカーネルからゼロページを引き出すので、 fread が壊れていれば、ゼロのメモリ空間に対してゼロのファイルをテストします。
追加された 著者 Zan Lynx,

あなたが64ビットモードでコンパイルしていないように聞こえます。コマンドライン引数、または使用しているコンパイラのオプションを探します。あなたが正しいモードでコンパイルしていることを確認するには、 printf( "%d \ n"、sizeof(int));

1
追加された

printf("%d\n", sizeof(int)); gcc -Wall Typ.c -o Typ warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘long unsigned int’ warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘long --> 4

ありがとうジョナサン。

私は10.7.2とxcode 4.2です

gcc --version i686-apple-darwin11-llvm-gcc-4.2(GCC)4.2.1(Apple Inc.ビルド5658ベース)(LLVMビルド2336.1.00)

私はgcc TestFile.c -o TestFile.oをやる あなたがしたのとまったく同じです: / usr/bin/gcc -g -std = c99 -Wall -Wextra 2gb.c -o 2gb と私は後に-m64を追加

私は再び2種類の指紋を持っています。

sudo/Library/uninstall-devtoolsを使用してxcode 3.6.2を削除しました--mode = all xcode 4.2以降のインストール

私は、新たに作成された別のユーザ(おそらく$ pathの原因)と同じものでpgmを実行します。

私は理解していない。


このバグを報告した後のAppleチームの回答

こんにちはステファン、

これは、バグID#10376104までのフォローアップです。詳細な調査の後、これは現在、エンジニアリングによって調査されている既知の問題であることが判明しています。この問題は、オリジナルのバグID#6434977でバグデータベースに記録されています。この重複した問題を追跡するために使用されている元のバグ番号は、バグレポートの[問題の詳細]ビューの[関連する問題]セクションにあります。

このバグレポートを提出していただきありがとうございます。バグの発見と隔離にご協力いただきありがとうございます。

宜しくお願いします、

開発者バグ報告チーム アップルワールドワイドデベロッパーリレーションズ

0
追加された
私は新しいパーティションを作成し、Lionをインストールし、Lionを更新し(10.7.2)、Xcodeをインストールします(4.2)。それと同じ問題が再び発生します。 (信じられないほど)...だから私はAppleにバグを送るつもりです。私のマシンはmacpro 6 core 2010年9月です。
追加された 著者 Stephane,
このバグを報告した後のAppleチームの回答 - 上記のテキストを参照してください(556文字以上)
追加された 著者 Stephane,
その固定!はい、彼らはそれをやった!それはちょうど2年以上かかるが、この問題は今解決されている。(最後のマーベリックスで)
追加された 著者 Stephane,