Zstd: ZSTD sur iOS - alignement sur 32 bits requis?

Créé le 26 juin 2018  ·  3Commentaires  ·  Source: facebook/zstd

salut

Tout d'abord, merci pour ZSTD!

J'ai recherché un crasher dans mon application iOS qui exploite ZSTD 1.3.4, et j'obtiens parfois un crash dans MEM_write32 lors de la compression avec un contexte sans dictionnaire:

    NSData* metadata = (snip)
    const size_t expectedCompressionSize = ZSTD_compressBound(metadata.length);

    UInt8* compressionBuffer = malloc(expectedCompressionSize);

    size_t const compressedSize = ZSTD_compressCCtx(compressionContext, compressionBuffer, expectedCompressionSize, metadata.bytes, (size_t) metadata.length, 1);

    // Hit error on compression use ZSTD_getErrorName for error reporting eventually.
    if(ZSTD_isError(compressedSize))
    {
        free(compressionBuffer);
        return nil;
    }

    NSData* zstdCompressedData = [[NSData alloc] initWithBytesNoCopy:compressionBuffer length:compressedSize freeWhenDone:YES];

Existe-t-il des exigences d'alignement ou des nuances pour le déploiement sur iOS / Arm? J'ai remarqué quelques align = 32 dans les fichiers make mais je n'ai rien vu de spécifique dans la documentation pour iOS. Y a-t-il des alignements de clangs spécifiques?

Y a-t-il des nuances avec l'utilisation d'un ZSTD_compressCCtx dans une file d'attente de distribution série (pas un seul thread, mais un appel sérialisé garanti d'une instance de contexte qui peut être utilisée sur quelques threads système mais jamais simultanée)?

Merci pour toute information!

question

Tous les 3 commentaires

MEM_write32() est censé fonctionner avec n'importe quelle cible, y compris celles nécessitant des alignements stricts.
Il peut y avoir des subtilités avec certains appareils peu courants à faible consommation, mais pour ceux sous iOS, je ne m'attends à aucun problème. En outre, la plupart des appareils iOS modernes utilisent un dérivé ARM 64 bits, capable de lire / écrire sur des adresses non alignées, comme un processeur x86 de bureau.
Je serais donc très surpris si l'alignement était un problème dans ce cas.

Une autre possibilité est que MEM_write32() écrit à une adresse non autorisée.
La raison pour laquelle cela se produirait n'est pas claire.
ZSTD_compressCCtx() est censé être sûr contre les débordements de tampon.

Vous mentionnez également travailler dans un environnement multi-thread.
Un contexte donné ne doit être utilisé que par un thread à la fois.
Il peut changer de fil. Mais ce qui est vraiment important, c'est qu'aucun thread ne doit l'utiliser en même temps.
Je comprends que votre implémentation est censée prendre en charge cette condition.
Mais j'inviterais à regarder à nouveau.
Parfois, il peut être assez difficile de garantir une telle condition, en fonction des détails de mise en œuvre.

Je recommanderais une exécution de votre application en utilisant un désinfectant de fil. Il devrait être en mesure de signaler toute mauvaise utilisation, le cas échéant.

Merci @ Cyan4973 pour les clarifications pour l'alignement et le filetage WRT pour accéder à un contexte de compression ZSTD. Je crois que je suis la règle que vous mentionnez (c'est sûr pour un accès strictement série à travers divers threads, mais absolument pas sûr pour un accès simultané). Je sais aussi à quel point il peut être vraiment difficile de garantir que c'est le cas :) dispatch_async via Apples libDispatch / Grand Central Dispatch devrait permettre une stricte adhérence, mais peut-être que je ne suis pas aussi habile que j'aime le penser :)

N'hésitez pas à fermer ce problème car c'est une question plutôt qu'un bogue, et vous avez clarifié. Si je trouve un comportement de crash spécifique que je peux isoler ou qui pose une question supplémentaire, je soumettrai un nouveau «bogue».

J'apprécie la réponse approfondie. Merci!

Votre intuition est totalement morte et le filetage est délicat. Merci pour le coup de pied dans le cul à triple check.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

rgdoliveira picture rgdoliveira  ·  3Commentaires

pjebs picture pjebs  ·  3Commentaires

icebluey picture icebluey  ·  3Commentaires

animalize picture animalize  ·  3Commentaires

g666gle picture g666gle  ·  3Commentaires