xor'ing αξία float & γενική ερώτηση καστ όσον αφορά την παραγωγή compiler




Λοιπόν, οι δύο ερωτήματα ενδιαφερομένων για την κατάρτιση εξόδου μου, καθώς προσπαθώ να αφαιρέσετε όλες τις προειδοποιήσεις ..


Για το **πρώτο ερώτημα** :   

Είμαι xor'ing τιμές float, έξοδος compiler:
`warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]`



```
inline float ClassXY::GetFloat(void) const
{
    uint32_t xored = *(uint32_t*)&m_pParent->m_Value.m_fValue ^ (uint32_t)this; // compiler warning for this line
    return *(float*)&xored;
}

```

m\_pParent είναι ένας δείκτης για αυτή την κατηγορία `ClassXY *m_pParent;`  

m\_Value είναι μια var ενός struct και m\_fValue ορίζεται ως πλωτήρας μέσα στο struct. 


Οποιαδήποτε ιδέα για το πώς να πάρει γύρω από την προειδοποίηση; (Ξέρω ότι μπορώ να απενεργοποιήσετε την προειδοποίηση, αλλά δεν έχω ιδέα για να πάρετε μια καθαρή λύση σε αυτό)


Μου **δεύτερο qustion** θα είναι:   

Το σενάριο είναι σχεδόν το ίδιο όμως, μόνο με int. Compiler μιλάει για την απώλεια των πληροφοριών: `warning: cast from ‘const ClassXY*’ to ‘uint32_t {aka unsigned int}’ loses precision [-fpermissive]`  

Χωρίς το -fpermissive σημαία compiler, δεν θα είναι σε θέση να συγκεντρώσει ..



```
inline int ClassXY::GetInt(void) const
{
    return (int)(m_pParent->m_Value.m_nValue ^ (int)this); // compiler warning for this line
}

```

Και πάλι, καμία ιδέα για το πώς να το διορθώσω αυτό;   

Ή μήπως είναι inpossible χωρίς προειδοποίηση, αυτό που προσπαθώ να επιτύχει; 


Για να σας δώσει όλες μια ιδέα περί τίνος πρόκειται:
 `auto example = g_pClassXY->FindVar(example_var);`  

Τότε: `float float_val = example->fValue; // direct access, value is wrong`  

Για να πάρετε τη σωστή τιμή, η σωστή προσέγγιση θα ήταν:`float float_val = example->GetFloat();`


Ευχαριστώ εκ των προτέρων!
Για να αποφευχθεί μια αυστηρή παραβίαση aliasing, ο κώδικας θα μπορούσε να είναι:



```
static_assert( sizeof(float) <= sizeof(uint32_t), "size problem" );
uint32_t xored{};
memcpy(&xored, &m_pParent->m_Value.m_fValue, sizeof xored);
xored ^= reinterpret_cast<uint32_t>(this);

float ret;
memcpy(&ret, &xored, sizeof ret);
return ret;

```

Ωστόσο, υπάρχουν ακόμα μερικά ζητήματα:


* Ο κωδικός είναι άρρωστος-σχηματίζεται σε ένα σύστημα όπου `this`είναι ένας δείκτης 64-bit.
* Οι τιμές float που εμπλέκονται μπορεί να είναι μια άκυρη μοτίβο bit για `float`, προκαλώντας απροσδιόριστη συμπεριφορά.


Εάν η πρόθεσή σας είναι να «κρυπτογράφηση» ένα float, τότε η κρυπτογραφημένη τιμή πρέπει να αποθηκεύονται όπως `uint32_t`ή έναν πίνακα byte, δεν είναι τόσο `float`.


Το πρώτο σημείο θα μπορούσε να αντιμετωπιστεί με την παραγωγή ενός τυχαίου μάσκα 32-bit για κάθε εμφάνιση, αντί να χρησιμοποιεί `this`? ή με τη χρήση `uintptr_t`αντί του `uint32_t`.
Η προτιμώμενη μέθοδος είναι να χρησιμοποιήσετε πραγματικά την ιδιότητα υπό όρους για να τυλίξει τις κλήσεις εντοπισμού σφαλμάτων σας, μην χρησιμοποιήσετε τις οδηγίες μεταγλωττιστή. #ifs μπορεί να πάρει δύσκολες και μπορεί να οδηγήσει σε περίεργα προβλήματα κατασκευής.


Ένα παράδειγμα της χρήσης ενός υπό όρους χαρακτηριστικό είναι η εξής (σε C #, αλλά λειτουργεί σε VB.NET πολύ):



```
[ Conditional("Debug") ]
private void WriteDebug(string debugString)
{
  // do stuff
}

```

Κατά τη μεταγλώττιση, χωρίς το σετ σημαία DEBUG, κάθε κλήση προς WriteDebug θα καταργηθούν όπως υποτίθεται συνέβαινε με Debug.Write (). Αυτή είναι η γνώμη μου, αλλά? όπως ακριβώς και οι τάξεις περίπτωση δεν, θα ήθελα να εφαρμόσουν μια `copy`μέθοδο του είδους στην τάξη για να καταστεί δυνατή η τροποποίηση, διατηρώντας παράλληλα το αμετάβλητο, αλλά υπάρχει ορισμένες περιπτώσεις που δεν μπορώ να βοηθήσω να το μεταβλητό? Για παράδειγμα, όταν κάτι αναμένεται να γίνει η λειτουργία αντιγραφής είναι πολύ μεγάλη και αργή για την κατηγορία? όπως όταν η τάξη έχει τόσα πολλά συχνά τροποποιημένο μέλη. Και μην ανησυχείτε για χιλιάδες περιπτώσεις που επιπλέουν γύρω στη μνήμη, επειδή είναι αυτόματα GC'ed, οπότε το πιο πραγματικό πρόβλημα είναι ο χρόνος κόστος της αντιγραφής περιπτώσεις της κλάσης. Παρακαλώ πείτε μου εάν η γνώμη μου είναι κάπως λάθος :) <p>μπορείτε να λάβετε ροή εξόδου για τη σύνδεση και να γράψετε τη συμβολοσειρά ερώτησης παραμέτρων σε αυτήν.</p><pre><code>url url = new url("http://yoururl.com"); httpsurlconnection conn = (httpsurlconnection) url.openconnection(); conn.setreadtimeout(10000); conn.setconnecttimeout(15000); conn.setrequestmethod("post"); conn.setdoinput(true); conn.setdooutput(true); list&lt;namevaluepair&gt; params = new arraylist&lt;namevaluepair&gt;(); params.add(new basicnamevaluepair("firstparam", paramvalue1)); params.add(new basicnamevaluepair("secondparam", paramvalue2)); params.add(new basicnamevaluepair("thirdparam", paramvalue3)); outputstream os = conn.getoutputstream(); bufferedwriter writer = new bufferedwriter( new outputstreamwriter(os, "utf-8")); writer.write(getquery(params)); writer.flush(); writer.close(); os.close(); conn.connect(); </code></pre><p>...</p><pre><code>private string getquery(list&lt;namevaluepair&gt; params) throws unsupportedencodingexception { stringbuilder result = new stringbuilder(); boolean first = true; for (namevaluepair pair : params) { if (first) first = false; else result.append("&amp;"); result.append(urlencoder.encode(pair.getname(), "utf-8")); result.append("="); result.append(urlencoder.encode(pair.getvalue(), "utf-8")); } return result.tostring(); } </code></pre> Προσθέτοντας την `--decorate`επιλογή θα εμφανιστούν οι αναφορές που δείχνουν προς κάθε commit. Έτσι, για παράδειγμα, θα δείτε **HEAD** και **προέλευσης / HEAD** (ή οτιδήποτε άλλο) στις σωστές θέσεις.


Μπορούν ακόμη και να είναι σε αρκετά χρώματα, αν έχετε αυτό ενεργοποιηθεί.


PS. ευχαριστώ για να με κάνει να ελέγξετε αυτό - είναι πραγματικά πολύ ωραία, ειδικά με τον τρόπο που δείχνει επίσης διάφορες κρύπτες μου. βρήκα την λύση , προσπαθώ εδώ και δύο μέρες , είχα απελπιστει , ενεργοποιώντας και το secure boot πάλι πάω να το παρατήσω , και να αποδεχτώ ότι θα είμαι με τα κολο windows.

τελευταία στιγμή λέω κάνε άλλη μια προσπάθεια , και τί κάνω ;

start linux mint in compability mode , και ξαφνικά με βγάζει σ… αν δεν έχεις πρόβλημα, καλύτερα μην κάνεις τίποτα. όπως το βλέπω μάλλον είναι αδιάφοροι αισθητήρες που δεν αναγνωρίζονται σωστά. (μπορείς να ελπίζεις ότι απλά θα φτιάξει σε επόμενους πυρήνες linux, αλλά πιστεύω δεν είναι καν σημαντικό θέμα) <p>το .net 4.0 επιτρέπει στα πρωτεύοντα σύνολα interop (ή μάλλον, τα bits που χρειάζεστε) να ενσωματωθούν στη συνέλευση σας, ώστε να μην χρειάζεται να τα αναπτύξετε παράλληλα με την εφαρμογή σας.</p><p>για οποιονδήποτε λόγο, αυτή η συνέλευση δεν μπορεί να ενσωματωθεί - αλλά αυτό ακούγεται σαν να μην είναι πρόβλημα για εσάς. ανοίξτε την καρτέλα ιδιότητες για τη συνέλευση στο visual studio 2010 και ορίστε "ενσωμάτωση τύπων interop" σε "false".</p><p>edit: δείτε επίσης την <a href="https://stackoverflow.com/a/4553402/641833">απάντηση</a> του michael gustus, καταργώντας το επίθημα <code>class</code> από τους τύπους που χρησιμοποιείτε.</p> για να ρωτήσει και να σταματήσει αν πατήσεις κάτι άλλο εκτός από `y’ ή ‘y’

read -p "are you sure? " -n 1 -r

echo # (optional) move to a new line

if [[ ! $reply =~ ^[yy]$ ]]

then

echo -ne "\ncancelled\n"

exit 1

fi

echo -ne "\n"

το μυστικό είναι η κανονική έκφραση (regular experssion) '^[y… <p>το <strong>server</strong> (που αποστέλλεται το αίτημα post) πρέπει να περιλαμβάνει την κεφαλίδα <code>access-control-allow-headers</code> (κλπ) <strong>στην απάντησή του</strong>. η τοποθέτησή τους στο αίτημά σας από τον πελάτη δεν έχει καμία επίδραση.</p><p>αυτό οφείλεται στο γεγονός ότι εναπόκειται στον διακομιστή να καθορίσει ότι δέχεται αιτήσεις διασταυρούμενης προέλευσης (και ότι επιτρέπει την κεφαλίδα <code>content-type</code> αίτησης και ούτω καθεξής) - ο πελάτης δεν μπορεί να αποφασίσει για τον εαυτό του ότι ένας δεδομένος διακομιστής πρέπει να επιτρέπει την cors.</p> Συνήθως δεχόμαστε είτε "have to" είτε "must". Στείλτε μας, παρακαλώ, ένα συγκεκριμένο παράδειγμα που μπορούμε να ελέγξουμε για λάθοι.