PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C auf erlaubten Speicherzugriff pruefen


elianda
2008-03-31, 21:38:34
Hallo,

ich stehe zur Zeit vor folgendem Problem:
Ich habe ein Programm geschrieben in Watcom C (compiliert auch in GCC) mit Target Win32 das eine Kamera ansteuert.
Das ganze passiert ueber DLL Funktionen, die ich vorher importiert habe.
Intern laeuft das so, dass der Kameratreiber die Bilddaten in einen Puffer im Kernelspace transferiert und die DLL-Funktion mir einen Zeiger gibt, wo ich die Bilddaten lesen kann. Wenn ein komplettes Bild im Puffer ist, wird der Speicher fuer Zugriffe durch eine Applikation freigegeben. Die DLL-Funktion kehrt zurueck, wenn das abgeschlossen ist.
Das funktioniert auch zu 99%.

Nur manchmal ist der Puffer nach Rueckkehr der 'GetImg' Funktion noch gelocked. Wenn ich dann dort versuche zu lesen, fliegt das Programm mit allgemeiner Schutzverletzung raus. Der Puffer ist im Speicher immer an der selben Adresse.

Wie kann ich nun in C pruefen ob der Puffer von der Applikation schon gelesen werden darf oder nicht?

Codeschnipsel:

err=(*CamSnap) (camID,camdata,0); // 1= continuous
errcheck(err);
err=(*CamGetImg) (camID,camdata,Cexp+2000);
if (err==-54) {
recovercamerror();
} else {
errcheck(err);
}
bufstart=(unsigned short *) (camdata[camID].pictptr);


camdata[camID].pictptr ist der Zeiger auf den Puffer mit den Bilddaten.
Sobald ich nun
value = *(bufstart);
mache, fliegt er manchmal raus. (Task Exception)

Coda
2008-03-31, 22:12:56
Das muss dir schon die API irgendwie mitteilen. Nur am Pointer kannst du das nicht sehen.

elianda
2008-03-31, 22:52:38
Naja laut API sollte der Fall nie vorkommen, da bei Rueckkehr von (*CamGetImg) der Puffer fuer die Applikation zum Daten abholen freigegeben sein soll.
Ich will nicht Jahre auf einen Bugfix warten, daher ueberlege ich ob man da Applikationsseitig nicht irgendetwas machen kann, dass man erkennt ob der Puffer zugreifbar ist oder nicht.

Gast
2008-03-31, 23:13:07
hmm du kannst irgendwie die exception fangen, die windows an dein programm wirft wenn der speicherzugriff fehlschlägt. dann halt nach einer sekunde oder so noch mal probieren. google mal nach structured exception handling... da solltest du was zu finden, ich meine mit dem normalen catch von c++ kann man solche zugriffsverletzungen nicht fangen, wobei du ja ehh c verwendest.

Trap
2008-04-01, 11:53:15
Wow, ein hilfreicher Gast-Post :eek:

Ja, man braucht SEH, ein C++ catch geht nicht.

Gast
2008-04-01, 13:49:26
Bei mir fängt

try
{
}
catch(...)
{
}

auch Speicherzugriffverletzungen.

elianda
2008-04-01, 17:25:40
So ich habe mich nochmal reingekniet und der Fehler lag an meiner Programmierung. (soll ja vorkommen ;) )
recovercamerror() kam unter Umstaenden zurueck mit einem noch nicht geloesten TimeOut Fehler, so dass der spaetere Pufferzugriff auf ein nicht gueltiges Bild erfolgt.


Aber um nochmal prinzipiell auf das Exception Problem zu kommen:

Watcom C kennt kein try {} catch(...) {}.
Kann es sein, dass das C++ Syntax ist?

Ich habe noch etwas geschaut und es gibt wohl zwei Ansaetze:

jump_buf env;

int testexc(int a,int b) {
if (b==0) {
longjmp(env,14);
}
return a/b;
}

void main() {
int retval=1;
if (0==(retval=setjmp(env) )) {
testexc(1,0);
} else {
printf("from longjmp");
}
}


Das Problem was ich bei dem Ansatz sehe ist, dass man selber pruefen muss mit z.B. der if Abfrage und den longjmp ausloesen.



void MySIGHandler(int signo) {
...
}

int main (void) {
signal(SIGSEGV,MySIGHandler);
}

Das habe ich probiert, jedoch hat der Handler nicht angesprochen?!?

Trap
2008-04-01, 17:34:23
Bei mir fängt
try{}catch(...){}
auch Speicherzugriffverletzungen.
Welches OS und welcher Compiler?

Bei mir crasht das sofort:
#include<cstdlib>

int main(int argc, char* argv[])
{
int sum=0;
while(true) {
try {
int *bla = (int*)rand();
sum+=*bla;
} catch(...) {
printf("Exception caught.\n");
}
}
printf("%i",&sum);
}
Aber um nochmal prinzipiell auf das Exception Problem zu kommen:
Watcom C kennt kein try {} catch(...) {}.
Kann es sein, dass das C++ Syntax ist?
Ja, try und catch sind C++. Bei structured exception handling (SEH) heißen sie __try und __except und sind von manchen C-Compiler unterstützt. Bei MS ist das auf http://msdn2.microsoft.com/en-us/library/ms680657(VS.85).aspx beschrieben.

Gast
2008-04-01, 21:39:19
Welches OS und welcher Compiler?

Bei mir crasht das sofort:
#include<cstdlib>

int main(int argc, char* argv[])
{
int sum=0;
while(true) {
try {
int *bla = (int*)rand();
sum+=*bla;
} catch(...) {
printf("Exception caught.\n");
}
}
printf("%i",&sum);
}



Nochmal getestet, bei Visual Studio 7er Version unter Windows springt er in die exception.

elianda
2008-04-01, 22:05:26
Welches OS und welcher Compiler?


OpenWatcom 1.7a unter Win2K.

Wenn ich deinen Code da probehalber reinkopiere, meckert der Compiler, dass cstdlib mindestens C++ erfordert.
Wenn ich in ein vorhandenes C Programm try {}... einfuege, kennt er try bzw. catch nicht. Es gibt auch kein try bzw. catch in der Hilfe.

Ectoplasma
2008-04-02, 00:54:58
Soweit mir bekannt ist kennt nur MSC __try __except. Das funktioniert natürlich auch mit C++.

Bau dir doch eine C++ Datei, die den Aufruf wrapped. Wo ist denn da das Problem?

Coda
2008-04-02, 01:25:06
Ich finde die Diskussion total überflüssig, weil das ein übelster Hack wäre. Das macht man nicht.

del_4901
2008-04-02, 02:39:02
Dann doch lieber "Dirty" mit einem schönen sleep, das kriegt man schnell wieder aus der Codebase raus, und dann halt warten bis die API gefixed wurde.

ScottManDeath
2008-04-02, 05:59:11
OpenWatcom 1.7a unter Win2K.

Wenn ich deinen Code da probehalber reinkopiere, meckert der Compiler, dass cstdlib mindestens C++ erfordert.
Wenn ich in ein vorhandenes C Programm try {}... einfuege, kennt er try bzw. catch nicht. Es gibt auch kein try bzw. catch in der Hilfe.

Kannst Du nicht den Compiler wechseln?

Trap
2008-04-02, 12:33:00
Nochmal getestet, bei Visual Studio 7er Version unter Windows springt er in die exception.
Hab nochmal nachgeguckt, da gibt es eine Projekteinstellung für, C++ Exceptions sind mit oder ohne SEH support einstellbar. Mit SEH fängt er die Exception, ohne nicht.