Was macht diese Funktion?

  • C

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Was macht diese Funktion?

    Hallo Community

    Ich habe soeben sowas gefunden, aber was macht diese Funktion oder was ist das? Scheint irgendwie gcc spezifisch zu sein.
    Wie könnte man so was in msvc schreiben?

    Danke für die Hilfe.

    C-Quellcode

    1. void valid(uint8_t out[TAGLEN], const uint8_t* m, size_t inlen,
    2. const uint8_t key[KEYLEN])
    3. __attribute__((__bounded__(__minbytes__, 1, TAGLEN)))
    4. __attribute__((__bounded__(__buffer__, 2, 3)))
    5. __attribute__((__bounded__(__minbytes__, 4, KEYLEN)));


    Freundliche Grüsse

    exc-jdbi

    exc-jdbi schrieb:

    Wie könnte man so was in msvc schreiben?
    Genau so.
    Falls Du nicht valid meinst:
    Was machen denn die Bestandteile dieser Funktionen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo ROD

    Hab es gerade ausprobiert. Geht leider nicht mit MSVC (c++ von Visualstudio). Scheint wirklich was gcc spezifisches zu sein, mit dem das VS nicht klar kommt. Es kann nicht einmal kompiliert werden.

    TAGLEN und KEYLEN sind Konstanten, das habe ich jetzt so definiert.

    C-Quellcode

    1. #define KEYLEN 32
    2. #define TAGLEN 16


    Aber mit dem anderen Zeug kommt das VS nicht klar. Herausgefunden habe ich dass das __attribute__ so definiert werden könnte.
    stackoverflow.com/questions/28…ng-with-attribute-in-msvc

    C-Quellcode

    1. #if defined(_MSC_VER)
    2. #define DLL_PUBLIC __declspec(dllexport) // Note: actually gcc seems to also supports this syntax.
    3. #else
    4. #if defined(__GNUC__)
    5. #define DLL_PUBLIC __attribute__ ((dllexport))
    6. #endif
    7. #endif


    Aber wie werden die __bounded__, __minbytes__ und __buffer__ definiert? Kann man da vielleicht ein Makro schreiben. Leider weiss ich gar nicht, was hier gemacht werden soll.
    Ich habe __bounded__ noch nie gesehen, habe aber auch rausgefunden das dieses Attribut wirklich nur für einen Fork für GCC implementiert wurde (OpenBSD) also nicht einmal standard GCC.
    Wie du HIER sehen kannst, ist das sozusagen ein Hinweis an den Compiler, dass er eine Funktion die mit Buffern arbeitet, diese zuvor zu überprüfen hat.
    Das ist also sozusagen nur ein "Failproof" check der von dem Compiler als Extension hinzugefügt wurde, aber wenn du Fan von Bewusstem programmieren bist, solltest du es eh nicht nötig haben, wenn du natürlich darauf achts gibst keine Dummheiten mit den Buffern zu machen. :)

    exc-jdbi schrieb:

    Aber mit dem anderen Zeug kommt das VS nicht klar. Herausgefunden habe ich dass das __attribute__ so definiert werden könnte.
    stackoverflow.com/questions/28…ng-with-attribute-in-msvc

    Dein Ersatzbeispiel macht was anderes, das ist dafür da um die Symbole der Entitäten, die mit diesem prefixed, sind zu exportieren. (Windows braucht das um die Symbole direkt in der DLL zu exportieren somit brauchst du keine .def Dateien für den Linker mehr)

    exc-jdbi schrieb:

    Aber wie werden die __bounded__, __minbytes__ und __buffer__ definiert? Kann man da vielleicht ein Makro schreiben. Leider weiss ich gar nicht, was hier gemacht werden soll.


    Nein das sind keine Makros, das sind Compiler-Spezifische "Keywords" als Extensions, wenn der Compiler diese nicht unterstützt gibt es da auch keinen Weg rundherum außer ein Equivalent für deinen Compiler zu finden.
    Ich hatte was für MSVC gefunden, allerdings kann ich nicht wirklich evaluieren ob die beiden einen Zusammenhang haben, es ist eher ein Compiler-Flag als ein "Attribut": docs.microsoft.com/en-us/previ…o-2012/dd778695(v=vs.110)

    Also, abschließend: Es scheinen der Dokumentation nach nur Checks zu sein, also nichts was deinen Code beeinflussen sollte, somit solltest du die einfach weglassen können. :D
    ----------------------------------------------------------------------------------------------------------------------

    Hier könnte meine Signatur stehen, aber die ist mir abfußen gekommen.

    ----------------------------------------------------------------------------------------------------------------------
    Schein so, als könnte man eine einfache Schleife machen (gemäss deinem Link man.openbsd.org/gcc-local.1#ATTRIBUTES).

    Wenn ich das richtig verstanden habe, wird ja nur geprüft, ob eine Anzahl nachfolgende Werte in der Array vorhanden sind.

    Danke dir für die Antwort.

    Freundliche Grüsse

    exc-jdbi
    Ne ne, hier wird nicht der Inhalt gecheckt.

    __minbytes__ checkt das der Buffer mindestens die Anzahl an bytes besitzt wie angegeben.

    Hier beim ersten Parameter überprüft er ob das Array die gewünschte Länge besitzt.
    uint8_t = 8 Bits (x86: 1 Byte): 1 * TAGLEN = mindestens TAGLEN
    Somit finde ich den Check redundant solange du auf einem 8Bit = 1Byte Sytem arbeitest.
    Denn da wird uint8_t immer 1 Byte sein, und da die Länge ja sowieso angegeben ist.

    __buffer__ überprüft auf die Länge des Buffers basierend auf einen anderen Parameter.
    Wenn dieser größer ist als die tatsächliche Buffer Länge, bekommst du eine Warnung.

    Ganz ehrlich, du brauchst das nicht .
    Klar, es geht hier um Sicherheit, aber wenn du es sowieso nicht verwenden kannst.
    Machs doch wie C, der Funktionsaufrufer muss sich darum kümmern, dass die Parameter passen.
    Das kannst du einfach mit Branching machen wenn du dir der Länge nicht bewusst bist.
    ----------------------------------------------------------------------------------------------------------------------

    Hier könnte meine Signatur stehen, aber die ist mir abfußen gekommen.

    ----------------------------------------------------------------------------------------------------------------------
    Ja das habe ich schon so verstanden.

    Im Prinzip handelt es sich hier um einen Funktionsprototyp, der einfach so geschrieben werden kann.

    C-Quellcode

    1. void valid(uint8_t out[TAGLEN], const uint8_t* m, size_t inlen, const uint8_t key[KEYLEN]);
    2. //__attribute__((__bounded__(__minbytes__, 1, TAGLEN)))
    3. //__attribute__((__bounded__(__buffer__, 2, 3)))
    4. //__attribute__((__bounded__(__minbytes__, 4, KEYLEN)));


    Das Auskommentierte ist wie du es schon bemerkt hast irrelevant. Für die Programme in msvc braucht man sie nicht, und wer sauber programmiert, sollte eigentlich solche checks gar nicht erst machen müssen.

    Die ganzen Checks können auch gleich zu beginn in der Funktion gemacht werden. In C# (glaube auch in C++) gibts dafür die Throw-Anweisung.


    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „exc-jdbi“ ()

    1 Byte ist die Menge an Bits, die der Prozessor mit einer einzelnen Adresse adressieren kann (kleinste adressierbare Einheit).
    Es gibt (insbesondere ältere) Computersysteme, die auch exotische Byte-Längen haben.
    de.wikipedia.org/wiki/Byte#Abgrenzung
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --