Archive for March, 2008

Unreachable code in C# for loop – intelligenter compiler

Thursday, March 20th, 2008

Hallo,

kürzlich hat mich Microsofts C# compiler mit seiner intelligenten Analyse verblüfft. Ich hatte sinngemäß folgenden code geschrieben:

for (int jj = 0; jj < parts.Length - 1; ++jj)
{
    part = parts[jj];
    int count = result.getRefCount(refAttr);
    for (int ii = 0; ii < count; ++ii)
    {
        EOInstance packagedElement = result.getRefObject(refAttr, ii);
        if (packagedElement.getValue("Name") == part)
        {
            result = packagedElement;
            continue;
        }

    }
    string msg = "Cannot resolve path '" + parts.ToString() +
                     "' for attribute '" + refAttr + ". Unknown part is '" +
                     parts + "'.";

    throw (new Exceptions.UnknownPathException(msg));
}

Der C# compiler meldete:

Fehler CS0162: Warnung als Fehler: Unerreichbarer Code wurde entdeckt.

und die IDE markierte die Inkrement-Anweisung ‘++jj in der äußeren for-Schleife.

Nach konzentrierter Durchsicht des codes ist mit der Fehler aufgefallen: die throw Anweisung sollte in die innere Schleife verschoben werden. So wie der code geschrieben war, wurde die äußere Schleife tatsächlich nur einmal durchlaufen und die Inkrement-Anweisung nie ausgeführt da immer am Ende des ersten Durchlaufs eine exception geworfen wurde.

Der C++ compiler von Visual Studio findet dieses Problem nicht, auch nicht im release build (wo der compiler weitergehende semantische Prüfungen machen kann unter Ausnutzung der Analyse-Ergebnisse des optimizers).

UnreachableCode - 0 Fehler, 0 Warnung(en)
==== Erstellen: 1 erfolgreich, Fehler bei 0, 0 aktuell, 0 übersprungen ====

Bleibt noch die Frage, was PC-Lint (das ich seit mehr als 10 Jahren für alle C++-Entwicklungen verwende) zu der Sache meint.
Enttäuschenderweise meldet es diesen Fehler auch nicht, nicht mal mit zwei Durchläufen (-passes(2)):

PC-lint for C/C++ (NT) Vers. 8.00w, Copyright Gimpel Software 1985-2007

--- Module:   UnreachableCode.cpp (C++)

/// Start of Pass 2 ///

--- Module:   UnreachableCode.cpp (C++)

--- Global Wrap-up

error 900: (Note -- Successful completion, 0 messages produced)

Für diese Test habe ich folgenden mutmaßlich äquivalenten code verwendet:

        for (int jj = 0; jj < 10; ++jj)
	{
		for (int ii = 0; ii < 10; ++ii)
		{
			if (ii == 5)
			{
				continue;
			}
		}

		throw(std::exception("Huh"));
	}

Also wirklich eine beeindruckende Leistung des C# compilers.

Der code enthält übrigens noch einen weiteren logischen Fehler, auf den ich erst durch die Meldung des C# compilers aufmerksam wurde, was aber für die Intention dieses postings nicht relevant ist.

Viele Grüße,
Andreas

Technorati Tags: , , ,

Nachtrag vom 04.05.2008: ein kluger Kollege hat mich darauf hingewiesen, dass Microsoft Visual C++ bei Verwendung von warning level 4 den gewünschten Hinweis tatsächlich meldet. Für meine Produktionssoftware verwende ich /W4, für das kleine Beispielprogramm habe ich es aber bei den defaults belassen.

Ergebnisse der Leserumfrage des dotnet-Magazins: Visio besser als Enterprise Architect?

Tuesday, March 18th, 2008

Hallo,

das dot.net magazin hat eine Leserumfrage nach den besten Entwicklungswerkzeugen in verschiedenen Kategorien veröffentlicht. In der Kategorie “Beste Software-Design- und Modellierungs-Tools” siegte Microsoft Visual Studio Team System mit 18,5% vor Microsoft Visio 2003 mit 15,3% und Enterprise Architect mit 7,7%. Wenn man die reichhaltigen Fähigkeiten von Enterprise Architect mit Visios einfachen UML-Schablonen vergleicht kann man das Ergebnis im besten Fall so interpretieren, dass in der Umfrage nicht das beste Tool gewinnt sondern das unter den Leser des dot.net-Magazins verbreitetste (und das muss nicht das gleiche sein, wie das Ergebnis der Umfrage zeigt). Ich kann mir nicht vorstellen, dass jemand der Enterprise Architect kennt, Visio für ein besseres Modellierungstool hält.

Aber schließlich kommt man mir einer derart für Microsoft schmeichelhaften Darstellung auch in die “Aktuellen News” der Visual Studio Startseite.

Viele Grüße,
Andreas

Gehaltsentwicklung in der IT-Branche

Monday, March 10th, 2008

Guten Tag,

in der Computerzeitung 11/2008 wurde die Gehaltsstudie 2007 der IG Metall vorgestellt.

Die dort berichteten enormen Veränderungen in der Gehaltsentwicklung zwischen 2006 und 2007 wecken bei mir starke Zweifel an der Korrektheit der Studie. Beispielsweise hätten Berufseinsteiger 2006 50.234 EUR bekommen während es in der neuen Studie nur 36.400 EUR seien. “Senior-Entwickler” bekämen statt 61.113 EUR nur noch 42.467 EUR. Solche Sprünge sind kaum erklärbar, insbesondere nicht bei Mitarbeitern die schon länger im Beruf sind.

Da lobe ich mir doch die methodisch nachvollziehbare, differenzierte und detailliert dargestellt Gehaltsumfrage in der c’t 6/2008. Hier wird etwa eine Steigerung des Einkommens deutscher Arbeitnehmer in der IT-Branche um 0,8% im Vergleich zum Vorjahr angegeben – ein weitaus plausiblerer Wert als bei der Studie der IG Metall. Die Ergebnisse enthalten auch eine Aufschlüsselung nach Alter, was angesichts der breiten Streuung unverzichtbar ist (ich gehe davon aus, dass die komplette IG Metall Studie diese Angaben enthält).

Warum die Computerzeitung über die im März 2007 veröffentlichte Studie erst jetzt – rund ein Jahr später- berichtet entzieht sich allerdings meiner Vorstellungskraft.

Unterstreichen kann ich hingegen die Aussage im Schlussteil des Artikels: gerade in der Telekommunikationsbranche wird gnadenlos entlassen um den nächsten Quartalsbericht zu verbessern ohne dass man darüber nachdenkt wie die oft hoch qualifizierten und motivierten Mitarbeiter produktiv eingesetzt werden können.

Viele Grüße,
Andreas