Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
jbuffer
Morgen
Was passiert eigentlich, wenn bspw. bbGet() einen ungültigen BNDBUF übergeben bekommt? Gefühlsmäßig hätte ich jetzt -1 oder so zurückgegeben, was aber irgendwo auch doof ist, weil (a) nicht spezifiziert und (b) -1 ja ein normaler Wert im Puffer sein könnte. Also besser ggf. einfach “kaputt gehen lassen”?
Meinst du mit ungültigem [m]BNDBUF[/m] einen [m]NULL[/m]-Zeiger? Auch wenn’s nicht spezifiziert ist, ist es absolut okay und richtig diesen Fall abzufangen und -1 zurückzugeben - aber es ist nicht explizit notwendig.
Zum Vergleich: Wenn du einen [m]NULL[/m]-Zeiger anstelle eines gültigen [m]FILE *[/m] an [m]fprintf()[/m] o. ä. übergibst, wird die libc das auch nicht abfangen, sondern du kriegst einen Segfault.
Ah OK, danke. Dann ist Segfaulten lassen also Standardverhalten
Quasi.
Um einen weiteren nicht-hinkenden Vergleich zu bringen: Wenn man in C++ versucht eine Methode auf ein [m]NULL[/m]-Objekt aufzurufen, bekommt man ebenfalls einen Segfault. (In Java bekommt man keinen wilden Segfault, sondern eine kontrollierte und abfangbare [m]NullPointerException[/m], aber Java ist im Gegensatz zu C/C++ eine typsichere Sprache.)
Noch ein Nachtrag: [m]bbDestroy()[/m] soll gemäß der API-Dokumentation mit [m]NULL[/m]-Zeigern umgehen können - es soll in diesem Fall einfach stillschweigend nichts tun anstatt zu versuchen, den Puffer wegzuräumen.
[s]Abend,
jemand Vorschläge worran das liegt wenn bbPut ewig blockt? Die zuständige Semaphore wurde in bbCreate mit semCreate(size) erzeugt. Meiner Meinung nach sollte P da nicht ewig blocken
Habe das Problem unabhängig davon, ob ich meine Implementierung der Semaphore verwendet oder die vom Lehrstuhl.[/s]
edit: hat sich erledigt
Gegenbeispiel:
#include <iostream>
class Foo {
public:
int bar(int a) {
return a + 1;
}
};
int main(int argc, char *argv[]) {
Foo *foo = nullptr;
std::cout << foo->bar(41) << std::endl;
};
Compile with: [m]clang++ -Wall -Werror -Weffc++ -std=c++11 test.cpp[/m]
Warum funktioniert das? Auch wenn mein C++ nicht sonderlich gut ist, würde ich erwarten, dass mir sowas um die Ohren fliegt.
Weil [m]this[/m] im Code der Methode nicht dereferenziert wird (tatsächlich wird es ja noch nicht mal benutzt). Es gilt zwar [m]this == nullptr[/m], aber das stellt erst dann ein Problem dar, wenn man versucht über den Nullpointer zuzugreifen. Ich nehme an wäre die Methode [m]virtual[/m] würde das reichen, um einen Segfault zu produzieren.
Stellt sich die Frage, wie sinnvoll es ist eine Instanzmethode zu schreiben, die nicht auf die Instanz zugreift…
@kronos: Instanzmethoden sind eigentlich auch nur Methoden, nur dass als quasi „versteckter“ Parameter noch ein Pointer mit dem namen [m]this[/m] auf dein Objekt übergeben wird. Solange du diesen Pointer nicht dereferenzierst ([m]this->foo = bar;[/m]) fällt der Nullpointer nie auf. Aber wenn du sowas in der ganzen Methode nicht tust, sollte sie vermutlich statisch sein. Für Vererbung brauchst du auch meistens einen gültigen Pointer…