C-Funktion deklarieren, um nur konstante Zahlen zu akzeptieren

8

Ist es möglich, eine Funktion in C zu deklarieren, die es erlaubt, nur eine numerische Konstante (keine Variablen) zu übergeben?

Beispiel:

%Vor%

Parameter "y" soll nur als numerische Konstante akzeptiert werden. Variablen, Zeiger usw. sollen einen Fehler erzeugen.

%Vor%

Compiler ist gcc.

Hintergrund: Minderung von Timing- und Power-Analyse-Angriffen im AES-Code, erzeugen leistungsfähigeren Code.

    
broth-itk 01.09.2017, 12:50
quelle

2 Antworten

1

Basierend auf Ihrer wertvollen Eingabe habe ich folgendes getan:

%Vor%

Dies erzeugt einen Kompilierfehler, wenn "y" keine Konstante ist. Vielen Dank!

    
broth-itk 01.09.2017, 13:19
quelle
7

Sie können ein Makro mit einem Bitfeld (C99 +) verwenden, um zu überprüfen, ob das Argument ein ganzzahliger konstanter Ausdruck ist. Hier deklarieren wir eine anonyme Struktur mit einem Bitfeld, dessen Größe vom angegebenen Wert abhängt. Wenn Sie eine Variable übergeben, ist das Konstrukt ungültig. Natürlich kann ein Compiler es kompilieren, aber ein Compiler muss mindestens eine Warnung erzeugen . C11 6.7.2.1p4 :

  
  1. Der Ausdruck, der die Breite eines Bitfeldes angibt, muss ein ganzzahliger konstanter Ausdruck sein, wobei ein nichtnegativer Wert ist, der die Breite eines Objekts des angegebenen Typs nicht überschreitet wurden der Doppelpunkt und der Ausdruck weggelassen. [122] Wenn der Wert Null ist, darf die Deklaration keinen Deklarator enthalten.
  2.   

Wir verwenden hier den Wert von y , um die Größe einer anonymen Struktur mit einem Bitfeld zu berechnen, dessen Breite vom Wert von y abhängt, wobei abhängig vom Wert von entweder die Breite 1 oder 2 erzeugt wird %Code%; Wenn y kein Ganzzahlkonstantenausdruck ist, muss der Compiler eine Einschränkungsverletzung melden. Als zusätzlichen Bonus sollte dies bei jedem Compiler funktionieren, der C99-Bit-Felder unterstützt, nicht nur GCC.

%Vor%

Nach der Kompilierung würde

erzeugt werden %Vor%     
Antti Haapala 01.09.2017 13:08
quelle

Tags und Links