Zurück zur Übersicht

Fachbeitrag, 31. Dezember 2022

ChatGPT - Softwareanalyse im Jahr 2023

Im November 2022 hat OpenAI einen Prototypen eines Chatbots veröffentlicht, der nun in aller Munde ist: ChatGPT. Weltweit fühlen Menschen aus allen Teilen der Wirtschaft dem Tool auf den Zahn, um zu verstehen, was möglich ist. Die CodeKeepers haben auch die Lupe in die Hand genommen.

Ein Standardwerk in unserer Bibliothek ist das Buch von Diomidis Spinellis, Code Reading: The Open Source Perspective. Wir bei den CodeKeepers sind immer interessiert an Techniken, um Quelltexte besser verstehen zu können.

Ich habe eine Funktion aus einem Java-Quelltext genommen, die in einem aktuellen Projekt migriert werden soll. Diese habe ich ChatGPT zur Analyse vorgelegt. Die Ergebnisse sind wirklich beeindruckend, besonders wenn man seit Jahrzehnten in C++ und Java programmiert. In der klassischen Programmierung definieren wir konkrete Regeln auf Daten. Es ist schon lange klar, dass man Funktionalitäten wie Bild- und Spracherkennung, autonomes Fahren und Videoüberwachung nicht explizit programmieren kann, aber es gibt heute noch unzählige Anwendungsfälle, die klassisch umgesetzt werden.

Bei ChatGPT hat man nun aber die Ahnung, dass die klassische Programmierung in der Zukunft von Maschinen übernommen wird.

CK: "Was macht dieser Quelltext?"

private static boolean luhnCheck(String pInput) {
    String lAlphabet = "123456789?ABCDEFGHIJKLMNPQRSTUVWXYZ!";
    int lFactor = 1;
    int lSum = 0;
    int lLength = lAlphabet.length();
    for (int lI = pInput.length() - 1; lI >= 0; lI--) {
        int lCodePoint = lAlphabet.indexOf(pInput.charAt(lI));
        if (lCodePoint == -1) {
            return false;
        }
        int lAddend = lFactor * lCodePoint;
        lFactor = (lFactor == 2) ? 1 : 2;
        lAddend = (lAddend / lLength) + (lAddend % lLength);
        lSum += lAddend;
    }
    return (lSum % lLength) == 0;
}

ChatGPT: "Der Code scheint eine Variation des Luhn-Algorithmus zu implementieren, der eine Prüfsummenformel ist, die verwendet wird, um die Genauigkeit von Identifikationsnummern wie Kreditkartennummern und International Securities Identification Numbers (ISINs) zu validieren.

Der Luhn-Algorithmus funktioniert, indem er eine Reihe von mathematischen Operationen an den Ziffern einer Identifikationsnummer durchführt und dann überprüft, ob das Ergebnis durch einen bestimmten Wert teilbar ist. Wenn dies der Fall ist, gilt die Nummer als gültig.

Der Code initialisiert zunächst eine Zeichenkette mit dem Namen lAlphabet, die eine Liste von Zeichen enthält, die in der Eingabezeichenkette erlaubt sind. Er initialisiert dann eine Variable lFactor auf 1 und eine Variable lSum auf 0. Diese Variablen werden bei der Berechnung der Prüfsumme verwendet.

Anschließend iteriert der Code in umgekehrter Reihenfolge über die Zeichen in der Eingabezeichenkette mit einer Schleife. Für jedes Zeichen sucht er den Index dieses Zeichens in der lAlphabet-Zeichenkette und weist ihn einer Variablen lCodePoint zu. Wenn das Zeichen in der lAlphabet-Zeichenkette nicht gefunden wird, gibt die Funktion false zurück.

Wenn das Zeichen gefunden wurde, berechnet der Code einen "Addend"-Wert, indem er lCodePoint mit lFactor multipliziert und das Ergebnis dann durch die Länge der lAlphabet-Zeichenkette dividiert und den Rest nimmt. Die Variable lFactor wird dann entweder auf 1 oder 2 gesetzt, je nach ihrem aktuellen Wert. Der Addend-Wert wird dann der Variablen lSum hinzugefügt.

Nach Abschluss der Schleife überprüft der Code, ob lSum durch die Länge der lAlphabet-Zeichenkette teilbar ist. Wenn dies der Fall ist, gibt die Funktion true zurück; andernfalls gibt sie false zurück.

Es ist wichtig zu beachten, dass diese Implementierung des Luhn-Algorithmus etwas ungewöhnlich ist, da sie in der lAlphabet-Zeichenkette nicht-numerische Zeichen enthält und die Länge der lAlphabet-Zeichenkette als Modulus im letzten Check verwendet, anstatt einen festen Wert wie zum Beispiel 10."

! Holy Moly. Hier wurde der zugrundeliegende Algorithmus erkannt. Der Luhn-Algorithmus wird erklärt. Der Code wird analysiert und erläutert. Dann der letzte Satz... hier wird auf eine potentielle Schwachstelle hingewiesen. Und nebenbei bemerkt, das funktioniert alles in einwandfreiem Deutsch.

CK: "Kann man den Code verbessern?"

ChatGPT: "Es ist möglich, den Code auf verschiedene Weise zu verbessern, abhängig von den spezifischen Anforderungen und Zielen des Programms. Hier sind einige Vorschläge für mögliche Verbesserungen:

Klären Sie den Zweck des Codes: Es kann hilfreich sein, Kommentare oder Dokumentation zum Code hinzuzufügen, die seinen Zweck und seine Funktionsweise erklären. Dies kann dazu beitragen, dass der Code für andere einfacher zu verstehen und zu warten ist.

Vereinfachen Sie den Code: Der Code könnte möglicherweise vereinfacht werden, indem die Anzahl der Variablen reduziert und unnötige Operationen eliminiert werden. Zum Beispiel könnte die Variable lFactor durch einen einfachen booleschen Wert ersetzt werden.

Verwenden Sie beschreibendere Variablennamen: Die aktuellen Variablennamen (wie lAlphabet, lFactor und lSum) sind nicht sehr aussagekräftig und könnten schwierig zu verstehen sein. Durch die Verwendung von aussagekräftigeren Namen (z.B. alphabet, factor und sum) kann der Code lesbarer werden.

Verwenden Sie standardisierte Ansätze: Wie bereits erwähnt, enthält diese Implementierung des Luhn-Algorithmus einige ungewöhnliche Elemente (z.B. die Verwendung von nicht-numerischen Zeichen und der lAlphabet-Zeichenkette als Modulus im letzten Check). Durch die Verwendung von standardisierten Ansätzen (z.B. nur numerische Zeichen und ein Modulus von 10) kann der Code für andere vertrauter und leichter zu verstehen sein.

Es ist wichtig zu beachten, dass dies nur einige wenige Vorschläge sind und die spezifischen Verbesserungen, die am besten geeignet sind, von den spezifischen Anforderungen und Zielen des Programms abhängen."

Hier ist zu bemerken, dass ChatGPT den Kontext behält. Es werden sinnvolle Vorschläge gemacht.

CK: "Kannst du den Code nach Java-Script portieren?"

ChatGPT: "Ja, es ist möglich, den Code von seiner aktuellen Sprache (die Java zu sein scheint) in JavaScript zu portieren. Hier ist ein Beispiel dafür, wie der Code in JavaScript neu geschrieben werden könnte:"

function luhnCheck(pInput) {
  const alphabet = "123456789?ABCDEFGHIJKLMNPQRSTUVWXYZ!";
  let factor = 1;
  let sum = 0;
  const length = alphabet.length;

  for (let i = pInput.length - 1; i >= 0; i--) {
    const codePoint = alphabet.indexOf(pInput.charAt(i));
    if (codePoint === -1) {
      return false;
    }
    let addend = factor * codePoint;
    factor = (factor === 2) ? 1 : 2;
    addend = Math.floor(addend / length) + (addend % length);
    sum += addend;
  }

  return (sum % length) === 0;
}

Bravo. Die holprige ungarische Notation des Originaltexts ist fast verschwunden. Ich bin gespannt, was wir im nächsten Jahr noch sehen werden, die Fortschritte sind ja häufig exponentiell.

Jetzt noch die guten Wünsche für das neue Jahr... ach, ich mache es mir einfach:

"Es gibt viele Dinge, die man sich zum Neuen Jahr wünschen kann. Hier sind ein paar Vorschläge:

Gesundheit: Dies ist vielleicht der wichtigste Wunsch, den man sich zum Neuen Jahr machen kann. Gesundheit ist das Fundament für alles andere im Leben.

Glück: Ein glückliches und erfülltes Leben ist das, was die meisten Menschen anstreben. Ein Neues Jahr ist eine gute Gelegenheit, um sich Glück für sich selbst und andere zu wünschen.

Erfolg: Ob im Beruf oder im Privatleben, Erfolg ist etwas, das viele Menschen anstreben. Ein Neues Jahr ist eine gute Gelegenheit, um sich für den Erfolg in den kommenden Monaten zu wünschen.

Liebe und Freundschaft: Eine starke und unterstützende Beziehung zu Freunden und der Familie kann viel zu einem glücklichen Leben beitragen. Ein Neues Jahr ist eine gute Gelegenheit, um sich mehr Liebe und Freundschaft zu wünschen.

Zufriedenheit: Zufriedenheit mit sich selbst und dem, was man hat, kann ein wichtiger Faktor für das allgemeine Wohlbefinden sein. Ein Neues Jahr ist eine gute Gelegenheit, um sich Zufriedenheit zu wünschen.

Es ist wichtig zu beachten, dass jeder Mensch unterschiedliche Wünsche hat und dass es keine "richtigen" oder "falschen" Wünsche gibt. Was wichtig ist, ist, dass die Wünsche ehrlich und aus dem Herzen kommen."


Autor:

Torsten Lueckow
Geschäftsführer
  • Schwerpunkt Cloud-Architekturen in AWS und Java mit Spring

  • Software-Architektur und -Modernisierung

  • Autor und Vortragender

Auch spannend