C++CommunityProgrammierenMartin Richter - Do 06 Aug 2015 22:50

Best Practices ist das nach dem wir oft suchen wenn neue Standards neue Methoden eröffnen und ganz besonders, wenn man sich mit einer Programmiersprache weiterentwickeln will.

Wir lesen Bücher von Scott Meyers, Bjarne Stroustrup, Nicolai Josuttis und nicht wenige von uns tummeln sich in Blogs studieren und nutzen fremden Code und Libraries. Alles das erweitert unseren „Programmierhorizont“.

Einige C++ Programmierer werden CppDepends kennen. Ein Tool von CodeGears, dass ich auch schon vorgestellt habe.
Die Firma hat eine neue Seite mit dem Titel C/C++ Coding Best Practices Repository . Die Idee ist „gute“ C++ Praktiken zu benennen, zu klassifizieren und zu bewerten. Und das macht in diesem Fall nicht ein Autor, sondern die Community. Wobei eben die Community die Regeln, die eingebracht werden bewerten und aus diesem Scoring könnten sich vielleicht ein paar wertvolle Bausteine heraus kristallisieren.

Solche Projekte können natürlich nur funktionieren, wenn genügend Leute mitmachen. Und da die Idee nicht schlecht ist mache ich hier mal etwas Werbung dafür.

 

C++CommunityProgrammierenVS 2015Martin Richter - Di 09 Jun 2015 18:59

Seit dem Erscheinen der ersten VC++ Express Version haben sich viele Entwickler gefragt, warum weder ATL noch MFC hier verfügbar waren.
Das hat sich nun seit der Existenz der VS-2013 Community Edition geändert.

Sowohl die Visual Studio 2013 Community Edition als auch die bereits veröffentlichte Visual Studio 2015 RC Community Edition enthält sowohl die ATL als auch die MFC. D.h. auch, dass es damit einfacher wird für nicht kommerzielle Entwickler die entsprechenden Libraries zu verwenden.

Das ist auch endlich ein Durchbruch, der von der MVP-Community seit dem erscheinen der aller ersten Express Version angemahnt und gefordert wurde.

Die aktuellen Downloads finden sich hier:
http://www.visualstudio.com/de-de/downloads/download-visual-studio-vs.aspx
http://www.visualstudio.com/en-us/products/vs-2015-product-editions.aspx

Bei der Installation der VS-2015 Community Edition muss man allerdings darauf achten die MFC mit auszuwählen. In der Standardinstallation wird diese nicht hinzugefügt. In der VS-2013 Version wird die MFC automatisch mit installiert.

Nur zur Info:
Die Community Edition ersetzt in Zukunft die Express Versionen. Zudem werden alle Express Editionen in einem Visual Studio Paket zusammen geschnürt. Der Vorteil ist groß. Addons werden verfügbar, für die breite Maße. Opensource Projekte, die die MFC und ATL verwenden stehen nun jedermann zur Verfügung. Weitere Infos finden sich auch hier.
Die Lizenzbedingungen der Commuinity Edition sollte man unbedingt lesen, wenn man die Version auch kommerziell nutzen möchte.

PS: Diese Pakete existieren bereits seit November 2014 aber mir ist diese Info bisher entgangen. Sorry…

C++ProgrammierenVS 2013VS-Tipps&TricksMartin Richter - Do 05 Mrz 2015 19:44

Die Konferenz wird unter dem Thema Doing C++ The Right Way stehen. Bernd Marquardt wird als Content Manager mit für den Inhalt verantwortlich sein.

Da die Agenda noch nicht sehr voll ist, bin ich auf die endgültige Themenauswahl doch gespannt. C++11 ist ja fast schon ein alter Hut und Parallelisierung wird auch schon etwas langweilig. 😉 Es stehen zumindest altbekannte Namen auf der Rednerliste.

Veranstalter ist die ppedv AG (hinter der Johannes Preishuber steht). Ich habe die Konferenzen der letzten Jahre, an denen ich teilgenommen habe, immer in guter Erinnerung. Sowohl in der Auswahl der Themen und Redner, als auch in der exzellenten Durchführung, mit immer sehr schon gewählten Konferenzorten und Hotels. Letztes Jahr hätten es ein paar mehr Leute sein können, aber das zeitgleiche Champions-League Spiel in München hat doch vielen einen Strich durch die Rechnung gemacht, weil es keine freien Hotelzimmer mehr gab.

Ich denke die Konferenz lohnt sich sicherlich.
Und ganz gespannt bin ich persönlich auf die Abendveranstaltung am Mittwoch, denn hier wird auf den ADC-Konferenzen den Teilnehmern immer etwas wirklich außergewöhnliches geboten und auch diesmal wird wieder zu etwas „Speziellem“ eingeladen. Letztes Jahr das Essen in der Flugwerft Schleißheim war schon etwas besonderes.

Ich freue mich auch dieses Jahr wieder dabei sein zu können; alte Kontakte beleben zu können, neue Entwickler kennen zu lernen und Neues aus der C++ Welt zu hören.

ADC

 

C++DebuggingProgrammierenVS 2010VS 2013Martin Richter - Sa 03 Jan 2015 11:54

Overlapped I/O ist eine Standardtechnik, die ja jeder kennt, der mit Datenquellen arbeitet, die „irgendwann“ mal Informationen liefert, man aber in der Zeit evtl. noch anderes zu tun hat 😉

In meinem Fall, den ich hier schildere, benutzte unser Programm einen Service, mit dem es über Named Pipes kommuniziert. Das entsprechende Modul, ist schon ziemlich alt und hat seit ca. 3 Jahren keine Änderung erfahren. Aber jetzt auf einmal häuften sich Meldungen, dass unser Programm beim Beenden einen UAE auslöst.

Entsprechende Minidumps wurden angefordert und deren Analyse zeigte eigentlich nicht viel wirklich erhellendes.  Es sah alles danach aus, als ob ein Speicherblock freigegeben wird, der bereits freigegeben wurde.
Leider konnte das Szenario in unserem Testfeld nicht einfach nachgestellt werden. Und auch mehrfache Analyse des Sourcecodes brachte erst einmal nichts. Man ist manchmal einfach betriebsblind 🙁

Auffällig war aber, dass diese Meldungen erst vereinzelt auftraten nachdem unsere Software auf VS-2013 Update 3 umgestellt war und diese an Kunden ausgerollt wurde. Und weiterhin konnten wir feststellen, dass alle diejenigen, die diesen Fehler gemeldet haben, relativ leistungsfähige Rechner hatten.

Schließlich gelang es mir, das Szenario auf einem meiner Entwicklungsrechner nachzustellen.

Das passierte:

  1. Das Programm erhielt den Befehl zum Beenden.
  2. Irgendwann wurde auch dem Thread, der mit dem Service interagiert gesagt, dass er sich beim Dienst ausloggen soll.
  3. Der Dienst gibt auch brav den Befehl „Logoff“ an den Service.
  4. Der Thread der in einer Schleife immer auf einen Response des Dienstes wartet beendet sofort.
  5. Und nun erfolgte der Crash.

Die Ursache war ein fehlender CancelIo. Damit das Beenden möglichst schnell vonstatten geht, wurde darauf verzichtet, auf eine Antwort des Services zu warten, ob der Logoff Befehl verstanden wurde, denn kurz danach wird sowieso die Pipe geschlossen. Keine gute Idee in diesem Fall! Das hatte auch den Grund darin, dass

Was ist also passiert ❓

  • Die OVERLAPPED Struktur für den Lesevorgang lag auf dem Stack innerhalb einer while Schleife, die auf verschiedene Events wartet.
  • Die Funktion in der diese Struktur deklariert war wurde aber bereits verlassen.
  • Wenn dann sehr schnell die Antwort des Dienstes kam, wurde in die alte Adresse der OVERLAPPED Struktur ein Wert verändert.
  • … und damit wurde der Stack an dieser Stelle zerstört.

Es waren in meinem Fall nur 4 Bytes und in manchen Fällen würde eine Rücksprungadresse verändert und es kam zum Crash. In anderen Fällen wurde Speicher verändert, der nicht mehr benutzt wurde. Das ganze passierte eben auch nur auf den Systemen, die sehr schnell auf die Antwort des Dienstes reagierten. Kam die Antwort spät genug, war die Änderung des Speichers nicht mehr gefährlich.

Der Fehler blieb jahrelang unentdeckt, weil scheinbar das Stacklayout, das durch den VS-2010 Compiler erzeugt wurde, gegen diesen Fehler unempfindlich war, weil nur Speicher verändert wurde, der nicht zu einem Fehler führte.

Was lerne ich daraus:
Wenn ich einen ReadFile mit OVERLAPPED verwende, sollte ich immer darauf achten, dass im Bedarfsfall auch dieser Vorgang abgebrochen wird durch ein CancelIo ❗ Ein CancelIo mehr kann nicht schaden, wenn man den Block verlässt, in der eine OVERLAPPED Struktur definiert war.

C++ProgrammierenVS 2013Martin Richter - Mi 02 Apr 2014 22:32

Mit dem neuen SQL 2014 der gestern veröffentlicht wurde kamen auch ein RC für Visual Studio 2013 Update 2. Dabei ist das Update 1 erst ende Januar heraus gekommen.
Das Update 2 für den TFS 2013 ist bereits veröffentlicht worden.
Siehe:  http://blogs.msdn.com/b/bharry/archive/2014/04/02/tfs-2013-2-update-2-released.aspx

Besonders gespannt bin ich auf die Linker Enchantements, die mit Update 2 kommen.
http://blogs.msdn.com/b/vcblog/archive/2014/03/25/linker-enhancements-in-visual-studio-2013-update-2-ctp2.aspx

Die Geschwindigkeit mit der aktuell Updates und Releases veröffentlicht werden ist geradezu verstörend. Man kommt kaum dazu sich auf eine Entwicklungsumgebung festzulegen und da ist schon das nächste Update, dass mit neuen Features Funktionen und Fixes reizt. 🙁

PS: Die Veröffentlichung von MS-SQL 2014 erinnert mich schmerzhaft, dass es nur noch 5 Jahre Support für OLE-DB gibt. Das ist noch einen traurigen Smiley wert 🙁

C++CommunityProgrammierenVS 2013Martin Richter - Mo 24 Mrz 2014 20:32

Wer das lange Wochenende zum 1. Mai auf ganz besondere Weise einleiten will, dem rate ich die ADC C++ Konferenz vom 29.-30.04.2014 in München zu besuchen.

Die Agenda enthält alt bekannte Themen, aber auch interessantes Neues. Nachdem mit C++x11, C++/RT wieder etwas Schwung in die Weiterentwicklung von C++ gekommen ist und auch die Geschwindigkeit in denen neue Compiler und Library Features veröffentlich werden beschleunigen, lohnt sich ein Blick über den Tellerrand.
Oft genug finden wir als Entwickler nicht die Zeit uns neuem zu widmen, dass bereits verfügbar ist oder in nächster Zeit verfügbar wird.

Veranstalter ist die ppedv AG (hinter der Johannes Preishuber steht). Ich habe die Konferenzen der letzten Jahre, an denen ich teilgenommen habe, immer in guter Erinnerung. Sowohl in der Auswahl der Themen und Redner, als auch in der exzellenten Durchführung, mit immer sehr schon gewählten Konferenzorten und Hotels.
Insofern lohnt sich sicherlich ein Blick in die Agenda.
Und ganz gespannt bin ich persönlich auf die Abendveranstaltung am Mittwoch, denn hier wird auf den ADC-Konferenzen den Teilnehmern immer etwas wirklich außergewöhnliches geboten.

Da ich letztes Jahr aus privaten Gründen leider nicht teilnehmen konnte freue ich mich dieses Jahr wieder dabei sein zu können; ,alte Kontakte beleben zu können, neue Entwickler kennen zu lernen und Neues aus der C++ Welt zu hören.

ADC

C++DebuggingProgrammierenMartin Richter - Do 05 Dez 2013 18:33

… oder auch: Es gibt Tage, da könnte man sich in der Tischplatte verbeißen…

Wir haben vor ein paar Wochen einen sehr mystischen Fehler in unserer Software gefunden.
Das Problem war eine Funktion, die einen (const) Zeiger auf einen Datenblock bekam.
Die Funktion hat aber unter Umständen eine UI-Interaktion (Dialog) ausgelöst und die entsprechende offene Nachrichtenschleife hat es wiederum einen Hintergrundthread erlaubt (unter bestimmten Umständen) Nachrichten an den Mainthread zu senden, der wiederum die Anzeige aktualisierte und auch den Datenblock, der eben noch als Zeiger übergeben wurde, ungültig machte.

Die Funktion sah in etwa so aus:

bool CSomeClass::SomeAction(const S_FOO *pData)
{
...

pData war nun ungültig und wurde verändert, war aber immer noch gültiger Speicher in dem ein paar Ids aus einer Datenbank standen. Das Programm stürzte nicht ab. Tat aber aufgrund der falschen Ids auch nicht das, was es eigentlich sollte.

Der Code wurde dann wie folgt geändert und ein entsprechender Kommentar geschrieben:

bool CSomeClass::SomeAction(const S_FOO &data)
{
// We use a copy of the result object. There is a chance that the
// global result gets replaced while we are inside this routine and 
// the storage where our pointer points gets deleted and replaced 
// by a new result object.
...

Oha. Aber was passierte hier. Anstatt wirklich eine Kopie zu verwenden, wurde wieder nur ein Zeiger verwendet. Nur diesmal in Form einer Referenz.

Es wird nun niemanden wundern., dass mir die selbe Fehlebeschreibung wieder auf den Tisch flatterte. Im Debugger  wurden die selben Probleme festgestellt und ich musste dreimal auf die Code-Zeile schauen und den Kommentar dreimal lesen, bevor ich verstand was hier geändert wurde.

  • Fehler erkannt.
  • Fehler dokumentiert.
  • Fehler aber nicht gefixed.

So hätte es aussehen müssen:

bool CSomeClass::SomeAction(const S_FOO data)
{
...

PS: Ich oute mich mal. Der Trottel war ich…

ATLC++CRTMFCProgrammierenVS 2013Martin Richter - Mi 21 Aug 2013 17:32

Im Microsoft C++ Team Blog kann nachgelesen werden was sich in ALT+MFC in VS-2013 tun wird:
http://blogs.msdn.com/b/vcblog/archive/2013/08/20/atl-and-mfc-changes-and-fixes-in-visual-studio-2013.aspx

Wer hätte es gedacht…, ja es gibt wieder etwas „Neues“, auch wenn es mehr oder weniger nur Bugfixes sind.

Besonders erwähnenswert ist der Wegfall des MBCS Supports in der MFC, siehe auch hier.
Das die ATL jetzt nur noch als statische Bibliothek mit sehr kleinem Footprint existiert ist nett. Warum eigentlich nicht gleich so?

Nachtrag und Korrektur durch den aufmerksamen Blog-Leser Sasche:

Wie auch im verlinkten Artikel beschrieben, fällt der MBCS Support in VS-2013 noch nicht weg, sondern ist erst mal nur “deprecated” (und die entsprechenden Libs nur noch als separater Download verfügbar). Erst in einer Folgeversion soll der Support für MBCS ganz wegfallen.

 

C++CommunityProgrammierenMartin Richter - Do 20 Jun 2013 17:35

<Ironie>Mittlerweile frage ich mich ob Microsoft überhaupt noch eine Community will.</Ironie>
Ja sicher wollen sie das und sagen und versichern tun das auch alle Offiziellen immer und überall. Das nehme ich Ihnen sogar ab. Aber mit der Umstellung der Forensoftware haben sie sich wohl eher einen Bärendienst geleistet. Und mit dieser „neuen“ eigenen MSDN-Forenplattform werden Sie kaum Bäume ausreißen.

Die HTTP Foren wurden nun ein weiteres Mal umgestellt und sind nun – aus meiner persönlichen Sicht – gar nicht mehr zu bedienen.
Weiterhin bezweifle ich stark, dass sich mit dieser neuen Forensoftware wirklich viele Nutzer anfreunden können. Es ist einfach auf den ersten, zweiten und dritten Blick viel zu undurchschaubar und chaotisch. Man findet alles mögliche, nur nicht das was man sucht. Die Übersicht über Meine Foren, ist kaum zu gebrauchen, alte nicht mehr existente Einträge lassen sich nicht entfernen. Meine Forenthreads fehlt ganz! Es ist extrem kompliziert zwischen den deutschen und englischen Forenbereichen zu wechseln. Ich verirre mich immer in den deutschen, englischen, Technet, MSDN Seiten. Tausend Foren und Bereiche aber keine Übersicht. Optische großflächige Schalter rauben den Raum für eigentliche Informationen. Es muss ja jetzt alles „flat“ sein.
Ich verstehe nicht, warum Filter den Vorzug vor klaren Baumstrukturen bekommen?

Von den Bugs will ich gar nicht reden: „Leider kann Ihre Anforderung nicht bearbeitet werden.“ , „Es wurden keine Ergebnisse gefunden.“, Links Führen ins leere, Administrative Funktionen melden Serverfehler. Die NNTP-Bridge arbeitet nicht. Es gehen wieder Gerüchte um, dass die Bridge ganz eingestellt wird. 🙁

DAS macht keinen Spaß. Ich muss mir stark überlegen, ob ich hier überhaupt noch vorbei schauen soll.
Aber da sich hier seit „Zerstörung“ der NNTP Foren auch keine neue Community gebildet hat, ist das wohl auch kein großer Verlust: Der letzte macht dann mal das Licht aus…

C++CRTProgrammierenVS 2012Martin Richter - Mo 20 Mai 2013 17:58

In einem Note in meinem Blog wurde es ja auch erwähnt, das Update 2 zu Visual Studio 2012 eine Regression hat. Mit Update 1 konnte man wieder Programme bauen, die auch auf Windows XP laufen. Update 2 machte dies wieder zunichte. Jetzt ist ein RC für Update 3 verfügbar gemacht worden mit dem dieser Fehler behoben wurde.

Hier die Ankündigung im C++ Blog:
http://blogs.msdn.com/b/vcblog/archive/2013/05/07/fix-visual-studio-2012-update-2-breaks-windows-xp-targeting-with-atl-and-or-statically-linking-mfc.aspx

Nächste Seite »