Discussion:
C-Code mit Fehler
(zu alt für eine Antwort)
Helmut Schellong
2014-02-19 08:07:33 UTC
Permalink
Raw Message
int nvidia_sysctl_bus_type(SYSCTL_HANDLER_ARGS)
{
struct nvidia_softc *sc = arg1;
char *bus_type;

if (nvidia_pci_find_capability(sc->dev, PCIR_CAP_ID_AGP) != 0)
sprintf(bus_type, "AGP");
else
if (nvidia_pci_find_capability(sc->dev, PCIR_CAP_ID_EXP) != 0)
bus_type = "PCIe";
else
bus_type = "PCI";

return SYSCTL_OUT(req, bus_type, strlen(bus_type) + 1);
}


Der Code stammt nicht von mir.
make brach ab, weil der Compiler per Option
Warnungen als Fehler bewerten sollte.

Ich wundere mich, daß solch ein Code rausgeht, wo doch make
in 100% aller Fälle abbricht.
--
Mit freundlichen Grüßen
Helmut Schellong ***@schellong.biz
www.schellong.de www.schellong.com www.schellong.biz
http://www.schellong.de/c.htm
Georg Bauhaus
2014-02-19 09:51:55 UTC
Permalink
Raw Message
Post by Helmut Schellong
Ich wundere mich, daß solch ein Code rausgeht, wo doch make
in 100% aller Fälle abbricht.
Vielleicht wegen etwas wie
"which is supposed to be patched by the Makefile of the port" aus
http://lists.freebsd.org/pipermail/freebsd-ports/2013-June/084175.html
?

Leider ist es zu spät, zu ändern, was die Sprachen an
Voreinstellungen für (Zeiger)variable vorschreiben, also
bestenfalls: genullt.
Rainer Weikusat
2014-02-19 11:55:09 UTC
Permalink
Raw Message
Post by Georg Bauhaus
Post by Helmut Schellong
Ich wundere mich, daß solch ein Code rausgeht, wo doch make
in 100% aller Fälle abbricht.
Vielleicht wegen etwas wie
"which is supposed to be patched by the Makefile of the port" aus
http://lists.freebsd.org/pipermail/freebsd-ports/2013-June/084175.html
?
Leider ist es zu spät, zu ändern, was die Sprachen an
Voreinstellungen für (Zeiger)variable vorschreiben, also
bestenfalls: genullt.
bus_type wird in jedem Fall initialisiert und der Code legt nahe, dass
ein Nullzeiger an dieser Stelle keine korrekte Eingabe waere. Man
koennte das ein Defizit des Compilers nennen, andererseits ist das eine
Warnung, dh eine "hoffentlich nuetzliche Compiler-Mitteilung" die eben
manchmal nicht nuetzlich ist, was billigend in Kauf genommen wird:
Deswegen Warnung.
G.B.
2014-02-19 13:36:18 UTC
Permalink
Raw Message
Post by Rainer Weikusat
bus_type wird in jedem Fall initialisiert
Im OP?
Post by Rainer Weikusat
der Code legt nahe, dass
ein Nullzeiger an dieser Stelle keine korrekte Eingabe waere.
Schon, allerdings gäbe es weniger zu rätseln, wenn eine
Deklaration, die mit Absicht ohne Initialisierer sein soll,
explizit gemacht werden müsste, symbolisch:

char* bus_type = #uninitialized;

(Zugestanden, dann gäbe es auch weniger Wissen über Implizites,
Vermutliches und Kontingentes zu haben oder sich anzueignen,
mit dem man sich so kurz darstellen kann.)

Das Ausdrückliche von #uninitialized macht dann eine Warnung
seitens des compilers eher unangebracht, sie müsste weniger
wahrscheinlich in Kauf genommen werden.

Wenn anderenfalls die Norm einen vorhersagbarer Wert für nicht
initialisierte Zeiger vorgegeben würde, dann müsste zum
Bearbeiten des Fehlers auch nur einer (oder maximal eine Handvoll)
beobachtet werden.
Rainer Weikusat
2014-02-19 15:26:53 UTC
Permalink
Raw Message
[...]
Post by G.B.
Post by Rainer Weikusat
der Code legt nahe, dass
ein Nullzeiger an dieser Stelle keine korrekte Eingabe waere.
Schon, allerdings gäbe es weniger zu rätseln, wenn eine
Deklaration, die mit Absicht ohne Initialisierer sein soll,
char* bus_type = #uninitialized;
Insofern man es fuer notwendig haelt, diesen Sachverhalt zu
dokumentieren, waere 'ein Kommentar' das sinnvolle Sprachmittel.
"Code ohne erkennbaren Sinn" ist bloss "Code ohne erkennbaren Sinn".

[...]
Post by G.B.
Wenn anderenfalls die Norm einen vorhersagbarer Wert für nicht
initialisierte Zeiger vorgegeben würde, dann müsste zum
Bearbeiten des Fehlers auch nur einer (oder maximal eine Handvoll)
beobachtet werden.
Damit sowas sinnvoll funktionieren koennte, muesste es fuer jegliche
moeglicherweise benutzte Hardware garantiert einen 'ungueltigen'
Zeigerwert geben, dessen Benutzung als waere es ein gueltiger Zeiger
garantiert harmlos ist (anstatt zB in einer Interruptvektorentabelle
herumzuschreiben was so ziemlich "garantiert nicht harmlos" ist). Das
ist allerdings nicht der Fall. Einer C-Implementierung stuende es zwar
frei, ein solches Feature auch dann zur Verfuegung zu stellen, wenn "die
Hardware" nichts davon weiss, aber "stuende es zwar frei, X zu haben"
heisst eben auch "ebenso stuende es ihr frei, X nicht zu haben".
Georg Bauhaus
2014-02-19 15:56:31 UTC
Permalink
Raw Message
Post by Rainer Weikusat
Post by G.B.
char* bus_type = #uninitialized;
Insofern man es fuer notwendig haelt, diesen Sachverhalt zu
dokumentieren, waere 'ein Kommentar' das sinnvolle Sprachmittel.
"Code ohne erkennbaren Sinn" ist bloss "Code ohne erkennbaren Sinn".
Kommentare sind nicht von der Sprache erfordert. Insofern kann
ein ohne Weiteres sinnloses "#uninitialized" wenigstens (a) einen
formalen Anreiz bieten, über die Deklaration nachzudenken,
und (b) während eines reviews auf so gekennzeichnete Deklarationen
aufmerksam machen. Damit wird der Sinn in Teilen besser erkennbar
als an keinem Text.
Rainer Weikusat
2014-02-19 16:22:10 UTC
Permalink
Raw Message
Post by Georg Bauhaus
Post by Rainer Weikusat
Post by G.B.
char* bus_type = #uninitialized;
Insofern man es fuer notwendig haelt, diesen Sachverhalt zu
dokumentieren, waere 'ein Kommentar' das sinnvolle Sprachmittel.
"Code ohne erkennbaren Sinn" ist bloss "Code ohne erkennbaren Sinn".
Kommentare sind nicht von der Sprache erfordert. Insofern kann
ein ohne Weiteres sinnloses "#uninitialized" wenigstens (a) einen
formalen Anreiz bieten, über die Deklaration nachzudenken,
Im Sinne von "was soll der Quatsch"? Dann darf man froehlich
drauflosraten, denn Code, den man fuer sinnlos haelt, koennte einen Sinn
haben, den man noch nicht verstanden hat, und universelle Konventionen
gibt es hier keine (fuer Leute, die lieber "Autoritaeten" als
"Argumente" wollen: "Denk doch mal nach, McFly! Warum macht das lint
so?").
Georg Bauhaus
2014-02-19 17:10:51 UTC
Permalink
Raw Message
Post by Rainer Weikusat
Post by Georg Bauhaus
Kommentare sind nicht von der Sprache erfordert. Insofern kann
ein ohne Weiteres sinnloses "#uninitialized" wenigstens (a) einen
formalen Anreiz bieten, über die Deklaration nachzudenken,
Im Sinne von "was soll der Quatsch"?
Ja, zu viel Vortrag von Wissen über zu viel ausgelassenen
Text scheint mir in Bezug auf Quelltexten je nach Maß nicht
immer hilfreich, das ist eher etwas für voraussetzungsvolle,
formale Fachpublikationen, denke ich. Denn ...
Post by Rainer Weikusat
Dann darf man froehlich drauflosraten,
Raten ist die unproduktivste und ennervierendste Form, sich
Quelltexten zu nähern. Nicht jeder Leser unterstellt unverstandenem
Text Sinnlosigkeit, das scheint mir eine unzulässige Verallgemeinerung.

Aber: Wenn ein Autor von der Sprache eingeladen (getreten) wird, besser
zu verstehen und zu dokumentieren, was er/sie da deklariert, wird das
in einem kooperativen Umfeld vorteilhaft sein: erwiesenermaßen - wie
man auch am OP sehen kann - ist diese Art Fehler einfach zu verbreitet,
um die Voreinstellung (nix) durch die Sprachnorm auch im Nachhinein
rechtfertigen zu können. (Für Freunde von Auoritäten: vgl. Ritter Tonys
Milliarden-Dollar-Fehler.) ELisp erscheint da beispielhaft, insofern
offenbar Viele sich an die funktional überflüssige Konvention
halten, einen doc string in die Funktions-Prozedur zu schreiben.
Vielleicht tun sie es einfach deswegen, weil es geht und weil
das Vorbild (ELisp) es tut?
Rainer Weikusat
2014-02-19 17:53:37 UTC
Permalink
Raw Message
Post by Georg Bauhaus
Post by Rainer Weikusat
Post by Georg Bauhaus
Kommentare sind nicht von der Sprache erfordert. Insofern kann
ein ohne Weiteres sinnloses "#uninitialized" wenigstens (a) einen
formalen Anreiz bieten, über die Deklaration nachzudenken,
Im Sinne von "was soll der Quatsch"?
Ja, zu viel Vortrag von Wissen über zu viel ausgelassenen
Text scheint mir in Bezug auf Quelltexten je nach Maß nicht
immer hilfreich, das ist eher etwas für voraussetzungsvolle,
formale Fachpublikationen, denke ich. Denn ...
Post by Rainer Weikusat
Dann darf man froehlich drauflosraten,
Raten ist die unproduktivste und ennervierendste Form, sich
Quelltexten zu nähern. Nicht jeder Leser unterstellt unverstandenem
Text Sinnlosigkeit, das scheint mir eine unzulässige
Verallgemeinerung.
vgl

,----
|Im Sinne von "was soll der Quatsch"? Dann darf man froehlich
|drauflosraten, denn Code, den man fuer sinnlos haelt, koennte einen Sinn
|haben, den man noch nicht verstanden hat
`----

Im uebrigen stellt "koennte einen Sinn habe, den man [...]" meiner
Erfahrung nach einen "unzulaessigen Optimismus" dar --- Menschen nehmen
"im allgemeinen" an, das alles, was sie nicht ohne Nachdenken verstehen,
falsch und unsinnnig ist, und deswegen geschrieben oder gesagt wurde,
weil derjenige, der das tat, nicht mehr alle Tassen im Schrank hat bzw
dort noch nie welche hatte.
Post by Georg Bauhaus
Aber: Wenn ein Autor von der Sprache eingeladen (getreten) wird, besser
zu verstehen und zu dokumentieren, was er/sie da deklariert, wird das
in einem kooperativen Umfeld vorteilhaft sein: erwiesenermaßen - wie
man auch am OP sehen kann - ist diese Art Fehler einfach zu verbreitet,
um die Voreinstellung (nix) durch die Sprachnorm auch im Nachhinein
rechtfertigen zu können.
Meiner Erfahrung nach ist das kein haeufiger Fehler und "der Compiler" (im
Folgenden 'gcc' genannt :-) produziert fuer "zweifelhafte Situationen"
im Zweifelsfall Warnungen, dh er uebersieht manchmal Initialisierungen
aber keine Nichtinitialisierungen. Da es (s. Vorgaengerposting) keinen
Wert gibt, den man sicher 'zur automatischen Initialsierung' verwenden
koennte, weil jeder moegliche Wert nicht nur moeglicherweise falsch
sondern moeglicherweise sogar katastrophal falsch ist, scheint mir diese
"Arbeitsteilung" angemessen.

Davon unbenommen bin ich allerdings weiterhin der Ansicht, dass man zu
Dokumentationszwecken Dokumentation schreiben sollte, und nicht "Code
ohne Sinn".
Rainer Weikusat
2014-02-19 11:51:38 UTC
Permalink
Raw Message
Post by Helmut Schellong
int nvidia_sysctl_bus_type(SYSCTL_HANDLER_ARGS)
{
struct nvidia_softc *sc = arg1;
char *bus_type;
if (nvidia_pci_find_capability(sc->dev, PCIR_CAP_ID_AGP) != 0)
sprintf(bus_type, "AGP");
else
if (nvidia_pci_find_capability(sc->dev, PCIR_CAP_ID_EXP) != 0)
bus_type = "PCIe";
else
bus_type = "PCI";
return SYSCTL_OUT(req, bus_type, strlen(bus_type) + 1);
}
Der Code stammt nicht von mir.
make brach ab, weil der Compiler per Option
Warnungen als Fehler bewerten sollte.
Falls das das ist, was ich annehme ("bus_type may be used uninitialized"
...) ist es ein schoenes Beispiel dafuer das "-Werror" durch 'patchen'
deswegen, der es zu benutzen versucht, behoben werden sollte ...
Rainer Weikusat
2014-02-19 11:52:14 UTC
Permalink
Raw Message
Post by Helmut Schellong
int nvidia_sysctl_bus_type(SYSCTL_HANDLER_ARGS)
{
struct nvidia_softc *sc = arg1;
char *bus_type;
if (nvidia_pci_find_capability(sc->dev, PCIR_CAP_ID_AGP) != 0)
sprintf(bus_type, "AGP");
else
if (nvidia_pci_find_capability(sc->dev, PCIR_CAP_ID_EXP) != 0)
bus_type = "PCIe";
else
bus_type = "PCI";
return SYSCTL_OUT(req, bus_type, strlen(bus_type) + 1);
}
Der Code stammt nicht von mir.
make brach ab, weil der Compiler per Option
Warnungen als Fehler bewerten sollte.
Falls das das ist, was ich annehme ("bus_type may be used uninitialized"
...) ist es ein schoenes Beispiel dafuer das "-Werror" durch 'patchen'
desjenigen, der es zu benutzen versucht, behoben werden sollte ...
Stefan Reuther
2014-02-19 20:28:08 UTC
Permalink
Raw Message
Post by Rainer Weikusat
Post by Helmut Schellong
int nvidia_sysctl_bus_type(SYSCTL_HANDLER_ARGS)
{
struct nvidia_softc *sc = arg1;
char *bus_type;
if (nvidia_pci_find_capability(sc->dev, PCIR_CAP_ID_AGP) != 0)
sprintf(bus_type, "AGP");
else
if (nvidia_pci_find_capability(sc->dev, PCIR_CAP_ID_EXP) != 0)
bus_type = "PCIe";
else
bus_type = "PCI";
return SYSCTL_OUT(req, bus_type, strlen(bus_type) + 1);
}
Der Code stammt nicht von mir.
make brach ab, weil der Compiler per Option
Warnungen als Fehler bewerten sollte.
Falls das das ist, was ich annehme ("bus_type may be used uninitialized"
...) ist es ein schoenes Beispiel dafuer das "-Werror" durch 'patchen'
desjenigen, der es zu benutzen versucht, behoben werden sollte ...
Was nichts daran ändert, dass die Warnung / der Fehler hier absolut
berechtigt ist, da der 'sprintf'-Zweig garantiert eine uninitialisierte
Variable verwenden wird.

Für mich sieht das aus wie ein in die Hose gegangener Merge zweier
Versionen der Quelldatei.


Stefan
Rainer Weikusat
2014-02-19 21:17:46 UTC
Permalink
Raw Message
Post by Stefan Reuther
Post by Rainer Weikusat
Post by Helmut Schellong
int nvidia_sysctl_bus_type(SYSCTL_HANDLER_ARGS)
{
struct nvidia_softc *sc = arg1;
char *bus_type;
if (nvidia_pci_find_capability(sc->dev, PCIR_CAP_ID_AGP) != 0)
sprintf(bus_type, "AGP");
else
if (nvidia_pci_find_capability(sc->dev, PCIR_CAP_ID_EXP) != 0)
bus_type = "PCIe";
else
bus_type = "PCI";
return SYSCTL_OUT(req, bus_type, strlen(bus_type) + 1);
}
Der Code stammt nicht von mir.
make brach ab, weil der Compiler per Option
Warnungen als Fehler bewerten sollte.
Falls das das ist, was ich annehme ("bus_type may be used uninitialized"
...) ist es ein schoenes Beispiel dafuer das "-Werror" durch 'patchen'
desjenigen, der es zu benutzen versucht, behoben werden sollte ...
Was nichts daran ändert, dass die Warnung / der Fehler hier absolut
berechtigt ist, da der 'sprintf'-Zweig garantiert eine uninitialisierte
Variable verwenden wird.
Ja. Habe ich mir (urspruenglich) nicht genau genug angesehen.
Rainer Weikusat
2014-02-19 15:05:47 UTC
Permalink
Raw Message
Post by Helmut Schellong
int nvidia_sysctl_bus_type(SYSCTL_HANDLER_ARGS)
{
struct nvidia_softc *sc = arg1;
char *bus_type;
if (nvidia_pci_find_capability(sc->dev, PCIR_CAP_ID_AGP) != 0)
sprintf(bus_type, "AGP");
else
if (nvidia_pci_find_capability(sc->dev, PCIR_CAP_ID_EXP) != 0)
bus_type = "PCIe";
else
bus_type = "PCI";
return SYSCTL_OUT(req, bus_type, strlen(bus_type) + 1);
}
Hierzu waere noch anzumerken, dass man die vorsaetzliche (fahrlaessige?)
Compiler-Verwirrung einfach vermeiden kann:

int nvidia_sysctl_bus_type(SYSCTL_HANDLER_ARGS)
{
struct nvidia_softc *sc = arg1;
char *bus_type;

bus_type = "PCI";
if (nvidia_pci_find_capability(sc->dev, PCIR_CAP_ID_AGP) != 0)
sprintf(bus_type, "AGP");
else
if (nvidia_pci_find_capability(sc->dev, PCIR_CAP_ID_EXP) != 0)
bus_type = "PCIe";

return SYSCTL_OUT(req, bus_type, strlen(bus_type) + 1);
}

was normalerweise sogar noch in besserem Code resultieren sollte.
Rainer Weikusat
2014-02-19 18:03:02 UTC
Permalink
Raw Message
Post by Rainer Weikusat
Post by Helmut Schellong
int nvidia_sysctl_bus_type(SYSCTL_HANDLER_ARGS)
{
struct nvidia_softc *sc = arg1;
char *bus_type;
if (nvidia_pci_find_capability(sc->dev, PCIR_CAP_ID_AGP) != 0)
sprintf(bus_type, "AGP");
else
if (nvidia_pci_find_capability(sc->dev, PCIR_CAP_ID_EXP) != 0)
bus_type = "PCIe";
else
bus_type = "PCI";
return SYSCTL_OUT(req, bus_type, strlen(bus_type) + 1);
}
Hierzu waere noch anzumerken, dass man die vorsaetzliche (fahrlaessige?)
int nvidia_sysctl_bus_type(SYSCTL_HANDLER_ARGS)
{
struct nvidia_softc *sc = arg1;
char *bus_type;
bus_type = "PCI";
if (nvidia_pci_find_capability(sc->dev, PCIR_CAP_ID_AGP) != 0)
sprintf(bus_type, "AGP");
Grrr ...

bus_type = "AGP";

Meine "Groesste anzunehmende Bloedsinnswahrscheinlichkeit" fuer
BSD(?)-code scheint auch "unzulaessig optimistisch" ...
Heinz Saathoff
2014-02-20 08:18:37 UTC
Permalink
Raw Message
Post by Rainer Weikusat
Hierzu waere noch anzumerken, dass man die vorsaetzliche (fahrlaessige?)
Post by Helmut Schellong
int nvidia_sysctl_bus_type(SYSCTL_HANDLER_ARGS)
{
struct nvidia_softc *sc = arg1;
char *bus_type;
bus_type = "PCI";
if (nvidia_pci_find_capability(sc->dev, PCIR_CAP_ID_AGP) != 0)
sprintf(bus_type, "AGP");
Grrr ...
bus_type = "AGP";
Was immer noch nichts am eigentlichen Fehler, dem
sprintf(bus_type, "AGP");
ändert.
Zumindest, wenn String-Literale Read-Only sind, knallt es bei sprintf
immer noch.


- Heinz
Rainer Weikusat
2014-02-20 09:47:11 UTC
Permalink
Raw Message
Post by Heinz Saathoff
Post by Rainer Weikusat
Hierzu waere noch anzumerken, dass man die vorsaetzliche (fahrlaessige?)
Post by Helmut Schellong
int nvidia_sysctl_bus_type(SYSCTL_HANDLER_ARGS)
{
struct nvidia_softc *sc = arg1;
char *bus_type;
bus_type = "PCI";
if (nvidia_pci_find_capability(sc->dev, PCIR_CAP_ID_AGP) != 0)
sprintf(bus_type, "AGP");
Grrr ...
bus_type = "AGP";
Was immer noch nichts am eigentlichen Fehler, dem
sprintf(bus_type, "AGP");
ändert.
Zumindest, wenn String-Literale Read-Only sind, knallt es bei sprintf
immer noch.
Der "eigentliche Fehler" besteht darin, ein String-Literal ohne Grund an
einen Ort zu kopieren, auf den ein uninitialisierter Zeiger zeigt (das
das dann auch noch via sprintf gemacht wird anstatt via strcpy dient als
zusaetzliche Verdeutlichung der "Scheissegal, funzt doch!"-Mentalitaet,
der solcher Code entspringt). Es wird nichts in ein String-Literal
kopiert, obwohl mich

sprintf("AGP", bus_type) /* benutzt 'eh keiner */

in diesem Kontext auch nicht ueberraschen wuerde ...
Heinz Saathoff
2014-02-20 12:28:46 UTC
Permalink
Raw Message
On Thu, 20 Feb 2014 09:47:11 +0000, Rainer Weikusat
Post by Rainer Weikusat
Post by Heinz Saathoff
Post by Rainer Weikusat
Post by Helmut Schellong
int nvidia_sysctl_bus_type(SYSCTL_HANDLER_ARGS)
{
struct nvidia_softc *sc = arg1;
char *bus_type;
bus_type = "PCI";
if (nvidia_pci_find_capability(sc->dev, PCIR_CAP_ID_AGP) != 0)
sprintf(bus_type, "AGP");
Grrr ...
bus_type = "AGP";
Was immer noch nichts am eigentlichen Fehler, dem
sprintf(bus_type, "AGP");
ändert.
Zumindest, wenn String-Literale Read-Only sind, knallt es bei sprintf
immer noch.
Der "eigentliche Fehler" besteht darin, ein String-Literal ohne Grund an
einen Ort zu kopieren, auf den ein uninitialisierter Zeiger zeigt (das
das dann auch noch via sprintf gemacht wird anstatt via strcpy dient als
zusaetzliche Verdeutlichung der "Scheissegal, funzt doch!"-Mentalitaet,
der solcher Code entspringt).
Das passiert im originalen Code und ist natürlich der ursprüngliche
Fehler.
Post by Rainer Weikusat
Es wird nichts in ein String-Literal
kopiert
Das passiert aber bei diesem Codefragment, wenn Bedingung != 0 ist:
bus_type = "PCI";
if( bedingung )
sprintf(bus_type, "AGP");
Post by Rainer Weikusat
, obwohl mich
sprintf("AGP", bus_type) /* benutzt 'eh keiner */
in diesem Kontext auch nicht ueberraschen wuerde ...
was ungefähr obigem entspricht.



- Heinz
Rainer Weikusat
2014-02-20 12:46:57 UTC
Permalink
Raw Message
Post by Heinz Saathoff
On Thu, 20 Feb 2014 09:47:11 +0000, Rainer Weikusat
Post by Rainer Weikusat
Post by Heinz Saathoff
Post by Rainer Weikusat
Post by Helmut Schellong
int nvidia_sysctl_bus_type(SYSCTL_HANDLER_ARGS)
{
struct nvidia_softc *sc = arg1;
char *bus_type;
bus_type = "PCI";
if (nvidia_pci_find_capability(sc->dev, PCIR_CAP_ID_AGP) != 0)
sprintf(bus_type, "AGP");
Grrr ...
bus_type = "AGP";
Was immer noch nichts am eigentlichen Fehler, dem
sprintf(bus_type, "AGP");
ändert.
Zumindest, wenn String-Literale Read-Only sind, knallt es bei sprintf
immer noch.
Der "eigentliche Fehler" besteht darin, ein String-Literal ohne Grund an
einen Ort zu kopieren, auf den ein uninitialisierter Zeiger zeigt (das
das dann auch noch via sprintf gemacht wird anstatt via strcpy dient als
zusaetzliche Verdeutlichung der "Scheissegal, funzt doch!"-Mentalitaet,
der solcher Code entspringt).
Das passiert im originalen Code und ist natürlich der ursprüngliche
Fehler.
Post by Rainer Weikusat
Es wird nichts in ein String-Literal
kopiert
bus_type = "PCI";
if( bedingung )
sprintf(bus_type, "AGP");
Na und? Wie ich bereits 2x geschrieben hatte, habe ich urspruenglich nur
die zwei unteren Zweige tatsaechlich gelesen und einfach angenommen,
dass der oberste demselben Muster folgen wuerde anstatt des
katastrophalen Unfugs, den er tatsaechlich enthielt. Auf dieser Basis
ist auch das "am weitesten oben" zitierte Posting geschrieben
worden. Damit das ganze sinnvoll wird, muss man aber nicht nur den etwas
unsinnigen else-Zweig entfernen, sondern ausserdem noch den
sprint-Bloedsinn entsorgen, dh

sprintf(bus_type, "AGP");

durch

bus_type = "AGP";

ersetzen.
Rainer Weikusat
2014-02-20 13:20:24 UTC
Permalink
Raw Message
Rainer Weikusat <***@mobileactivedefense.com> writes:

[...]
Post by Rainer Weikusat
Post by Helmut Schellong
int nvidia_sysctl_bus_type(SYSCTL_HANDLER_ARGS)
{
struct nvidia_softc *sc = arg1;
char *bus_type;
bus_type = "PCI";
if (nvidia_pci_find_capability(sc->dev, PCIR_CAP_ID_AGP) != 0)
sprintf(bus_type, "AGP");
[...]
Post by Rainer Weikusat
sondern ausserdem noch den
sprint-Bloedsinn entsorgen, dh
sprintf(bus_type, "AGP");
durch
bus_type = "AGP";
ersetzen.
BTW: Als Interpretation wuerde ich hier folgendes Vorschlagen: Solche
Fehler sind sogar in Code, mit dem man nicht vertraut ist, und dessen
Kontrollfluss komplizierter als notwendig ist, und ohne maschinelle
Unterstuetzung, einfach dadurch zu finden, dass man sich das ganze
nochmal von vorne nach hinten durchliest, sobald einen gewissen,
geistigen Abstand von der letzten Aenderung gefunden hat.
Rainer Weikusat
2014-02-20 12:51:44 UTC
Permalink
Raw Message
Post by Heinz Saathoff
Post by Rainer Weikusat
Hierzu waere noch anzumerken, dass man die vorsaetzliche (fahrlaessige?)
Post by Helmut Schellong
int nvidia_sysctl_bus_type(SYSCTL_HANDLER_ARGS)
{
struct nvidia_softc *sc = arg1;
char *bus_type;
bus_type = "PCI";
if (nvidia_pci_find_capability(sc->dev, PCIR_CAP_ID_AGP) != 0)
sprintf(bus_type, "AGP");
Grrr ...
bus_type = "AGP";
Was immer noch nichts am eigentlichen Fehler, dem
sprintf(bus_type, "AGP");
ändert.
Ich erlaube mir hier ausserdem noch, diesen Text als "Beweisstueck A"
fuer meine anderenorts aufgestellte Behauptung, das Menschen normalerweise
nicht darueber nachdenken, welchen Sinn etwas, das sie sich nicht erklaeren
koennen, vielleicht haben koennte, anzufuehren.
Helmut Schellong
2014-02-20 18:55:54 UTC
Permalink
Raw Message
[...]
Post by Rainer Weikusat
Post by Rainer Weikusat
Hierzu waere noch anzumerken, dass man die vorsaetzliche (fahrlaessige?)
int nvidia_sysctl_bus_type(SYSCTL_HANDLER_ARGS)
{
struct nvidia_softc *sc = arg1;
char *bus_type;
bus_type = "PCI";
if (nvidia_pci_find_capability(sc->dev, PCIR_CAP_ID_AGP) != 0)
sprintf(bus_type, "AGP");
Grrr ...
bus_type = "AGP";
Genau das ist sicherlich die beste Fehlerbeseitigung.
Daß da sprintf auftaucht, ist konzeptionell hochgradig seltsam.
Post by Rainer Weikusat
Meine "Groesste anzunehmende Bloedsinnswahrscheinlichkeit" fuer
BSD(?)-code scheint auch "unzulaessig optimistisch" ...
Man könnte auch
bus_type = "AGP";
vor dem ersten if setzen
und sprintf() ersatzlos entfernen.

Das wäre aber eine sehr verschrobene Fehlerbeseitigung.
--
Mit freundlichen Grüßen
Helmut Schellong ***@schellong.biz
www.schellong.de www.schellong.com www.schellong.biz
http://www.schellong.de/c.htm
Helmut Schellong
2014-02-20 19:02:16 UTC
Permalink
Raw Message
Post by Rainer Weikusat
Post by Helmut Schellong
int nvidia_sysctl_bus_type(SYSCTL_HANDLER_ARGS)
[...]
Post by Rainer Weikusat
Grrr ...
bus_type = "AGP";
Meine "Groesste anzunehmende Bloedsinnswahrscheinlichkeit" fuer
BSD(?)-code scheint auch "unzulaessig optimistisch" ...
Das ist Code des neuesten, empfohlenen Nvidia-Treibers von Nvidia.
Driver "nvidia"
#Driver "nv"
Ich freue mich, daß Nvidia das für FreeBSD ziemlich intensiv macht.
--
Mit freundlichen Grüßen
Helmut Schellong ***@schellong.biz
www.schellong.de www.schellong.com www.schellong.biz
http://www.schellong.de/c.htm
Loading...