Einzelnen Beitrag anzeigen

Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

DLL/Lib: Parameter Validierung

  Alt 28. Mär 2018, 16:43
Hallo zusammen,

mal ein etwas kontroverses Thema: Ich schreibe eine Library (in C; also keine Exceptions) mit einigen Funktionen, die exportiert werden (also als API für Entwickler; nicht als User-Interface). Wie gehe ich vor?
  1. Parameter durch Assertions validieren
  2. Parameter validieren und ggfls. mit Error-Code returnen
  3. Parameter zuerst mit Assertion validieren und als Fallback mit Error-Code returnen

Zu 1.:
Pro:
  • (Programmier-)Fehler während der Entwicklung schmeißen unmittelbar eine Exception
  • Kein Runtime Overhead im Release Modus
Neutral:
  • Validierung von (Benutzer-)Eingaben obliegt hier vollständig dem Nutzer der Library (müsste beim Fuzzen dann beispielsweise manuell vorgenommen werden)
Contra:
  • Assertions lassen sich abschalten
  • Fehlerhafte Parameter könnten zum Crash/Data-Corruption im Produktivbetrieb führen, wenn sie zur Entwicklungszeit z.B. einfach nicht aufgetreten sind
  • Für manche Entwickler bedeutet ein Crash/Assertion innerhalb einer Library = Bug

Zu 2.:
Pro:
  • Fehler, die während der Entwicklung nicht aufgetreten sind, könnten im Produktivbetrieb keinen großen Schaden anrichten
  • Fehler können im Produktivbetrieb sehr einfach geloggt werden
Contra:
  • Error-Codes können ignoriert werden, was dazu führt, dass (Programmier-)Fehler während der Entwicklung ggfls. nicht auffallen und behoben werden
  • Runtime Overhead durch - teilweise etliche redundante - Checks

Momentan fahre ich mit Runtime-Checks für die exportierten Funktionen und verwende Assertions nur intern. Funktioniert für mich so eigentlich, aber auf der anderen Seite machen sich die Checks zur Laufzeit bei Zeitkritischen Operationen teilweise doch bemerkbar. Außerdem wird der Code hierdurch unnötig komplex und wenn man den Gedanken mal weiterspinnt: Eine weitere Library verwendet intern meine Library, validiert aber in ihrem Public Interface auch erst noch Parameter, etc. dann werden sich die redundanten Checks irgendwann ziemlich häufen.

Eine weitere Überlegung zu diesem Thema sind Zeiger. Prüft man die explizit auf NULL /nil ? Oder lässt man es gleich sein, da ein Null-Pointer nicht schlimmer ist als irgendein anderer ungültiger Zeiger (auf den man eh nicht gescheit testen kann)?

Mich würde mal interessieren, wie ihr da vorgeht. Insbesondere bei professioneller (nicht Endanwender-Software).

Viele Grüße
Zacherl
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (28. Mär 2018 um 17:40 Uhr)
  Mit Zitat antworten Zitat