Spassiges Problem das ein C-Compiler &c nicht finden kann

17/11/2014 - 17:36 von Rainer Weikusat | Report spam
'In einem beruflichen Umfeld' bin ich eng mit etwas befasst, das racoon
as IKE-Server als Teil einer 'VPN-Loesung for mobile Endgeraete'
(groesstenteils Apple) benutzt. Der Server hat mehrere interne
Datenbanken (ph1 und ph2 SAs, policies) die saemtlich als doppelt
verkettete Listen implementiert sind (im Quellcode amuesanterweise als
'trees', also Baeume, bezeichnet). Bei Installationen mit vier- bis
fuenftausend Benutzter verbringt er deswegen den weitaus groessten Teil
seiner Zeit damit, diese Listen linear zu durchsuchen. Um dem abzuhelfen
habe ich (weil das die naechteinfachste Loesung ist) letzte Woche damit
angefangen, fuer Kriterien, nach denen haeufig gesucht wird, statische
64K(Zeiger) Hashtabellen zu benutzen. Implementiert ist das in Form von
'Linkstrukturen', die in die zu suchenden Strukturen eingebettet werden,
und einem Satz von Macros, der fuer jeden 'Hash-Index' C Code erzeugt,
der 'seine' Link-Struktur dadurch findet, dass er den entsprechenden
offsetof(struct something, field)-Wert zu dem 'Basiszeiger' auf die
Struktur selber hinzuaddiert (es soll moeglich sein, diesselbe Struktur
unter Benutzung verschiedener Tabellen zu finden).

Der bislang letzte Index, den ich hinzugefuegt habe, ermoeglicht das
Finden von ph1andle-Strukturen (repraesentieren eine ph1 SA) basierend
auf den ISAKMP cookies (zufaellige 64-bit-Zahlen von denen eine vom
Anrufer und die andere vom Angerufenen [initiator, responder]
ausgewaehlt wurde). Das unmittelbare Resultat davon war ein
coredump (derselbe Code wurde bereits von zwei anderen Indices
benutzt). Dieser fand statt, weil die entsprechende ph1handle-Struktur
nicht geloest wurde als sie geloescht werden sollte, weil deren
'ph2tree' lh_first Zeiger nicht NULL war, weswegen der Code annahm,
hier waere noch die Loesung einer assozierten ph2handle (ph2 SA)
Struktur abzuwarten. Das war allerdings Quatsch.

Naehere Untersuchung des Codes foerderte zutage, dass dieser Zeiger
'irgendwie' auf den Wert des 'Zeiger auf mich'-Zeigers der Linkstruktur
gesetzt wurde: Sah man sich das mit einem Debugger unmittelbar nach
Einfuegen in den Hash an, so hatte der Linkstrukturzeiger den korrekten
Wert, nach Rueckkehr zum Aufrufer war dieser 'auf magische Weise' in die
ph2tree-Struktur gesprungen. Die ph1handle-Struktur ist in einer Datei
handler.h definiert, die von dem 'hash index'-Code eingebunden
wurde. Allerdings enthaelt diese nur bedingt hinzugefuegte Elemente (via
#ifdef #endif). Die entsprechenden #defines finden sich im
(autoconf) config.h-Header und dieser wurde in der neuen Datei nicht
eingebunden. Deswegen unterschied sich das Layout der
ph1handle-Struktur, die von dem Index-Code benutzt wurde, von dem, das
der restliche Code benutzte, und weil auch Debugging-Information in den
Objektcode-Dateien gespeichert werden, haette man das nur bemerken (ohne
Geistesblitz), wenn man die Feldnamen einzeln verglichen haette (und von
denen gibt es einige).

Das war mal eine schoene Demonstration wie verschiedene
"96%-Beinaheloesungen", die ein uebliches C Uebersetungs-System
ausmachen, gemeinsam ein nicht mehr ganz trivial zu entwirrendes Chaos
verursachen koennen.
 

Lesen sie die antworten

#1 Marcel Mueller
17/11/2014 - 19:25 | Warnen spam
On 17.11.14 17.36, Rainer Weikusat wrote:
Die ph1handle-Struktur ist in einer Datei
handler.h definiert, die von dem 'hash index'-Code eingebunden
wurde. Allerdings enthaelt diese nur bedingt hinzugefuegte Elemente (via
#ifdef #endif). Die entsprechenden #defines finden sich im
(autoconf) config.h-Header und dieser wurde in der neuen Datei nicht
eingebunden.



Also mit autoconf stehe ich auch etwas auf Kriegsfuß. Das liegt aber
eher daran, dass es (ungetestet) sowieso auf der Plattform funktioniert,
wo es ursprünglich erstellt wurde. Und auf anderen Plattformen war ich
eigentlich immer schneller, wenn ich die erforderlichen #define mit der
Hand geschrieben habe, statt die Fehler in den Config-Skripten zu suchen.

Aber in vorliegenden Fall gibt es genau einen Programmfehler: handler.h
hat vergessen config.h zu includen, obwohl es inhaltlich davon abhàngt.


Marcel

Ähnliche fragen