2016-10-10 2 views
-2

Ich ziehe diese Warnung lieber als Verschrauben Bereitstellung einer falschen Konvertierung. In dieser Zeile XCode8 (swift3, iOS10) C-Datei:Implizite Konvertierung lösen verliert Ganzzahlgenauigkeit Zielwarnung in iOS

SHA1Update(&theSHA1Context, (size_t)inText, inTextLength); 
//void SHA1Update(SHA1_CTX* context, u_int8_t* data, unsigned int len) 

ich diese Warnung bin immer

"Implicit conversion loses integer precision: 'size_t' to 'u_int32_t' (aka 'unsigned_int') 

Ich bin kein Experte auf diesem Gebiet, so dass ich ziemlich versierte Beratung nehmen, was ist der beste Weg, um XCode zu erfüllen und diese Warnung zu entfernen?

+0

Verwenden Abgüsse nicht, wenn Sie alle Auswirkungen kennen und akzeptieren! Sagte das: Was ist die Signatur von 'SHA1Update'? – Olaf

+0

Was ist eine Swift 3 .c-Datei? Swift und C sind verschiedene Sprachen. –

+0

Offensichtlich ja. Allerdings beschwert sich XCode je nach der Swift-Einstellung des Projekts auf andere Weise, selbst wenn es Objective C- oder C-Code enthält. Ich würde dich migrieren, du würdest dir dessen bewusst sein. @MartinR – Josh

Antwort

0

Wenn die Variablennamen sind alles durch zu gehen, das war falsch Besetzung:

SHA1Update(&theSHA1Context, inText, inTextLength); 
+0

Hallo, Deklaration aktualisiert oben ... – Josh

+0

@Josh OK, ich denke, Sie können überhaupt keine Güsse wegkommen. – Droppy

+1

Wenn Sie nicht mit keinen Umsetzungen entkommen können, um die Warnung zu vermeiden, sieht es so aus, als müssten Sie '(unsigned int) inTextLength' verwenden. –

0

2 Fragen

  1. Das Längenfeld unsigned, erwartet wird, dass die size_t schmaler als ist auf Ihrer Plattform - daher die Warnung. Um einen Wert einzugrenzen, verwenden Sie einen Cast und beruhigen Sie die Warnung. Casting kann jedoch katastrophale Probleme verursachen, wenn das Ziel nicht darstellbar ist. Schlage einen Test vor.

    //void SHA1Update(SHA1_CTX* context, u_int8_t* data, unsigned int len) 
    //        narrowing -----v 
    // SHA1Update(&theSHA1Context, (size_t)inText, inTextLength); 
    
    size_t inTextLength; 
    assert(inTextLength <= UINT_MAX); 
    SHA1Update(&theSHA1Context, (size_t)inText, (unsigned) inTextLength); 
    
  2. Das Gehäuse des Puffers inText ist sicher ein Fehler auf. Entfernen Sie es.

    SHA1Update(&theSHA1Context, inText, (unsigned) inTextLength); 
    
0

Nach Vorschläge versuchen, zufrieden ändert dies den Compiler und OAuth weiterhin richtig funktioniert:

//old code: 
    //SHA1Update(&theSHA1Context, (u_int8_t *)inText, inTextLength); 

    //new code: 
    SHA1Update(&theSHA1Context, (unsigned char *)inText, (unsigned int)inTextLength);