iOS: CGImageCreateWith [PNG lub JPEG] DataProvider powoduje błąd segmentacji

Stoję przed dziwnym problemem. Opracowuję narzędzie do skanowania kodów kreskowych wiersza poleceń systemu iOS przy użyciu libzbar (tak, to jest dla urządzeń jailbreak). Wszystko idzie dobrze, chyba że próbuję użyćCGImageCreateWithPNGDataProvider() lubCGImageCreateWithJPEGDataProvider() metody uzyskaniaCGImageRef z pliku - ponieważ te dwie funkcje powodują segfault na moim iPadzie 5.1.1. Problem nie dotyczy mojej klasy niestandardowej,ZBarScanner, ponieważ jeśli użyję UIImage do uzyskania danych obrazu, używając czegoś takiego

UIImage *uiImage = [UIImage imageWithContentsOfFile:fname];
CGImageRef image = uiImage.CGImage;

wtedy działa dobrze i drukuje dane zapisane w kodzie kreskowym. Ponadto obrazy PNG i JPEG są dobrze sformatowane - mogę je przeglądać za pomocą przeglądarki plików na samym urządzeniu, a także wypróbowałem kilka innych obrazów. Próbowałem nawet pominąć wszystkieCFRelease() wywołania funkcji irelease wiadomości w celu uniknięcia zwisających wskaźników. Oto mój kod:

#define LOG() NSLog(@"Reached line %d", __LINE__)

int main(int argc, char **argv)
{
    if (argc != 2)
            return 1;

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    LOG(); // line 21

    NSString *fname = [[NSString stringWithUTF8String:argv[1]] retain]; // added an extra retain just in case

    LOG(); // line 25

    CFDataRef data = (CFDataRef)[NSData dataWithContentsOfFile:fname];
    CGDataProviderRef dProv = CGDataProviderCreateWithCFData(data);
    // I also tried using
    // dProv = CGDataProviderCreateWithFilename(argv[1]);
    // that made no difference either. The data and data provider are
    // valid, but the CGImage constructors always segfault.
    if (dProv == NULL) {
        fprintf(stderr, "Invalid CGDataProvider\n");
        abort();
    }

    LOG(); // line 34

    CGImageRef image = NULL;

    if ([[fname pathExtension] isEqualToString:@"png"]) {
        LOG(); // line 39
        NSLog(@"Function pointer: %p", CGImageCreateWithPNGDataProvider);
        image = CGImageCreateWithPNGDataProvider(dProv, NULL, false, kCGRenderingIntentDefault); // This function segfaults, or...
        LOG();
    } else if ([[fname pathExtension] isEqualToString:@"jpg"]
        || [[fname pathExtension] isEqualToString:@"jpeg"]) {
        LOG();
        image = CGImageCreateWithJPEGDataProvider(dProv, NULL, true, kCGRenderingIntentDefault); // ... or this one.
        LOG();
    } else {
        fprintf(stderr, "File '%s' is neither a PNG nor a JPEG file!\n", argv[1]);
        LOG();
        abort();
    }

    LOG();
    // CFRelease(dProv);
    LOG();
    ZBarScanner *scanner = [ZBarScanner zbarScannerWithCGImage:image];
    // CFRelease(image);
    LOG();
    NSArray *arr = [scanner scan];
    NSLog(@"The result of the scanning is:\n%@", arr);
    LOG();
    [pool drain];

    return 0;
}

Jeśli uruchomię go w debuggerze (GDB i NSLog clutter usunięty dla większej przejrzystości):

gdb ./scanner
(gdb) run ./barcode1.png
Reached line 21
Reached line 25
Reached line 34
Reached line 39
Function pointer: 0x37c5b535

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x00000000
0x00000000 in ?? ()
(gdb) backtrace
#0 0x00000000 in ?? ()
(gdb)

Więc nawet śledzenie nie pokazuje niczego oczywiście złego / pomocnego ... Wydaje się, że takcoś jest NULLgdzieś. Podejrzewałem nawet, że ze względu na to, że mój toolchain jest nieoficjalną kompilacją opartą na wersji 4.0, funkcje te mogą nie być dostępne w systemie iOS 5.1.1, więc kompilacja kończy się powodzeniemCGImageCreateWith[...]DataProvider symbole są wewnątrzrozwój sysroot, ale nie wśród iOSrzeczywisty dynamiczne biblioteki, ale gdyby tak było, byłby to wskaźnik funkcji I NSLogged outNULL, dobrze? Jednak żaden z obiektów NS i CG ani funkcje nie wydają się być NULL - jedynym przekazywanym NULL do konstruktorów CGImage jestdecodeArray parametr, ale jest wyraźnie wymieniony w dokumentacji Apple, że może być NULL ... (Aktualizacja: Próbowałem przekazać poprawną tablicę bez wartości NULL, aby dowiedzieć się, czy dokumentacja jest błędna, ale nadal mam ten sam błąd).

Czy mógłbyś podać mi jakieś wskazówki (gra słów przeznaczonych) na temat tej awarii? Czego mi tu brakuje? Wszystkie tutoriale i referencje, które do tej pory znalazłem, sugerują użycie CGDataProvider i CGImage w ten sposób.

questionAnswers(1)

yourAnswerToTheQuestion