1 | |
2 | |
3 | |
4 | |
5 | |
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
src/cap_measure.c:24:18: error: left shift count is negative
[-Werror=shift-count-negative]
return x << shift;
aber wenn ich das const ertferne:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
kompiliert es ohne Fehler!
|
Anzeige
|
gcc bug (diesmal wirklich): "shift count is negative"
src/cap_measure.c:24:18: error: left shift count is negative
[-Werror=shift-count-negative]
return x << shift;
aber wenn ich das const ertferne:
kompiliert es ohne Fehler!
Gast
#5947636
Schön. Eröffne nen Bug: https://gcc.gnu.org/bugzilla/ Hat jemand einen aktuellen gcc und kann bestätigen daß das dort immer noch auftritt? Meiner ist die letzte Version die das offizielle ARM ppa ausspuckt, auf der ARM Webseite gibts aber schon neuere zum direkten Download.
Gast
#5947655
online compiler sind dein Freund (bei so kurzen Codeschnippeseln), da kannst du von verschiedensten Compilern die Ergebnisse vergleichen. Bernd K. schrieb: > kompiliert es ohne Fehler! Naja, ohne Fehler compiliert es auch so schon, und das Ergebnis ist korrekt. Es gibt ja keinen Fehler, sondern eine Warnung. Selbst die Warnung ist für sich genommen nicht falsch: der shift count an dieser Stelle wäre ja tatsächlich negativ – nur dass die Stelle eben aufgrund der äußeren Umstände garantiert nicht erreicht wird (was sich ja auch im generierten Code reflektiert). Insofern ist die Warnung verwirrend, aber eher eine Unschönheit denn ein tatsächlicher Bug. Aber wenn du es reportest, vielleicht ließe es sich ja einfach beheben, und jemand erbarmt sich. Hab's gerade auf einem (AVR-)GCC 9.1.0 probiert, gleiches Verhalten. Reporte es daher gegen diese Version, das erhöht die Chance, dass es jemanden bei GCC interessiert. ;-)
Das tritt auch auf nem 9.2er x86 gcc auf. Der passende Check für die Warnung wird wohl einfach keine branches und keine nicht-konstanten shift offsets prüfen. Ist jetzt wirklich nichts weltbewegendes. Das ganze gibt nur nen Fehler weil du die Warnung per Compileroption zum Fehler machst. Bernd K. schrieb: > Hat jemand einen aktuellen gcc und kann bestätigen daß das dort immer > noch auftritt? Nein, aber es ist nicht auf den ARM-GCC beschränkt. Mit MinGW32 5.1.0 läßt sich die Meldung reproduzieren. Jörg W. schrieb: > Es gibt ja keinen Fehler, sondern eine Warnung. Oh, da ist mir mein allgegenwärtiges -Werror auf die Füße gefallen. Aber auch eine Warnung ist natürlich unschön. Zum Glück wirft der Optimizer auch dann das if und den unzutreffenden Branch wenn shift nicht als const deklariert ist solange der Ausdruck 6 - 13 zur Kompilezeit konstant ist (was bei mir der Fall ist weil das aus Makroauflösungen mit literalen Konstanten kommt). Hab mir jetzt sowas gebaut:
das schluckt er überall ohne zu meckern. Wenn ich mal mehr Zeit hab mach ich nen Bugreport.
Gast
#5948239
Jörg W. schrieb: > Selbst die Warnung ist für sich genommen nicht falsch: der shift count > an dieser Stelle wäre ja tatsächlich negativ – nur dass die Stelle eben > aufgrund der äußeren Umstände garantiert nicht erreicht wird (was sich > ja auch im generierten Code reflektiert). Insofern ist die Warnung > verwirrend, aber eher eine Unschönheit denn ein tatsächlicher Bug. Das ist ganz klar und eindeutig ein Bug. Die Begründung, warum das ein Bug sein muss, ist überaus simpel: Es gibt keine Möglichkeit, die Warnung zu verhindern, ohne den KORREKTEN Code substantiell zu ändern. Das sollte NIEMALS passieren. Das konterkariert den Sinn der statischen Codeanalyse und unterminiert ihre praktische Nutzbarkeit als Sicherungsmechanismus.
Gast
#5948250
Bernd K. schrieb: > Hab mir jetzt sowas gebaut: > #define SHIFT_LEFT(x, y) ... : (x) >> -(y)) doubleplusungood leo
Gast
#5948265
Ich hoffe ja, dass euch das Schieben von vorzeihenbehafteten Variablen irgendwann um die Ohren fliegt. c-hater schrieb: > Die Begründung, warum das ein Bug sein muss, ist überaus simpel: Es gibt > keine Möglichkeit, die Warnung zu verhindern, ohne den KORREKTEN Code > substantiell zu ändern. Doch, natürlich gibt es die. Aber das wissen C-Hasser natürlich nicht, müssen sie auch nicht. Bernd K. schrieb: > Hab mir jetzt sowas gebaut:#define SHIFT_LEFT(x, y) ((y) > 0 ? (x) > << (y) : (x) >> -(y)) > #define SHIFT_RIGHT(x, y) ((y) > 0 ? (x) >> (y) : (x) << -(y)) > das schluckt er überall ohne zu meckern. Hast Du sonst nichts zu tun?
Gast
#5948350
Jörg W. schrieb: > Doch, natürlich gibt es die. Zeigen!
Gast
#5948364
Das ist kein Bug Aus dem freien Draft: The integer promotions are performed on each of the operands. The type of the result is that of thepromoted left operand. If the value of the right operand is negative or is greater than or equal to thewidth of the promoted left operand, the behavior is undefined. https://web.archive.org/web/20181230041359if_/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf Grüße,
Gast
#5948366
Nachtrag: im Kapitel 6.5.7 Bitwise shift operators Johann J. schrieb: > Bernd K. schrieb: >> Hab mir jetzt sowas gebaut:#define SHIFT_LEFT(x, y) ((y) > 0 ? (x) >> << (y) : (x) >> -(y)) >> #define SHIFT_RIGHT(x, y) ((y) > 0 ? (x) >> (y) : (x) << -(y)) >> das schluckt er überall ohne zu meckern. > > Hast Du sonst nichts zu tun? Das Freihalten der Buildkonsole von jeglichen Warnungen gehört zu meinen Top-Prioritäten. Die Komplexität mehrere Projekte gleichzeitig die ich jederzeit (oder auf Zuruf kurzfristig wieder) vollständig überblicken muß erlaubt nicht das allergeringste Einfallstor für mögliches Chaos, ich dulde nicht das geringste inhaltsleere Rauschen das zusätzlich in meinem Informationszugang hineindrängt und ihn verstopft! Das Forum hier ist übrigens eine der wenigen Ausnahmen von dieser Regel die ich erlaube! Mit den beiden obigen Zeilen wird der Code aus Post #1 auch klarer und kleiner da ich jetzt nicht mehr für jeden shift umständlich 2 if-Zweige hinschreiben muß. Meine Haupsorge bei irgendeinem Kompromiss wär die Optimierbarkeit gewesen, aber wie sich gezeigt hat hat die Constant-Propagation genug Macht um das auch so zu schaffen. nicht"Gast" schrieb: > Das ist kein Bug In obigem Code ist die Shiftcount garantiert nicht negativ. c-hater schrieb: > Jörg W. schrieb: > >> Doch, natürlich gibt es die. > > Zeigen! Warnung -Wshift-count-negative, option zum ausschalten folglich -Wno-shift-count-negative. Ich kompiliere meine Programme immer mit -Werror, einzelne Warnungen ausschalten mach ich nur wenn wirklich nötig wegen so einem Compiler Bug. Das finde ich auch sehr ärgerlich, wenn es mal nötig wird. Bei späteren Versionen sollte man das dann nicht vergessen, wieder zu entfernen, wenn es mal behoben wurde. nicht"Gast" schrieb: > Das ist kein Bug Doch, die betroffene stelle kann nie erreicht werden, wenn kein undefinierter Code ausgeführt werden kann, ist es in Ordnung. Es ist egal, ob der Compiler den Code weglasst, oder dort sonst was hinpflanzt, aber falsch ist es nicht. Das er warnt ist aber klar falsch. Ein false positive. nicht"Gast" schrieb: > Das ist kein Bug > > Aus dem freien Draft: > [...] Andere Baustelle. Ich hab nämlich gar keine negativen shifts, das kann ich sogar zur Compilezeit schon beweisen, der Compiler ist aber leider anderer Meinung. A. K. schrieb: > nicht"Gast" schrieb: >> Das ist kein Bug > > In obigem Code ist die Shiftcount garantiert nicht negativ. Doch, ist er. Bernd K. schrieb: > src/cap_measure.c:24:18: error: left shift count is negative > [-Werror=shift-count-negative] > return x << shift; Die Zeile wird zwar niemals ausgeführt, aber der Code ist trotzdem UB. Oliver
Gast
#5948387
Bernd K. schrieb: > Das Freihalten der Buildkonsole von jeglichen Warnungen gehört zu meinen > Top-Prioritäten. Das ist lobenswert, aber hier zu spaet. Wenn ein Leftshift ploetzlich in die andere Richtung losgeht, ist schon voher was faul. Ein assert(3) ist die bessere Loesung und zeigt direkt das Problem auf anstatt es zu verstecken. leo Oliver S. schrieb: > Die Zeile wird zwar niemals ausgeführt, aber der Code ist trotzdem UB. Dieser Logik folgend wäre auch return p ? *p : 0; für p==NULL undefiniert. Nope: Erst die ausgeführte Operation "negative shift" ist undefiniert. Ebenso wie es erst der Zugriff über einen NULL Pointer ist. Werden sie nicht ausgeführt, ist nichts undefiniert. A. K. schrieb: > In obigem Code ist die Shiftcount garantiert nicht negativ. Durch das Entfernen des "const" ist es aber nur noch eine Optimierung, den Codepfad nicht zu betrachten.
Beitrag #5948400 wurde von einem Moderator gelöscht.
Mir sieht das so aus, als ob der gcc da auf sein eigenes Hütchenspiel hereinfällt: An einer Stelle weiß er, dass die Zahl negativ ist, an der anderen nicht. leo schrieb: > Wenn ein Leftshift ploetzlich in > die andere Richtung losgeht, ist schon voher was faul. Nein, der geht nicht "plötzlich" in die andere Richtung. Die Shiftweite in meinem Beispiel war schon immer eine literale Konstante irgendwo mit zwei simplen #define festgenagelt und war immer positiv und zur Kompilezeit bekannt. Jetzt hab ich den Code an einigen Stellen erweitert um später auch negative shifts dort haben zu können weil sich ein neuer Anwendungsfall ergab. Die Absicht ist daß der Optimizer je nachdem in welchem Projekt ich den Code da oben¹ verwende beim Kompilieren entweder nur den if oder nur den else Zweig stehen lässt. Wenn ich das if/else durch dem ternären Operator ersetze klappts und er meckert nicht, obwohl die Logik beim Prüfen der Plausibilität die selbe sein müsste. --- ¹ Der Code ist Teil eines makrobasierten Templates das ich sehr häufig brauche, mehrere Varianten der selben Funktion werden zur Kompilezeit generiert mit unterschiedlichen konstanten Parametern und unterschiedlichen Datentypen. Zum Beispiel ein Moving Average der Länge n von int16_t Werten. Oder uint8_t oder double. Oder ein Gauss-Filter für int32_t. Solche Sachen lass ich dann mit einer einzigen Zeile Code generieren wo immer ich schnell mal einen brauche.
Gast
#5948432
Bernd K. schrieb: > Jetzt hab ich den Code an einigen Stellen erweitert um später auch > negative shifts dort haben zu können Das wird ja immer schlimmer ... Du schreibst also nicht sauberen Code sondern sauber obfuscated Code. leo Daniel A. schrieb: > Ich kompiliere meine Programme immer mit -Werror, Was durchaus vernünftig ist, machen wir in der Firma auch so. > einzelne Warnungen > ausschalten mach ich nur wenn wirklich nötig Schalt sie doch für genau die eine Funktion aus. leo schrieb: > Du schreibst also nicht sauberen Code sondern sauber obfuscated Code Deine Aussage ergibt keinen Sinn. Du weißt nicht welchem Zweck mein Code dienen soll, das oben gepostete ist ein Minimalbeispiel das den selben Fehler demonstriert über den ich bei mir gestolpert bin, den echten Code kennst Du gar nicht, deshalb kannst Du auch nicht darüber urteilen. Und jetzt unterlasse bitte diese an mich gerichteten niederen Attacken, hier gehts um eine klar abgegrenzte technische Fragestellung bezüglich des Compilers, nicht um meinen Kodierstil, der stand gar nicht zur Debatte! Also Bitte!
Gast
#5948457
Jörg W. schrieb: > Daniel A. schrieb: >> Ich kompiliere meine Programme immer mit -Werror, > > Was durchaus vernünftig ist, machen wir in der Firma auch so. Wirklich immer? Oder nur wenn es darum geht den Quelltext zu commiten? Ich würd irre werden, wenn ich beim entwickeln Fehler der Form
oder ähnlich belommen würde. mh schrieb: > Ich würd irre werden, wenn ich beim entwickeln Fehler der Formerror: > unused parameter 'foo' [-Werror=unused-parameter] > oder ähnlich belommen würde. Einige harmlose oder bedeutungslose Warnungen wie diese werden global deaktiviert. Alles andere verdient es unverzüglich behandelt zu werden, das stört auch nicht bei der Arbeit, nach einiger Zeit spürt mans schon beim Schreiben, noch lange bevor einem der Compiler auf die Finger klopft. mh schrieb: >>> Ich kompiliere meine Programme immer mit -Werror, >> Was durchaus vernünftig ist, machen wir in der Firma auch so. > > Wirklich immer? Ja, immer. Eine Ausnahme wäre maximal, dass man es während einer größeren Entwicklung vielleicht temporär abschaltet, dann typischerweise auf einem Branch, und es würde vor dem Merge back wieder aktiviert. Committet wird bei DVCSen sowieso laufend, ggf. halt (lokaler Branch) auch mal "unfertiger" Code. Einfach, damit man bei Bedarf einen "Checkpoint" hat, zu dem man wieder zurück kehren kann. Daniel A. schrieb: > nicht"Gast" schrieb: >> Das ist kein Bug > > Doch, die betroffene stelle kann nie erreicht werden, wenn kein > undefinierter Code ausgeführt werden kann, ist es in Ordnung. Das kann der Compiler nicht immer 100% genau erkennen. Dazu ist schon etwas Code-Analyse notwendig. Deshalb ist es auch nur eine Warnung und kein Fehler. Wenn du per -Werror dann einen Fehler draus machst, ist das nicht die Schuld des Compilers. In dem Fall ist es ja noch relativ einfach, aber das kann man beliebig verkomplizieren. Generell immer kann der Compiler das nicht sicherstellen. Ggf hängt das übrigens auch noch von den Optimierungs-Einstellungen ab. Da er bei hohen Optimierungsstufen mehr Code-Analyse machen muss, erkennt er dann manche Fälle etwas präziser. > Es ist egal, ob der Compiler den Code weglasst, oder dort sonst was > hinpflanzt, aber falsch ist es nicht. Das er warnt ist aber klar falsch. Er warnt, weil es falsch sein könnte. Wenn ich sowas schreibe wie: [C] int ret; if (ret = myFunction()) [C] warnt er auch, weil er glaubt, das müsse bestimmt keine Zuweisung, sondern ein Vergleich sein. Generell bin ich auch dafür, alle Warnungen aus dem Code zu entfernen. Nur warnt gcc heute an so vielen Stellen, wo eigentlich kein Problem ist, dass es schon langsam nervt, dauernd im Code irgendwas umschreiben oder hinzufügen zu müssen, nicht weil dadurch der Code besser würde, sondern nur um die an einigen Stellen eigentlich unnötigen Warnungen wegzubekommen.
Gast
#5948606
Bernd K. schrieb: > mh schrieb: >> Ich würd irre werden, wenn ich beim entwickeln Fehler der Formerror: >> unused parameter 'foo' [-Werror=unused-parameter] >> oder ähnlich belommen würde. > > Einige harmlose oder bedeutungslose Warnungen wie diese werden global > deaktiviert. Ich sage dem Kompiler bei der Meldung statdessen explizit, dass das OK ist. Ganz oben in den Funktionsrump kommt: "(void)foo;", und dann ist dem Compiler klar, der Parameter ist absichtlich ungenutzt. Aber nicht vergessen, die wieder raus zu nehmen, wenn der Parameter später doch mal gebraucht wird. Bernd K. schrieb: > Hat jemand einen aktuellen gcc und kann bestätigen daß das dort immer > noch auftritt? Meiner ist die letzte Version die das offizielle ARM ppa > ausspuckt, auf der ARM Webseite gibts aber schon neuere zum direkten > Download. Ich habe den avr-gcc 9.2.0 zur Verfügung. In der Arduino IDE getestet bringt es nur eine "left shift" Warnung.
Ausgabe:
Veit D. schrieb: > In der Arduino IDE getestet bringt es nur eine "left shift" Warnung. Um genau diese geht es ja. Bernd K. schrieb: > leo schrieb: >> Wenn ein Leftshift ploetzlich in >> die andere Richtung losgeht, ist schon voher was faul. > > Nein, der geht nicht "plötzlich" in die andere Richtung. Die Shiftweite > in meinem Beispiel war schon immer eine literale Konstante irgendwo mit > zwei simplen #define festgenagelt und war immer positiv und zur > Kompilezeit bekannt. Ja, dann solltest Du das auch mit constexpr ausdrücken.
Allerdings: das geht nur mit einem C++-Compiler, un die Warnung ist korrekterweise weg. Rolf M. schrieb: > Wenn ich sowas schreibe wie: > [C] > int ret; > if (ret = myFunction()) > [C] > > warnt er auch, weil er glaubt, das müsse bestimmt keine Zuweisung, > sondern ein Vergleich sein. Das ist auch grenzwertiger Stil. Ich würde das nicht so hinschreiben. IMHO ist das ein grober Designfehler der Sprache daß eine Zuweisung als Ausdruck ausgewertet werden kann, ich finde es gut daß der Compiler da warnt, denn man verliert nichts wenn man generell auf dieses "Feature" verzichtet. Wilhelm M. schrieb: > Allerdings: das geht nur mit einem C++-Compiler, un die Warnung ist > korrekterweise weg. Es ging aber eben nicht um C++, damit erübrigt sich deine Lösung. Jörg W. schrieb: > Wilhelm M. schrieb: >> Allerdings: das geht nur mit einem C++-Compiler, un die Warnung ist >> korrekterweise weg. > > Es ging aber eben nicht um C++, damit erübrigt sich deine Lösung. Sehe ich nicht so: es ist wieder ein Grund über die Verwendung von C nachzudenken. Vor allem, weil der Umstieg so einfach ist. Für den TO könnte constexpr in genau dieser Übersetzungseinheit ein Anreiz sein. Wilhelm M. schrieb: > es ist wieder ein Grund über die Verwendung von C nachzudenken Diese Evangelisiererei nervt einfach. Ihr „C++-Evangelisten“ solltet nicht davon ausgehen, dass C++ nur das unerkannte Mauerblümchen sei, welches niemand kennt, weshalb ihr es unbedingt allen nahelegen müsst. Diese Auffassung ist schlicht falsch: jeder halbwegs erfahrende C-Programmierer kennt C++, kennt seine Vorteile, seine Nachteile. Nichtsdestotrotz können sich (von ein paar eigentständigen Hobbyprojekten vielleicht mal abgesehen) die meisten dieser Programmierer einfach nicht aussuchen, die Sprache zu wechseln – der Wechsel ist eben nicht so einfach, wie du suggerierst. Außerdem: da, wo man sich die Sprache aussuchen kann, gewinnen oft andere, Python beispielsweise. Jörg W. schrieb: > Wilhelm M. schrieb: >> es ist wieder ein Grund über die Verwendung von C nachzudenken > > Diese Evangelisiererei nervt einfach. Ich denke, ein Vorschlag in eine andere Richtung ist noch keine Evangelisiererei. Ok, es ist vielleicht ein Vorschlag der Dir nicht passt. > Ihr „C++-Evangelisten“ solltet nicht davon ausgehen, dass C++ nur das > unerkannte Mauerblümchen sei, welches niemand kennt, weshalb ihr es > unbedingt allen nahelegen müsst. Da liegst Du aber komplett daneben. Allerdings ist dieses Forum in der Tat ein Ort, wo viele Personen einfach nicht aus ihrer C-Blase hinaus schauen wollen und können. > Diese Auffassung ist schlicht falsch: > jeder halbwegs erfahrende C-Programmierer kennt C++, kennt seine > Vorteile, seine Nachteile. Das wage ich stark zu bezweifeln. Und das behaupte ich auch nicht von mir. > Nichtsdestotrotz können sich (von ein paar > eigentständigen Hobbyprojekten vielleicht mal abgesehen) die meisten > dieser Programmierer einfach nicht aussuchen, die Sprache zu wechseln – > der Wechsel ist eben nicht so einfach, wie du suggerierst. Auch da bin ich anderer Meinung. Wilhelm M. schrieb: > Da liegst Du aber komplett daneben. Allerdings ist dieses Forum in der > Tat ein Ort, wo viele Personen einfach nicht aus ihrer C-Blase hinaus > schauen wollen und können. Das ist die Sicht derer, die nicht aus ihrer C++-Blase hinaus schauen wollen und können – um mit deinen Worten zu kontern. >> Diese Auffassung ist schlicht falsch: >> jeder halbwegs erfahrende C-Programmierer kennt C++, kennt seine >> Vorteile, seine Nachteile. > > Das wage ich stark zu bezweifeln. Dann bezweifle es halt. Was genau hilft dir das jetzt? > Auch da bin ich anderer Meinung. Kannst du ja sein. Meine Meinung resultiert einfach aus Erfahrung. Ich hätte persönlich überhaupt kein Problem, unsere Firmware hier in der Firma in C++ zu verfassen, aber wir müssen unsere Brötchen irgendwie verdienen. Was glaubst du, wer von unseren Kunden unseren Arbeitsaufwand bezahlen möchte für einen Umbau von C auf C++? Das würde nur dann jemand bezahlen, wenn sich daraus unmittelbar Probleme lösen ließen, die in C nicht (mit vertretbarem Aufwand) lösbar wären. Aber so riesig ist der Vorteil von C++ wiederum eben dann doch nicht. Es ist manches netter und bequemer und schöner, gar keine Frage, aber in dem Bereich, in dem wir arbeiten, gibt es kaum was, was nicht in C auch gänge, ohne dass man dadurch nun unbillige Härte in Kauf nehmen müsste. Und überall dort, wo es nicht (unbedingt) in Firmware sein muss, dominiert schlicht und ergreifend Python. Da quält sich keiner mehr mit C oder C++ ab. Die Millisekunde an Performance interessiert dann sowieso keinen, und die Time-to-Market ist damit um Welten besser als in den compilierten Sprachen. Jörg W. schrieb: > Das würde nur dann jemand > bezahlen, wenn sich daraus unmittelbar Probleme lösen ließen, die in C > nicht (mit vertretbarem Aufwand) lösbar wären. Aber so riesig ist der > Vorteil von C++ wiederum eben dann doch nicht. Es ist manches netter und > bequemer und schöner, Viel wichtiger ist doch, dass man in einen Bereich kommt, in dem Fehler so früh wie möglich aufgedeckt werden. Also: compile-time statt run-time. > gar keine Frage, aber in dem Bereich, in dem wir > arbeiten, gibt es kaum was, was nicht in C auch gänge, ohne dass man > dadurch nun unbillige Härte in Kauf nehmen müsste. Unbillige Härte: nur dann, wenn man die Holzhammermethode einsetzt. > Und überall dort, wo es nicht (unbedingt) in Firmware sein muss, > dominiert schlicht und ergreifend Python. Davon war doch gar keine Rede. Und auch das ist eine Pauschalaussage, die so nicht stimmt. Es gibt Branchen, da sieht es anders aus, da spielt Python gar keine Rolle. Und ich meine jetzt nicht C++-Nutzung. Wilhelm M. schrieb: > ch denke, ein Vorschlag in eine andere Richtung ist noch keine > Evangelisiererei. Dann schlage ich Dir an dieser Stelle noch Matlab vor. Der "bitshift()"-Befehl hat dort auch keinerlei Probleme mit Vorzeichen. Wilhelm M. schrieb: > Viel wichtiger ist doch, dass man in einen Bereich kommt, in dem Fehler > so früh wie möglich aufgedeckt werden. Also: compile-time statt > run-time. Da hilft uns die Wahl der Programmiersprache praktisch gar nicht. Aus dem Alter der totalen Anfängerfehler sind wir einfach mal raus. ;-) > Davon war doch gar keine Rede. Und auch das ist eine Pauschalaussage, > die so nicht stimmt. Es gibt Branchen, da sieht es anders aus, da spielt > Python gar keine Rolle. Keine Frage. Ich wollte damit nur ausdrücken: wenn man die Dose „andere Programmiersprache“ öffnet (öffnen kann), dann ist es eben nicht nur C vs. C++, sondern die Palette wird einfach breiter. Wilhelm M. schrieb: > Viel wichtiger ist doch, dass man in einen Bereich kommt, in dem Fehler > so früh wie möglich aufgedeckt werden. Also: compile-time statt > run-time. In dem obigen Fall ging es bereits um Compiletime, runtime stand hier nirgendwo zur Debatte! Ich will entweder den if oder den else zweig kompilieren, niemals beide gleichzeitig, der Optimizer hilft mir dabei. Ein if auf ne konstante Bedingung hat schon so manches häßliche #ifdef ersetzt. Mein shift ist konstant zur Kompilezeit! Wenn es kompiliert ist es korrekt! Würd ich das alles in C++ machen würd ich sicherlich auch keine Makros verwenden die mir zur Compilezeit getypte und parametrierte Funktionen generieren sondern ich würde die C++-Templatemechanismen ausschöpfen um meine Filterfunktionen und anderen Krempel zu erzeugen. Ich müsste etliches umkrempeln. Das will ich nicht. Noch nicht und schon dreimal nicht für den alten in Produktion befindlichen Code, es ist nicht so daß ich hier rumsitze und Däumchen drehe und aus schierer Langeweile neue Baustellen aufreiße in perfekt funktionierenden Projekten. Ich hab hier lang gewachsenes C, es war schon C bevor ich hier angefangen habe und kein C++. Ende der Durchsage. Jörg W. schrieb: > Aus dem Alter der totalen Anfängerfehler sind wir einfach mal raus. ;-) Du arbeitest nicht zufällig bei Cisco? ;-) Bernd K. schrieb: > Wilhelm M. schrieb: >> Viel wichtiger ist doch, dass man in einen Bereich kommt, in dem Fehler >> so früh wie möglich aufgedeckt werden. Also: compile-time statt >> run-time. > > In dem obigen Fall ging es bereits um Compiletime, runtime stand hier > nirgendwo zur Debatte! Ich will entweder den if oder den else zweig > kompilieren, niemals beide gleichzeitig, der Optimizer hilft mir dabei. Der Unterschied ist subtil, aber sehr wichtig, gerade auf für templates: bei einem run-time if (wie bei Dir) müssen beide Zweige compiliert werden, deswegen auf die warnings. Der Optimizer erst kann nachweisen, dass er hier wegen const den false-Zweig verwerfen kann. bei einem compile-time (constexpr) if wird der false-Zweig direkt verworfen, d.h. nicht compiliert. Deswegen keine warning. Der Optimizer ist arbeitslos. Das ist ja ganz wichtig für templates, die dann im false-Zweig nicht instantiiert werden. Wilhelm M. schrieb: > gerade auf für templates templates? In C? Ach, du lebst in deiner C++-Blase … :) Jörg W. schrieb: > Wilhelm M. schrieb: >> gerade auf für templates > > templates? In C? > > Ach, du lebst in deiner C++-Blase … :) Ooch, lies doch mal alles. Ich habe auf Bernd K. geantwortet, der sich wieder auf meinen Beitrag bezog. Wilhelm M. schrieb: > Ooch, lies doch mal alles Bitte lass trotzdem dein C++ hier raus. Schön dass dich das so begeistert, sogar nachvollziehbar aber hier hilft es nicht. Wilhelm M. schrieb: > Ich habe auf Bernd K. geantwortet Bernd hat aber auch ausdrücklich geschrieben, dass es sich um C-Code handelt. Damit sind irgendwelche Betrachtungen über Templates und deren Compiler-Effizienz hinfällig genauso wie "constexpr" (ich sehe zumindest nicht, dass jemand bereits constexpr in die aktuellen C-Standard-Drafts eingebracht hätte). Jörg W. schrieb: > Wilhelm M. schrieb: >> Ich habe auf Bernd K. geantwortet > > Bernd hat aber auch ausdrücklich geschrieben, dass es sich um C-Code > handelt. Er sprach über alten Code, der schon vor seinem Eintritt in das Projekt bestand. Er sagte auch, dass er es anders machen würde, wenn es kein legacy-Code wäre. Und ich hoffe für ihn und seine Firma, dass sie auch mal neue Sachen machen.
Gast
#5949583
Daniel A. schrieb: > Warnung -Wshift-count-negative, option zum ausschalten folglich > -Wno-shift-count-negative. Das zählt natürlich nicht. Damit deaktivierst du ja das komplette Potential dieser Warnung, auf echte (potentielle) Probleme hinzuweisen. Das ist etwa als wenn du als Workaround für eine quietschende Bremse das Bremssystem komplett deaktivierst. Ja klar, die Bremse quietscht dann ganz sicher nicht mehr, aber das Auto knallt möglicherweise gegen die nächste Wand... > Das er warnt ist aber klar falsch. Ein false > positive. Also doch ein BUG. Das ist der Punkt. Wir haben es bei der statischen Codeanalyse nicht mit einer Heuristik zu tun. Wenn sie korrekt implementiert wäre, hätte sie herausbekommen MÜSSEN, das hier kein erkennbares Problem vorliegt und dementsprechend kein Anlaß für eine Warnung vorliegt. Andererseits müßte sie allerdings auch IMMER eine Warnung ausgeben, wenn eine signed-Variable als Quelle für die Bitzahl des Shift dient, wenn sie NICHT schon zur Compile-Zeit auflösbar ist. Denn dann hat sie schließlich immer das Potential, zur Laufzeit negativ zu werden... Allerdings würde dann bei sehr vielen Anwendungen der Programmierer mit Warnungen geradezu geflutet. Das eigentliche Problem ist also das absolut unlogische Design dieser verschissenen Dreckssprache. Logisch wären zwei Varianten gewesen: 1) Ich akzeptiere negative Shifts und setze sie halt als positive Shifts in die Gegenrichtung um. 2) Ich verbiete grundsätzlich signed Parameter für den Shift. Alles andere ist unlogischer Dreck. Also genau das, was C macht und weswegen ich C so abgrundtief hasse... c-hater schrieb: > Also genau das, was C macht und > weswegen ich C so abgrundtief hasse... Eigentlich magst Du C doch. Ansonsten gäbe es keinen vernünftigen Grund, jeden Thread, wo es behandelt wird, aufzusuchen. Bernd K. schrieb: > Wenn ich mal mehr Zeit hab mach ich nen Bugreport. Es ist aber kein Bug: Der Compiler warnt lediglich, dass es hier möglicherweise ein Problem gibt (und damit hat er recht). Wie bereits geschrieben: Jörg W. schrieb: > Naja, ohne Fehler compiliert es auch so schon, und das Ergebnis ist > korrekt. Es gibt ja keinen Fehler, sondern eine Warnung. > > Selbst die Warnung ist für sich genommen nicht falsch: der shift count > an dieser Stelle wäre ja tatsächlich negativ – nur dass die Stelle eben > aufgrund der äußeren Umstände garantiert nicht erreicht wird (was sich > ja auch im generierten Code reflektiert). Insofern ist die Warnung > verwirrend, aber eher eine Unschönheit denn ein tatsächlicher Bug. Ein Bug würde vorliegen, wenn der generierte Code falsch ist. Die Prüfung auf mögliche Probleme kann in verschiedenen Compiler Stages durchgeführt werden. Ich bezweifle, dass sich die Maintainer für das (eigentlich "selbst" eingebrockte) Problem des TE interessieren. Solcher Code sollte imho gar nicht in einem Projekt auftauchen. -- Auch wenn ich durchaus nachvollziehen kann wie es dazu kam.
Gast
#5950562
Mikro 7. schrieb: > Es ist aber kein Bug: Der Compiler warnt lediglich, dass es hier > möglicherweise ein Problem gibt (und damit hat er recht). Nein, er hat eben nicht Recht, es kann hier niemals ein Problem geben und dieser Sachverhalt ist bereits zur Compilezeit eindeutig verifizierbar. Also, ganz eindeutig: BUG.
Gast
#5950582
Walter T. schrieb: > Eigentlich magst Du C doch. Ansonsten gäbe es keinen vernünftigen Grund, > jeden Thread, wo es behandelt wird, aufzusuchen. Doch: Ich hasse es, weil ich die Schwächen kenne, bin aber viel zu oft gezwungen, es zu benutzen. Ja, das (Erwerbs-)Leben ist halt kein Ponyhof. Wenn das kein Grund ist, was denn sonst? c-hater schrieb: > Mikro 7. schrieb: > >> Es ist aber kein Bug: Der Compiler warnt lediglich, dass es hier >> möglicherweise ein Problem gibt (und damit hat er recht). > > Nein, er hat eben nicht Recht, es kann hier niemals ein Problem geben > und dieser Sachverhalt ist bereits zur Compilezeit eindeutig > verifizierbar. Also, ganz eindeutig: BUG. Du hast offensichtlich den Unterschied zwischen einer Warn-und einer Fehlermeldung nicht verstanden. Der Compiler gibt eine Fehlermeldung aus, wenn der der betreffende Quellcode formal (d.h. syntaktisch oder semantisch) inkorrekt ist. Der Compiler gibt eine Warnmeldung aus, wenn der betreffende Quellcode zwar formal korrekt ist, aber eine gewisse Wahrscheinlichkeit besteht, dass er nicht das tut, was der Programmierer beabsichtigt hat. Der zweite Fall trifft auf den Code des TE definitiv zu: - Zu einen steht da (mit eingesetzter Konstante) der Ausdruck x<<-7. So etwas ist in den allermeisten Fälle nicht beabsichtigt, weswegen es legitim ist, dass der Compiler hier ein potentielles Problem aufzeigt. - Dass der fragliche Code nie ausgewertet wird, ändert nichts daran, dass x<<-7 fehlerhaft aussieht. Da es darüberhinaus auch unüblich ist, nicht erreichbaren Code zu schreiben, wäre hier zusätzlich zur ausgegebenen Warnung sogar noch eine entsprechende zweite Warnmeldung angebracht (von der du vermutlich ebenso behaupten würdest, sie sei ein Bug). Da der TE weiter oben erklärt hat, wie es zu diesem seltsamen Code kam, wissen wir, dass die Warnmeldung ignoriert werden dürfen. Der Compiler hingegen kennt diese Erklärung nicht, da er in diesem Forum nicht mitliest. Also kann man es ihm ein "Häh?" von seiner Seite wirklich nicht verdenken. Vermeintlich zu viele oder zu wenige ausgegebene Warnmeldung können übriges niemals ein Bug sein , da der C-Standard nicht bindend festlegt, wann und wo eine Warnung ausgegeben werden soll. Dies liegt allein im Ermessen des Compilerbauers. Yalu X. schrieb: > Der Compiler gibt eine Warnmeldung aus, wenn der betreffende Quellcode > zwar formal korrekt ist, aber eine gewisse Wahrscheinlichkeit besteht, > dass er nicht das tut, was der Programmierer beabsichtigt hat. Die Wahrscheinlichkeit beträgt in diesem Fall aber ziemlich genau 0%, es handelt sich um ein false-positive. Außerdem: Baut man Code mit "-O0", verändern sich die Warnungen. Viele Sachverhalte werden erst im Rahmen der Optimierung untersucht und führen dann zu Warnungen - oder eben auch nicht, wenn keine Optimierung stattfindet. Warnungen sind super, und Warnungen zu UB sogar noch viel besser. Aber diese ist schlicht irreführend und daher als Bug im Compiler zu betrachten. Yalu X. schrieb: > Dies liegt allein im Ermessen des Compilerbauers. Du meinst also, dass "WONTFIX" für sämtliche Warnungen eine angemessene Reaktion wäre? :-) Hallo, ihr denkt zu kompliziert. :-) Die Shiftweite, der Wert, darf nie negativ sein. Der Wert ist nur ein Betrag und gibt nur an UM wieviele Bits verschoben wird. Die Richtung geben allein die Operatoren vor. Du musst also nur dafür sorgen das dein Shiftwert immer positiv ist. Nach der einfachen Logik meckert der Compiler zu recht - kein Bug laut meiner Meinung.
S. R. schrieb: > Yalu X. schrieb: >> Der Compiler gibt eine Warnmeldung aus, wenn der betreffende Quellcode >> zwar formal korrekt ist, aber eine gewisse Wahrscheinlichkeit besteht, >> dass er nicht das tut, was der Programmierer beabsichtigt hat. > > Die Wahrscheinlichkeit beträgt in diesem Fall aber ziemlich genau 0%, es > handelt sich um ein false-positive. Um die Wahrscheinlichkeit auf 0 reduzieren zu können, müsste der Compiler Gedanken lesen können. Nur zur Klarstellung: Eine Compilerwarnung kann, muss aber nicht notwendigerweise durch ein undefined Behavior ausgelöst werden. Der vom TE gepostete Code bewirkt kein UB, dennoch ist er zunächst – ohne weitergehende Erläuterungen des Programmierers – einfach nur unsinnig, und das gleich aus zwei Gründen: wegen des negativen Shift-Arguments und wegen des nicht erreichbaren Else-Zweigs. Ist es da falsch anzunehmen, dass der Programmierers evtl. etwas anderes beabsichtigt hat? > Yalu X. schrieb: >> Dies liegt allein im Ermessen des Compilerbauers. > > Du meinst also, dass "WONTFIX" für sämtliche Warnungen eine angemessene > Reaktion wäre? :-) Ich habe nicht geschrieben, dass die Qualität der Warnmeldungen nicht verbessert werden darf. Also ich bekomm die Warning ganz einfach weg, also als Workaround:
Inline-Funktionen sind hier ohnehin Makros vorzuziehen, weil: * Argumente nur 1x ausgewertet werden. Wenn man z.B. MAX als Makro implementiert, werden die Argumente mehrfach ausgewertet. Das ist schlecht bei Seiteneffekten, z.B. bei Ausdrücken (Funktionsaufruf) als Argument, x++ o.ä. oder volatile. * Bessere Diagnostics bei Syntax-Fehlern. * Besser wartbar. * Bessere Debugging-Erfahrung (zumindest mit ältlichen Debuggern).
Gast
#5958770
Jedesmal wenn jemand vorzeichenbehaftete Werte schiebt, sollte eigentlich sein Bürostuhl unter Strom gesetzt werden. Leider konnte ich diese Policy in der Firma noch nicht etablieren. Andererseits: Welche realistisch vorkommende Maschine verhält sich anders als üblich? Als C neu war, gab es solche. Und heute? A. K. schrieb: > anders als üblich Was wäre denn "üblich"? Und je nachdem gibt es auch QA die da drauf schaut und "Nein" sagt. Johann L. schrieb: > Inline-Funktionen sind hier ohnehin Makros vorzuziehen In meinem Fall ist auch der Typ von x erst bekannt wenn die Funktion erzeugt wird, ich müsste also auch diese inline-Hilfsfunktion jedesmal extra erzeugen, deshalb hab ichs vorerst beim Makro belassen. Scheint aber so daß selbst auf der kleinsten Optimierungsstufe schon nichts mehr doppelt ausgewertet werden muss, also lass ichs erstmal so. Durchsteppen (im source) kann ich das ganze Ding eh nicht weil der Sourcecode des ganzen Gebildes in seiner endgültigen Form erst nach der Makroexpansion überhaupt erst zu existieren beginnt. Brrrz schrieb: > Jedesmal wenn jemand vorzeichenbehaftete Werte schiebt, sollte > eigentlich sein Bürostuhl unter Strom gesetzt werden. Ich hab ehrlich gesagt noch nie verstanden, warum es sowohl in C, als auch auf Maschinen-Ebene (zumindest bei denen, die ich kenne) für links und recht zwei verschiedene Shift-Operationen mit nur positiven Werten gibt, statt einfach einen Shift mit Vorzeichen zu machen, der beides kann.
Gast
#5958928
Rolf M. schrieb: > Ich hab ehrlich gesagt noch nie verstanden, warum es sowohl in C, als > auch auf Maschinen-Ebene (zumindest bei denen, die ich kenne) für links > und recht zwei verschiedene Shift-Operationen mit nur positiven Werten > gibt, statt einfach einen Shift mit Vorzeichen zu machen, der beides > kann. Zuerst gab es halt div. CPUs und Assembler. Es ist egal ob du Shiftweite + Richtung oder ein Vorzeichen kodierst. Ersteres is halt klarer. Da kann man das ganze auch gleich gut benennen: LSL - logical shift left LSR - logical shift right ASR - arithmetic shift right Besonders letzteres verkompliziert die Schieberei. leo Rolf M. schrieb: > Ich hab ehrlich gesagt noch nie verstanden, warum es sowohl in C, als > auch auf Maschinen-Ebene (zumindest bei denen, die ich kenne) für links > und recht zwei verschiedene Shift-Operationen mit nur positiven Werten > gibt, statt einfach einen Shift mit Vorzeichen zu machen, der beides > kann. Für einen Wertebereich von -32 bis +31 brauchst du 6 Bit. Ob das nun "1 Bit im Opcode und 5 Parameterbits" sind oder "6 Parameterbits", ist egal. Ersteres ist flexibler, weil es 4 Varianten gibt: LSL, LSR, ASL, ASR. Zwei davon (LSL und ASL) sind aber gleich, wenn man die schon im Decoder gleich abhandeln kann, spart man Logik. Außerdem spart man Logik, wenn man das Zweierkomplement nicht decodieren muss - schieben ist nicht addieren.
Gast
#5958964
S. R. schrieb: > Außerdem spart man Logik, wenn > man das Zweierkomplement nicht decodieren muss - schieben ist nicht > addieren. Exakt. Bernd K. schrieb: > Johann L. schrieb: >> Inline-Funktionen sind hier ohnehin Makros vorzuziehen > > In meinem Fall ist auch der Typ von x erst bekannt wenn die Funktion > erzeugt wird, ich müsste also auch diese inline-Hilfsfunktion jedesmal > extra erzeugen, deshalb hab ichs vorerst beim Makro belassen. ... und damit wären wir bei templates in C++. Wilhelm M. schrieb: > und damit wären wir bei templates in C++ du wirst langweilig. CPUs, bei denen die Anzahl mit Vorzeichen codiert wurde, gab (gibt?) es. Mindestens bei Z8000 und VAX war das der Fall. Rolf M. schrieb: > Ich hab ehrlich gesagt noch nie verstanden, warum es sowohl in C, als > auch auf Maschinen-Ebene (zumindest bei denen, die ich kenne) für links > und recht zwei verschiedene Shift-Operationen mit nur positiven Werten > gibt, statt einfach einen Shift mit Vorzeichen zu machen, der beides > kann. Auf Maschinenebene kann man das im Grunde definieren wie man will. In der Definition einer höheren Programmiersprache wäre das schon interessanter, denn man hätte dann ja konsequenterweise nur noch einen Shift-Operator statt zwei. In C also nicht << und >>, sondern <> oder was auch immer, in mitsamt Definition, welches Vorzeichen in welche Richtung schiebt. Spannend bliebe aber weiterhin die Sache bei negativem linkem Operanden. Weil bei damaligen Maschinen beim Shift selbst mit definiertem arithmetischem Shift nicht so ganz klar war, ob aus -1 einfach linksrum -2 oder -3 wird, oder rechtsrum -1 oder -0. Insofern wäre es leicht pervers gewesen, zwar eine negative Anzahl zuzulassen, ohne aber ein klares Ergebnis bei negativem Operand zu definieren. A. K. schrieb: > In der Definition einer höheren Programmiersprache wäre das schon > interessanter, denn man hätte dann ja konsequenterweise nur noch einen > Shift-Operator statt zwei. Vermutlich gerade WEIL die darunter liegende Maschine zwei verschiedene Befehle hat muss man das in der Hochsprache ebenfalls abbilden weil ansonsten womöglich der Compiler zur Compilezeit nicht mehr wasserdicht beweisen kann ob es immer positiv oder immer negativ ist und deswegen jedesmal Code für eine Fallunterscheidung und beide Befehle einbauen müsste anstatt einfach nur den einen Befehl hinzuschreiben den der Programmierer (der einzige der es wissen kann) wollte. Wir wärs mit:
Es gibt nämlich einen Fall, wo eine negative Zahl x bei -x negativ bleibt. Und die Warnung kommt vermutlich schon von einem Compileschritt vor der Ersetzung durch eine Konstante. Bei char ist es die -128, die negativ bleibt. 900ss D. schrieb: > Wilhelm M. schrieb: >> und damit wären wir bei templates in C++ > > du wirst langweilig. und schaue - etwas schopfschüttelnd - zu wie man sich hier (in C) abmüht ;-) Wilhelm M. schrieb: > und schaue - etwas schopfschüttelnd - zu wie man sich hier (in C) abmüht Niemand müht sich ab. Wenn man weiß wie die Sprache tickt kann man viele solcher Sachen locker flockig und sogar sauber hinschreiben bei denen sich ein Anfänger noch die Augen reiben würde und man kommt schon verdammt weit damit. Der Anfänger reibt sich aber auch bei C++ die Augen wenn ihm die volle Macht dieser Sprache mit all ihren barocken Türmchen und Erkerchen ins Gesicht geschleudert wird, also halbwegs Gleichstand. Bernd K. schrieb: > Der Anfänger reibt sich aber auch bei C++ die Augen Unleserliche Programme lassen sich in jeder Programmiersprache verfassen … Jörg W. schrieb: > Bernd K. schrieb: >> Der Anfänger reibt sich aber auch bei C++ die Augen > > Unleserliche Programme lassen sich in jeder Programmiersprache verfassen Für einen Anfänger kann auch sauberer Code vollkommen unleserlich sein, je mächtiger und komplexer die Sprache umso länger hält dieser Zustand an.
Gast
#5959960
Jörg W. schrieb: > Bernd K. schrieb: >> Der Anfänger reibt sich aber auch bei C++ die Augen > > Unleserliche Programme lassen sich in jeder Programmiersprache verfassen Aber in keiner geht es besser als in Whitespace, da sieht man Garnichts. Bernd K. schrieb: > je mächtiger und komplexer die Sprache umso länger hält dieser Zustand > an. Nö. Simple Sprachen verursachen da mehr Kopfzerbrechen. Ich finde Wilhelm durchaus auch in dieser Hinsicht nervig, aber das ist noch lange kein Grund, deshalb nun alle möglichen Scheinargumente hervorzuzaubern, warum die Sprache C++ Mist wäre. Diese "Argumentation" ist einfach noch nerviger. Jörg W. schrieb: > Scheinargumente > hervorzuzaubern, warum die Sprache C++ Mist wäre Das hab ich doch gar nicht gesagt. Ich versuchte mit einem Augenzwinkern einen Gleichstand herbeizuführen damit alle wieder beruhigt ihres Weges gehen können. Ich nehme nur deshalb zufällig kein C++ weil sich halt eben alles irgendwann mal so ergeben hat wie es heute ist und ich auch noch nicht an harte Grenzen gestoßen bin, nicht weil ich irgendwas an C++ auszusetzen hätte. Bernd K. schrieb: > einen Gleichstand herbeizuführen Ich finde, dass das eher Kindergartenniveau ist. "Du eins, ich eins." Jörg W. schrieb: > Bernd K. schrieb: >> einen Gleichstand herbeizuführen > > Ich finde, dass das eher Kindergartenniveau ist. "Du eins, ich eins." Warum musst Du jetzt anfangen zu pöbeln, aus heiterem Himmel? Und Sachen unterstellen die gar nicht gesagt wurden ("c++ sei mist")? Warum? Bernd K. schrieb: > Jörg W. schrieb: >> Scheinargumente >> hervorzuzaubern, warum die Sprache C++ Mist wäre > > Das hab ich doch gar nicht gesagt. Ich versuchte mit einem Augenzwinkern > einen Gleichstand herbeizuführen damit alle wieder beruhigt ihres Weges > gehen können. Ich nehme nur deshalb zufällig kein C++ weil sich halt > eben alles irgendwann mal so ergeben hat wie es heute ist und ich auch > noch nicht an harte Grenzen gestoßen bin, nicht weil ich irgendwas an > C++ auszusetzen hätte. Dabei könnte man doch gerade an diesem einen zufälligen Punkt anfangen, etwas cherry-picking zu machen, indem man beides zusammen führt. Es ist ja nun nicht schwer oder undurchsichtig, C und C++ via header-only zu mischen.
Gast
#5959986
Wilhelm M. schrieb: > Dabei könnte man doch gerade an diesem einen zufälligen Punkt anfangen, > etwas cherry-picking zu machen, indem man beides zusammen führt. Vor allem weil das geradezu nach templates schreit... inline+template ist der perfekte Ersatz für viele Makros. Ein anderes Beispiel dafür sind die min/max-Funktionen - die lassen sich mit Makros nicht so toll bauen. Bernd K. schrieb: > Warum musst Du jetzt anfangen zu pöbeln, aus heiterem Himmel? Und Sachen > unterstellen die gar nicht gesagt wurden ("c++ sei mist")? Warum? Die wurden nicht direkt gesagt, aber unterschwellig hast du genau das ausgedrückt: groß, komplex, "barocke[n] Türmchen und Erkerchen ins Gesicht geschleudert". Das ist das, was ich schlicht unter Niveau fand. Wilhelm M. schrieb: > Dabei könnte man doch gerade an diesem einen zufälligen Punkt anfangen, > etwas cherry-picking zu machen Da hängt noch mehr dran, ich hab zum Beispiel stellenweise stark abgespeckten startup-code ohne __libc_init_array und den ganzen Sermon, ich initialisiere nur was für C nötig ist, und beim Linkerscript bin ich mir auch nicht sicher ob da noch alle sections drin sind die nötig sind. Und dann ist es die Zeit, ich müsste erstmal Rostlöser an den grauen Zellen ansetzen um da wieder halbwegs in die Gänge zu kommen mit C++ und wie ich das dann sauber mit dem alten Code mischen kann ohne irgendwelchen Mist zu bauen. Und am Ende fang ich dann an vor lauter Euphorie alles umzubauen was schon mal funktioniert hat, aber ich hab auch nicht unendlich viele Ressourcen. Deshalb lass ich das erstmal. Ich bin immer noch zufrieden mit dem was ich habe.
Gast
#5959998
Bernd K. schrieb: > Da hängt noch mehr dran, ich hab zum Beispiel stellenweise stark > abgespeckten startup-code ohne __libc_init_array und den ganzen Sermon, > ich initialisiere nur was für C nötig ist, und beim Linkerscript bin ich > mir auch nicht sicher ob da noch alle sections drin sind die nötig sind. Wer da sein eigenes Süppchen kochen möchte, muss das eben selbst pflegen und die entsprechenden 7 Zeilen da hinein kopieren. Alle anderen welche den 0815-Standard-Startup-Code aus Beispielen oder Projekt-Templates verwenden müssen da gar nix tun. Bernd K. schrieb: > Wilhelm M. schrieb: >> Dabei könnte man doch gerade an diesem einen zufälligen Punkt anfangen, >> etwas cherry-picking zu machen > > Da hängt noch mehr dran, ich hab zum Beispiel stellenweise stark > abgespeckten startup-code ohne __libc_init_array und den ganzen Sermon, > ich initialisiere nur was für C nötig ist, und beim Linkerscript bin ich > mir auch nicht sicher ob da noch alle sections drin sind die nötig sind. Und so ein Vorgehen findest Du jetzt klar und durchsichtig? Mmh ... > Und dann ist es die Zeit, ich müsste erstmal Rostlöser an den grauen > Zellen ansetzen um da wieder halbwegs in die Gänge zu kommen mit C++ und > wie ich das dann sauber mit dem alten Code mischen kann ohne > irgendwelchen Mist zu bauen. Auch wenn ich mich wiederhole: man muss ja nicht alles auf C++ umstellen, es genügt dieses eine kleine Beispiel als Einstieg. Jörg W. schrieb: > Die wurden nicht direkt gesagt, aber unterschwellig hast du genau das > ausgedrückt: groß, komplex, "barocke[n] Türmchen und Erkerchen ins > Gesicht geschleudert". > > Das ist das, was ich schlicht unter Niveau fand. Also komm, jetzt lass aber mal wieder gut sein. Man kanns echt übertreiben. "Unterschwellig". Ich glaub Dein Niveaudetektor läuft Amok, kalibrier den bitte mal neu. Dann lass doch einfach auch solche doofen Anspielungen sein. Ich weiß echt nicht, was "barocke Türmchen und Erkerchen" sein sollen wenn keine Provokation. Bezüglich des Startup-Codes: ich sehe ja, dass es Gründe geben kann, ihn gelegentlich zu erweitern (selig die AVR-Tage, wo man den mitgelieferten Startup-Code eigentlich immer ohne weiteres Nachdenken benutzen konnte, da er 99,9 % aller Anwendungsfälle abgedeckt hat), aber warum braucht man solche Sonderlocken, __libc_init_array() rauszuwerfen? Wenn du das nicht benutzt, wird das doch sowieso automatisch eliminiert. Wilhelm M. schrieb: > Und so ein Vorgehen findest Du jetzt klar und durchsichtig? Mmh ... Ist sehr klar und sehr durchsichtig und ISO-Konform. Der Startupcode ist für C, nicht für C++, nicht für Rust und auch nicht für Pascal sondern für C. Jörg W. schrieb: > solche Sonderlocken, __libc_init_array() rauszuwerfen? Weil das was es macht in C nicht gebraucht wird? Warum soll ich Sonderlocken für C++ einbauen die gar nicht genutzt werden?
Gast
#5960019
Bernd K. schrieb: > Weil das was es macht in C nicht gebraucht wird? Warum soll ich > Sonderlocken für C++ einbauen die gar nicht genutzt werden? Zirkuläre Argumentation? "Ich kann C++ nicht benutzen weil ich dafür meinen Startupcode anpassen muss was nicht nicht brauche weil ich C++ nicht benutze" Bernd K. schrieb: > Jörg W. schrieb: >> solche Sonderlocken, __libc_init_array() rauszuwerfen? > > Weil das was es macht in C nicht gebraucht wird? Warum soll ich > Sonderlocken für C++ einbauen die gar nicht genutzt werden? C++ ist erstmal einer der standardmäßigen Anwendungsfälle, aber das heißt erstens ja nicht, dass es der einzige Fall ist, und zweitens, wie schon geschrieben, kostet es nichts, das Ding drin zu lassen. Wenn man es nicht benutzt, stört es letztlich nicht. Man muss sich ja nicht zusätzliche Arbeit (und potenzielle Fehlerquellen) an Land ziehen, nur um vorhandene und erprobte Technik zu kastrieren. Ich überlege gerade, das Pendant eines statischen Konstruktors in einem C-Projekt unterzubringen … Jörg W. schrieb: > Ich weiß > echt nicht, was "barocke Türmchen und Erkerchen" sein sollen > wenn keine Provokation. Eine neutrale Tatsachenfeststellung vielleicht, jetzt wo Du so direkt fragst? Ich hätte ja sonst weiter zu dem Thema nichts gesagt aber immerhin hast diesmal Du grundlos einen Streit vom Zaun gebrochen und unterstellst andern grundlos böse Absichten und dann auch noch Inkompetenz zwischen den Zeilen. Und das noch als Moderator. Manchmal frag ich mich echt was hier los ist, haben wir gerade wieder Vollmond oder was?
Gast
#5960041
Bernd K. schrieb: > Eine neutrale Tatsachenfeststellung vielleicht Dann siehst du die Aussage "C ist eine antike primitive Sprache zur Verarbeitung von Bytes ohne Möglichkeiten zur Abstraktion, Wiederverwendbarkeit, Modularisierung, Ressourcen-Verwaltung, strukturierter Fehlerbehandlung und Datenkapselung, welche hauptsächlich von Personen verwendet wird, die fortschrittlichere Sprachen nicht verstehen" sicherlich auch als neutrale Tatsachenfeststellung. Jörg W. schrieb: > C++ ist erstmal einer der standardmäßigen Anwendungsfälle Aber nicht in meinen C-Projekten. Begründung lass ich jetzt weg, denn das geht keinen was an und wird eh nur wieder mir im Munde umgedreht bei dem hohen Streitlustkoeffizienten hier. Dr. Sommer schrieb: > Dann siehst du die Aussage > > "C ist eine antike primitive Sprache zur Verarbeitung von Bytes ohne > Möglichkeiten zur Abstraktion, Wiederverwendbarkeit, Modularisierung, > Ressourcen-Verwaltung, strukturierter Fehlerbehandlung und > Datenkapselung, welche hauptsächlich von Personen verwendet wird, die > fortschrittlichere Sprachen nicht verstehen" > > sicherlich auch als neutrale Tatsachenfeststellung. Der letzte Telsatz beleidigt Personen, der andere Teil ist faktisch falsch bis auf "antik", das ist zutreffend und "primitiv" teilweise zutreffend. Weder meine Türme noch die Erker haben irgendwen beleidigt (außer Dir anscheinend) noch sind sie unzutreffend.
Gast
#5960057
Bernd K. schrieb: > Weder meine Türme noch die Erker haben irgendwen beleidigt (außer Dir > anscheinend) noch sind sie unzutreffend. Warum schriebst du dann "Türme" und "Erker" und nicht "mächtige Funktionalität" und "effiziente Möglichkeiten"? Nicht beleidigend genug? Bernd, lass gut sein. Wenn du eine offensichtlich extreme Voreingenommenheit als "neutrale Tatsachenfeststellung" auszugeben versuchst, dann müssen wir darüber nicht weiter diskutieren, denn wir werden hier ohnehin keine Einigkeit erzielen. Mach dein Ding, dein Problem ist ja zumindest halb gelöst. Ein Ticket bei GCC kannst du allemal dafür öffnen, vielleicht interessiert sich wirklich einer der Entwickler mal dafür und weiß, wo man dabei ansetzen muss für eine Korrektur. Dr. Sommer schrieb: > Bernd K. schrieb: >> Weder meine Türme noch die Erker haben irgendwen beleidigt (außer Dir >> anscheinend) noch sind sie unzutreffend. > > Warum schriebst du dann "Türme" und "Erker" und nicht "mächtige > Funktionalität" und "effiziente Möglichkeiten"? Nicht beleidigend genug? Weder "Turm" noch "Erker" sind negativ besetzte Begriffe. Und in zwei Stunden kommt der andere Moderator und räumt diese ganze Bullshit-Diskussion die ihr da jetzt wegen NICHTS und aus purer Langeweile vom Zaun gebrochen habt wieder weg.
Gast
#5960071
Bernd K. schrieb: > Weder "Turm" noch "Erker" sind negativ besetzte Begriffe. Warum hast du sie dann benutzt? Wolltest du andeuten, wie dekorativ und geräumig C++ ist? Dr. Sommer schrieb: > Bernd K. schrieb: >> Weder "Turm" noch "Erker" sind negativ besetzte Begriffe. > > Warum hast du sie dann benutzt? Wolltest du andeuten, wie dekorativ und > geräumig C++ ist? Ja genau. Kurz nachdem ich "die volle Macht" erwähnte wollte ich noch das Augenmerk auf die ansprechende Dekoration und Geräumigkeit lenken. Und auf die vielen kleinen Winkel in denen man so gut Verstecken spielen kann. Und jetzt geh in den Keller und lach endlich mal! Bernd K. schrieb: >> C++ ist erstmal einer der standardmäßigen Anwendungsfälle > Aber nicht in meinen C-Projekten. Ich finde es super, wie du überall gerade argumentierst, warum Dinge doof sind, weil sie gerade in deinem aktuellen Anwendungsfall nicht passen. Cool, dass du einen zertifizierten Startup-Code für C geschrieben hast und den für C++ neu zertifizieren lassen müsstest. Echt geil. Hat aber nix mit C++ zu tun, sondern mit deinem zertifizierten Startup-Code. S. R. schrieb: > Echt geil. Hat aber > nix mit C++ zu tun, sondern mit deinem zertifizierten Startup-Code. Und was hat der ganze Thread hier überhaupt mit C++ zu tun? Verfolgst Du mich jetzt durch das ganze Forum und mußt überall Deinen Senf dazugeben? Was hat das hier diskutierte Thema mit C++ zu schaffen, was hab ich damit zu schaffen? Geh woanders hin und nimm die C++ Evangelisten gleich alle mit, das nervt echt langsam! S. R. schrieb: > Ich finde es super, wie du überall gerade argumentierst, warum Dinge > doof sind, weil sie gerade in deinem aktuellen Anwendungsfall nicht > passen. So? Wo tu ich das denn? Ich glaub Du leidest unter Wahnvorstellungen. Hier bei dem Thema gehts um eine reine C-Angelegenheit. Natürlich finde ich es dann doof wenn überall Evangelisten aus den Löchern kommen die mir andere Programmiersprachen aufschwatzen wollen, so penetrant wie verzweifelte Staubsaugervertreter. Bernd K. schrieb: > penetrant wie verzweifelte Staubsaugervertreter sehr schön gesagt :) S. R. schrieb: > Cool, dass du einen zertifizierten Startup-Code für C geschrieben hast Jetzt geht der Fieberwahn endgültig mit Dir durch, wo hab ich was von zertifiziert geschrieben? Wenn ich was zertifiziertes haben will dann kauf ich das irgendwo fertig, glaubst Du ich spiel in so einem lächerlichen Zertifikatszirkus freiwillig als der Clown in der Manege mit? Jörg W. schrieb: > Ich überlege gerade, das Pendant eines statischen Konstruktors in einem > C-Projekt unterzubringen … Du meinst Attribut constructor? Johann L. schrieb: > Jörg W. schrieb: >> Ich überlege gerade, das Pendant eines statischen Konstruktors in einem >> C-Projekt unterzubringen … > > Du meinst Attribut constructor? Yo, hatte ich dann auch gefunden und mir angesehen, was dabei rauskommt.
Gast
#5960950
Jörg W. schrieb: > Bernd K. schrieb: > >> Warum musst Du jetzt anfangen zu pöbeln, aus heiterem Himmel? Und Sachen >> unterstellen die gar nicht gesagt wurden ("c++ sei mist")? Warum? > > Die wurden nicht direkt gesagt, aber unterschwellig hast du genau das > ausgedrückt: groß, komplex, "barocke[n] Türmchen und Erkerchen ins > Gesicht geschleudert". > > Das ist das, was ich schlicht unter Niveau fand. Deine Argumentation kommt mir bekannt vor, so hast Du mich zum Natsieh gemacht. Gruß, Holm Holm T. schrieb: > Deine Argumentation kommt mir bekannt vor, so hast Du mich zum Natsieh > gemacht. Dazu hast du dich nebenan schon selbst gemacht: Holm T. schrieb: > und wenn es hier so weiter geht kommen Neuentwicklungen nur noch in der > Form vom Kamel- und Schafsrassen, Burkas und fliegenden Teppichen aus > Deutschland. Ja, ladet allen Müll den ihr findet hier in meinem Thread ab. Ist noch massenhaft Platz nach unten hin.
Gast
#5961487
Rolf M. schrieb: > Holm T. schrieb: >> Deine Argumentation kommt mir bekannt vor, so hast Du mich zum Natsieh >> gemacht. > > Dazu hast du dich nebenan schon selbst gemacht: > > Holm T. schrieb: >> und wenn es hier so weiter geht kommen Neuentwicklungen nur noch in der >> Form vom Kamel- und Schafsrassen, Burkas und fliegenden Teppichen aus >> Deutschland. Jörg war schneller, das was Du da zitierst ist noch nicht so alt und ich bin nach wie vor der Überzeugung das ich damit nicht falsch liege. Schicke mir ne PN wenn Du weiter zanken willst. @Bernd: Nachdem Du Deine Befindlichkeiten wieder des langen und breiten ausgekippt und jeden 2. abgecancelt hast stören Dich nun andere User? Ich sag mal dazu: Achwas. Tut mir unendlich leid. Gruß, Holm
Beitrag #7412405 wurde von einem Moderator gelöscht.
Beitrag #7414682 wurde von einem Moderator gelöscht.
Beitrag #7414870 wurde von einem Moderator gelöscht.
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.
|
Anzeige
|