C tut weh!

W

Wolfgang Allinger

Guest
C_hurts sounds in German like: Tooths hurts ( C_tut_weh :)

So here is the pain: Hier ist der Schmerz:

(*(void(*)())0)()

ok, ein böses Beispiel, wie übel C sein kann.

Ich weiss was es macht :) Wissen die C-progger das auch?
Sogar sinnvoll auf vielen CPUs.

Hint:
In Forth 2 Worte (auch interaktiv) und in Z80 Assembler 2 Befehle.
Beides schon oft gebraucht :p

In HW eine Taste und/oder ein WW-Pfosten Pärchen.
Auch oft gebraucht :)

Nun auf, ich warte :eek:



Saludos (an alle Vernünftigen, Rest sh. sig)
Wolfgang

--
Ich bin in Paraguay lebender Trollallergiker :) reply Adresse gesetzt!
Ich diskutiere zukünftig weniger mit Idioten, denn sie ziehen mich auf
ihr Niveau herunter und schlagen mich dort mit ihrer Erfahrung! :p
(lt. alter usenet Weisheit) iPod, iPhone, iPad, iTunes, iRak, iDiot
 
Hi,

ich habe zwar schon eine ganze Weile kein C mehr geschrieben
aber ich wĂźrde vermuten, eine Funktion mit Adresse 0.
Also sozusagen ein Reboot "auf manchen Maschinen"?

Viele Grüße
Ronald


On 10.10.2019 12:42, Wolfgang Allinger wrote:
C_hurts sounds in German like: Tooths hurts ( C_tut_weh :)

So here is the pain: Hier ist der Schmerz:

(*(void(*)())0)()

ok, ein bĂśses Beispiel, wie Ăźbel C sein kann.

Ich weiss was es macht :) Wissen die C-progger das auch?
Sogar sinnvoll auf vielen CPUs.

Hint:
In Forth 2 Worte (auch interaktiv) und in Z80 Assembler 2 Befehle.
Beides schon oft gebraucht :p

In HW eine Taste und/oder ein WW-Pfosten Pärchen.
Auch oft gebraucht :)

Nun auf, ich warte :eek:



Saludos (an alle VernĂźnftigen, Rest sh. sig)
Wolfgang
 
On 10.10.19 12:49, Ronald Pfeiffer wrote:

ich habe zwar schon eine ganze Weile kein C mehr geschrieben
aber ich wĂźrde vermuten, eine Funktion mit Adresse 0.

Ja. Hat der Wolfgang halt unnĂśtig kompliziert hingeschrieben,
Funktionszeiger müssen in C nicht explizit dereferenziert werden. Weiß
er aber vermutlich nicht, weil er halt kein C kann.

> Also sozusagen ein Reboot "auf manchen Maschinen"?

Undefiniertes Verhalten. Alles kann, nichts muss.

Viele Grüße,
Johannes

--
"Performance ist nicht das Problem, es läuft ja nachher beides auf der
selben Hardware." -- Hans-Peter Diettrich in d.s.e.
 
On 10.10.19 12:42, Wolfgang Allinger wrote:
> C_hurts sounds in German like: Tooths hurts ( C_tut_weh :)

Dein Zeh ist also auf Englisch der "tooth", ja? Du kannst also nicht nur
kein C, sondern auch kein Englisch.

ok, ein bĂśses Beispiel, wie Ăźbel C sein kann.
[...]> Hint:
In Forth 2 Worte (auch interaktiv) und in Z80 Assembler 2 Befehle.
Beides schon oft gebraucht :p

Also dein Beispiel ist dafĂźr, wie Ăźbel C ist, aber in Forth kann man
dasselbe machen und in Z80 Assembler ja auch. GrĂźbelgrĂźbel, sind die
Sprachen dann nach deiner Logik nicht genauso Ăźbel? Bissl schlechtes
Argument gegen C, dass du dir da rausgesucht hast, merkste selber, oder?

Man kann ja viel berechtigte Kritik an C Ăźben, aber du stĂźmperst sogar
beim plumpen Stänkern derart, dass es peinich ist.

Viele Grüße,
Johannes

--
"Performance ist nicht das Problem, es läuft ja nachher beides auf der
selben Hardware." -- Hans-Peter Diettrich in d.s.e.
 
Am 10.10.2019 um 12:42 schrieb Wolfgang Allinger:
> C_hurts sounds in German like: Tooths hurts ( C_tut_weh :)

Meinst Du nicht toe hurts?

So here is the pain: Hier ist der Schmerz:

(*(void(*)())0)()
ok, ein bĂśses Beispiel, wie Ăźbel C sein kann.

Ich weiss was es macht :) Wissen die C-progger das auch?

Error: expected a ";"

> Sogar sinnvoll auf vielen CPUs.

Wozu sind Compilerfehler sinnvoll?

Falls Du den Sprung an Adresse 0 meinst, der ist nur sinnvoll wenn das
Programm dort beginnt.

Bei meiner aktuellen CPU dĂźrfte es einen hard fault erzeugen.
Und den mag ich Ăźberhaupt nicht.
 
"Wolfgang Allinger" <all2001@spambog.com> schrieb im Newsbeitrag
news:EvbIW$mjQoB@allinger-307049.user.uni-berlin...

(*(void(*)())0)()
ok, ein böses Beispiel, wie übel C sein kann.

Im Gegenteil, ein schönes Beispiel wie nützlich C ist,
und ich habe es auch schon benutzt um RESET und andere
Vektoren auf Controllern auszulösen.
--
MaWin, Manfred Winterhoff, mawin at gmx dot net
Homepage http://flexiblebird.bplaced.net/
dse-FAQ: http://dse-faq.elektronik-kompendium.de/
 
Am 10.10.2019 um 12:42 schrieb Wolfgang Allinger:
C_hurts sounds in German like: Tooths hurts ( C_tut_weh :)
^^^^^^ Das Word gibt es IMHO nicht.

tooth: der Zahn. Mehrzahl: teeth

Was Du meinst, heißt "toe", Mehrzahl "toes"
 
On 10.10.19 13:25, Thorsten BĂśttcher wrote:

Bei meiner aktuellen CPU dĂźrfte es einen hard fault erzeugen.
Und den mag ich Ăźberhaupt nicht.

Hm ich kenne nicht viele CPUs, bei dem ein Sprung an 0 auch direkt die
ganze Peripherie resettet. Ohne den ist ein "Soft-Reset" bei vielen SoCs
extrem witzlos, wenn alles was nicht gerade der Kern ist in einem
undefinierten Zustand hängt.

Gruß,
Johannes

--
"Performance ist nicht das Problem, es läuft ja nachher beides auf der
selben Hardware." -- Hans-Peter Diettrich in d.s.e.
 
Johannes Bauer schrieb:

ok, ein böses Beispiel, wie übel C sein kann.
[...]> Hint:
In Forth 2 Worte (auch interaktiv) und in Z80 Assembler 2 Befehle.
Beides schon oft gebraucht :p

Also dein Beispiel ist dafür, wie übel C ist, aber in Forth kann man
dasselbe machen und in Z80 Assembler ja auch. Grübelgrübel, sind die
Sprachen dann nach deiner Logik nicht genauso übel? Bissl schlechtes
Argument gegen C, dass du dir da rausgesucht hast, merkste selber, oder?

Es wird IMO nicht kritisiert, dass man die Adresse 0 aufrufen kann,
sondern die dafür klammerreiche Syntax.
Ich weiß zwar nicht, wie dass in Forth aussieht oder Z80-Assembler,
aber sinnvoll kann das allemal sein und ist nicht das Übel, was du
hier zu erkennen glaubst.

'Schön' ist z.B die C-Deklaration der Unix signal(2) Funktion, wenn
man keinen typedef nimmt:

void (*signal(int signum, void (*handler)(int)))(int);


Mit typedef siehts dann wieder lesbarer aus:

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);


- Heinz
 
On 10.10.19 14:07, Heinz Saathoff wrote:

Also dein Beispiel ist dafĂźr, wie Ăźbel C ist, aber in Forth kann man
dasselbe machen und in Z80 Assembler ja auch. GrĂźbelgrĂźbel, sind die
Sprachen dann nach deiner Logik nicht genauso Ăźbel? Bissl schlechtes
Argument gegen C, dass du dir da rausgesucht hast, merkste selber, oder?

Es wird IMO nicht kritisiert, dass man die Adresse 0 aufrufen kann,
sondern die dafĂźr klammerreiche Syntax.

Ah, okay! Dann ist die Kritik ja tatsächlich noch blÜder als ich dachte
und zieht sich ausschließlich an Oberflächlichkeiten hoch.

Ich weiß zwar nicht, wie dass in Forth aussieht oder Z80-Assembler,
aber sinnvoll kann das allemal sein und ist nicht das Übel, was du
hier zu erkennen glaubst.

Moment, ich finde das nicht Ăźbel. Wolfgang findet es Ăźbel.

Klar ist es nĂźtzlich, dass man solche Manipulationen machen kann (und
quasi eine rein numerische Adresse zu einem Funktionszeiger casten) --
aber aus Sicherheitsaspekten ist es halt schon eher schlecht, dass die
Sprache soetwas ßberhaupt zulässt. Ist halt, wie bei jeder
Informatik-LĂśsung, ein Kompromiss. Ich bin ganz glĂźcklich mit C, ist
noch von allen Optionen oft das geringste Übel.

'SchĂśn' ist z.B die C-Deklaration der Unix signal(2) Funktion, wenn
man keinen typedef nimmt:

void (*signal(int signum, void (*handler)(int)))(int);

Hmja, habe ich jetzt auch keine Probleme damit, aber ist vermutlich
geschmackssache bzw die Frage, wie oft man sowas schon gesehen hat.

Mit typedef siehts dann wieder lesbarer aus:

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

Das ist ja geradezu einfach :)

Viele Grüße,
Johannes

--
"Performance ist nicht das Problem, es läuft ja nachher beides auf der
selben Hardware." -- Hans-Peter Diettrich in d.s.e.
 
On 10/10/2019 12:58, Johannes Bauer wrote:
On 10.10.19 12:49, Ronald Pfeiffer wrote:

ich habe zwar schon eine ganze Weile kein C mehr geschrieben
aber ich wĂźrde vermuten, eine Funktion mit Adresse 0.

Ja. Hat der Wolfgang halt unnĂśtig kompliziert hingeschrieben,
Funktionszeiger müssen in C nicht explizit dereferenziert werden. Weiß
er aber vermutlich nicht, weil er halt kein C kann.

Also sozusagen ein Reboot "auf manchen Maschinen"?

Undefiniertes Verhalten. Alles kann, nichts muss.

Nein, die Konstruktion wird oft sinnvoll angewandt.

(* (void(*)())0 )()

Die Konstante 0 wird gecastet in einen Funktionspointer
auf eine Funktion, die nichts retourniert.
Dann wird dieser Funktionspointer explizit dereferenziert
und die Funktion mit Adresse 0 aufgerufen.


Häufiger kommt so etwas vor:
# define NEsp0ARR(S,A) (sizeof(((S*)0)->A)/sizeof(*((S*)0)->A))


--
Mit freundlichen Grüßen
Helmut Schellong var@schellong.biz
www.schellong.de www.schellong.com www.schellong.biz
http://www.schellong.de/c.htm
 
On 10.10.19 14:40, Helmut Schellong wrote:

Also sozusagen ein Reboot "auf manchen Maschinen"?

Undefiniertes Verhalten. Alles kann, nichts muss.

Nein, die Konstruktion wird oft sinnvoll angewandt.

Doch, und zwar KRISTALL klar:

"§6.5.3.2 Address and indirection operators" sagt:

"If an invalid value has been assigned to the pointer, the behavior of
the unary * operator is undefined."

Und dann noch eine Fußnote:

"Among the invalid values for dereferencing a pointer by the unary *
operator are a null pointer, [...]"

Da gibt es Ăźberhaupt keinen Zweifel, einen Nullpointer in C zu
dereferenzieren ist definitiv undefiniertes Verhalten.

   (* (void(*)())0 )()

Die Konstante 0 wird gecastet in einen Funktionspointer
auf eine Funktion, die nichts retourniert.

Schon klar.

Dann wird dieser Funktionspointer explizit dereferenziert
und die Funktion mit Adresse 0 aufgerufen.

Das Dereferenzieren ist undefiniertes Verhalten, auch wenn es
Implementierungsabhängig ßblicherweise das macht, was du beschreibst.

Häufiger kommt so etwas vor:
# define NEsp0ARR(S,A)  (sizeof(((S*)0)->A)/sizeof(*((S*)0)->A))

sizeof() ist ohnehin implementation defined, ganz unabhängig was man
reinsteckt.

Viele Grüße,
Johannes

--
"Performance ist nicht das Problem, es läuft ja nachher beides auf der
selben Hardware." -- Hans-Peter Diettrich in d.s.e.
 
Johannes Bauer schrieb:

On 10.10.19 14:07, Heinz Saathoff wrote:

Also dein Beispiel ist dafür, wie übel C ist, aber in Forth kann man
dasselbe machen und in Z80 Assembler ja auch. Grübelgrübel, sind die
Sprachen dann nach deiner Logik nicht genauso übel? Bissl schlechtes
Argument gegen C, dass du dir da rausgesucht hast, merkste selber, oder?

Es wird IMO nicht kritisiert, dass man die Adresse 0 aufrufen kann,
sondern die dafür klammerreiche Syntax.

Ah, okay! Dann ist die Kritik ja tatsächlich noch blöder als ich dachte
und zieht sich ausschließlich an Oberflächlichkeiten hoch.

Ich weiß zwar nicht, wie dass in Forth aussieht oder Z80-Assembler,
aber sinnvoll kann das allemal sein und ist nicht das Übel, was du
hier zu erkennen glaubst.

Moment, ich finde das nicht übel. Wolfgang findet es übel.

Ja, er findet die Syntax dazu übel. Er zeigt aber nicht, wie
es in Forth aussieht.
In 8051 Assembler wär es so:

ljmp 0


Klar ist es nützlich, dass man solche Manipulationen machen kann (und
quasi eine rein numerische Adresse zu einem Funktionszeiger casten) --
aber aus Sicherheitsaspekten ist es halt schon eher schlecht, dass die
Sprache soetwas überhaupt zulässt.

In hosted Umgebungen (Unix, Windows ...) sehe ich auch kaum Anwendung
dafür, aber bei Mikrocontrollern schon.

Ich arbeite z.Z mit den XMC Controllern von Infineon und die haben
Routinen auf dokumentierten Adressen im ROM, die vom Programmiere
genutzt werden können. Dafür ist der Cast eines Wertes in einen
Funktionspointer sinnvoll.


- Heinz
 
Johannes Bauer schrieb:

Häufiger kommt so etwas vor:
# define NEsp0ARR(S,A)  (sizeof(((S*)0)->A)/sizeof(*((S*)0)->A))

sizeof() ist ohnehin implementation defined, ganz unabhängig was man
reinsteckt.

Wobei sizeof vom Compiler ausgewertet wird und nicht zur Laufzeit.
Deshalb wird da auch nichts wirklich dereferenziert.


- Heinz
 
On 10.10.19 15:04, Heinz Saathoff wrote:

Klar ist es nĂźtzlich, dass man solche Manipulationen machen kann (und
quasi eine rein numerische Adresse zu einem Funktionszeiger casten) --
aber aus Sicherheitsaspekten ist es halt schon eher schlecht, dass die
Sprache soetwas ßberhaupt zulässt.

In hosted Umgebungen (Unix, Windows ...) sehe ich auch kaum Anwendung
dafĂźr, aber bei Mikrocontrollern schon.

Hm naja, fĂźr Linux Kernelprogrammierung kommt man z.B. um C nicht herum.
Und ich hab auch schon Sachen fĂźr Hosted-Controller (z.B. Raspberry Pis
oder so) in C geschrieben, um den ganzen bloatigen Overhead zu umgehen,
der durch einen X-Server/Webbrowser/wie auch immer zu Stande kommt.

Aber klar, wenn Performance und Language-Bindings keine Rolle spielen,
nehme ich auch viel lieber Python.

Ich arbeite z.Z mit den XMC Controllern von Infineon und die haben
Routinen auf dokumentierten Adressen im ROM, die vom Programmiere
genutzt werden kĂśnnen. DafĂźr ist der Cast eines Wertes in einen
Funktionspointer sinnvoll.
Ahja, richtig. Hatte ich auch mal bei Stellaris Cortex-M3s, die hatten
safeRTOS im ROM und da war das genauso. Sehr praktische Sache.

Viele Grüße,
Johannes

--
"Performance ist nicht das Problem, es läuft ja nachher beides auf der
selben Hardware." -- Hans-Peter Diettrich in d.s.e.
 
Johannes Bauer wrote:
On 10.10.19 12:42, Wolfgang Allinger wrote:
C_hurts sounds in German like: Tooths hurts ( C_tut_weh :)

in Z80 Assembler ja auch.

Aus reiner Neugier täte mich mal interessieren, wieso
das irgendwie übel sein sollte.

MfG
hjs
 
Am 10.10.2019 um 13:17 schrieb Werner FlĂźgel:
Am 10.10.2019 um 12:42 schrieb Wolfgang Allinger:
C_hurts sounds in German like: Tooths hurts ( C_tut_weh :)
                                 ^^^^^^ Das Word gibt es IMHO nicht.

tooth: der Zahn. Mehrzahl: teeth

Was Du meinst, heißt "toe", Mehrzahl "toes"

IMO meint er eher wC, oder ganz schlimm Wc.
[großes Weh am kleinen Zeh]

DoDi
 
Am 10.10.2019 um 14:40 schrieb Helmut Schellong:

Nein, die Konstruktion wird oft sinnvoll angewandt.

   (* (void(*)())0 )()

Die Konstante 0 wird gecastet in einen Funktionspointer
auf eine Funktion, die nichts retourniert.
Dann wird dieser Funktionspointer explizit dereferenziert
und die Funktion mit Adresse 0 aufgerufen.

Geht das nicht einfacher mit
goto 0;
???

DoDi
 
On 10.10.19 16:56, Hans-Peter Diettrich wrote:

Geht das nicht einfacher mit
  goto 0;
???

Wenn schon, dann "goto *0;". Aber zum einen ist ein goto etwas anderes
als ein Funktionsaufruf, also funktional nicht äquivalent, und zum
anderen machst du damit ja Wolfgang's Narrativ kaputt, darf also nicht sein.

Gruß,
Johannes

--
"Performance ist nicht das Problem, es läuft ja nachher beides auf der
selben Hardware." -- Hans-Peter Diettrich in d.s.e.
 
On 10.10.19 16:50, Hans-Juergen Schneider wrote:
Johannes Bauer wrote:

On 10.10.19 12:42, Wolfgang Allinger wrote:
C_hurts sounds in German like: Tooths hurts ( C_tut_weh :)

in Z80 Assembler ja auch.

Aus reiner Neugier täte mich mal interessieren, wieso
das irgendwie Ăźbel sein sollte.

Es scheint ßbel, wenn einem ein Allingersches Realitätsverzerrungsfeld
die Birne vernebelt.

Gruß,
Johannes

--
"Performance ist nicht das Problem, es läuft ja nachher beides auf der
selben Hardware." -- Hans-Peter Diettrich in d.s.e.
 

Welcome to EDABoard.com

Sponsor

Back
Top