Code – String in C anlegen

Es gibt eine Weit verbreitete Sicherheitslücke in C Programmen, welche auf die dynamische allokation von Strings zurückgeht.
Da diese recht einfach zu umgehen ist, wollte ich hier kurz eine Notiz hinterlassen.

Nehmen wir mal an, ich habe ein Hello World Programm geschrieben, dass dynamisch einen String anlegt.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int
main (int argc, char *argv[])
{
	char *str = malloc (strlen ("Hello World!") * sizeof (char));
	
	// Fehler, es ist kein Platz für die Binäre 0 (\0)
	strcpy (str, "Hello World!");
	
	printf ("%s\n", str);
	
	free (str);
	return 0;
}

Da beim malloc nur 12 Byte reserviert werden, und strcpy immer eine Binäre 0 (\0) dranhängt, ist zu wenig Speicherplatz vorhanden.
Dass nennt man buffer overflow.

Um die gefährliche Lücke zu umgehen, kann man auf eine Funktion in der String Bibliothek zurückgreifen.
strdup legt den benötigten Speicherplatz an und Initiiert im Anschluss den String.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int
main (int argc, char *argv[])
{
	char *str = strdup ("Hello World!");
	
	printf ("%s\n", str);
	
	free (str);
	return 0;
}

Code – Was ist size_t?

Vor ein paar Tagen habe ich Zufällig erfahren warum size_t für Index Variablen am besten geeignet ist. Der Grund ist schnell Erklärt. Der Typ size_t ist zwar auf x86 / x64 ein typedef auf unsigned int, jedoch ist garantiert dass Plattform unabhängig der Typ alle Indizes eines Arrays erreichen kann.

size_t i; // i kann immer alle Indizes abbilden kann.
unsigned int j; // Es ist nicht sichergestellt dass j auf allen Plattformen alle Indizes abbilden kann.

Code – Ein Kalender

Ich habe heute mal aus Spaß angefangen eine kleine Kalender Applikation zu entwickeln.
Ist zwar noch nichts besonderes, sie erfüllt aber trotzdem ihren Zweck und zeigt eine Übersicht über die Wochentage des aktuellen Monats an.
Die Anwendung nutzt die Bibliotheken von Gnome 3 und ist in Python geschrieben sodass sie sich leicht erweitern und an die eigenen Bedürfnisse anpassen lässt.
Die Basis besteht derzeit aus knapp 100 Zeilen Quellcode sowie ein Icon dass ich mithilfe von Gimp erstellt habe.

Es sind im Grunde nur ein Haufen Labels in einem Grid.
Die erste Reihe in dem Grid ist immer für die Namen der Wochentage reserviert.
Namen der Wochentage werden dabei automatisch in der Systemsprache angezeigt.
Zusätzlich wird die Schrift von dem Samstags- und dem Sonntags-Feld Rot gefärbt um sie als freie Tage besser zu erkennen.

Ich plane noch eine Funktion zur Verwaltung von Aufgaben und Events einzubauen sodass man für jeden Tag diese einzeln festlegen kann.

Hier ein Bildschirmfoto wie die Software aktuell aussieht:

Quelle - Marc Volker Dickmann
Quelle – Marc Volker Dickmann

Code – Kleine ToDo Liste für den Webbrowser

Da ich öfter eine kleine ToDo Liste brauche und dafür nicht jedes mal extra ein Programm installieren möchte habe ich mir eine HTML Datei angelegt die eine bietet.
Dafür habe ich HTML, CSS und JavaScript verwendet sodass sie eigentlich auf jedem JavaScript fähigem Gerät benutzt werden kann.
Allerdings ist diese nicht mal fähig die Daten zu speichern wobei dies mit HTML5 sich auch nachträglich hinzufügen lässt.

Hier der Code:

<!-- Copyright 2014 Marc Volker Dickmann -->
<html>
	<head>
		<title>ToDo's</title>
		<meta charset="UTF-8">
		<script language="javascript">
			function add_todo() {
				var mainlist = document.getElementById("mainlist");
				var text = document.getElementById("todo").value;
				mainlist.innerHTML = mainlist.innerHTML + "<li>" + text + "</li>";
			}
		</script>
		<style>
			div.main {
				width: 80%;
				background: #fcffb4;
				border-left: 1px solid #e3e6a2;
				border-right: 1px solid #e3e6a2;
				border-top: 1px solid #e3e6a2;
				margin-left: auto;
				margin-right: auto;
				font-family: ubuntu;
			}
			ul.todolist {
				list-style: none;
			}
			ul#mainlist {
				min-height: 600px;
				padding-bottom: 0px;
			}
			ul#input input {
				width: 90%;
				height: 64px;
				background: #54362d;
				border: 2px solid #70483c;
				color: black;
				text-align: center;
				font-size: 60px;
			}
			ul#input button {
				background: #54362d;
				border: 2px solid #70483c;
				color: black;
			}
			ul.todolist li {
				width: 90%;
				height: 64px;
				background: #5f3d33;
				border: 1px solid #70483c;
				color: black;
				margin-left: 3.5%;
				margin-right: 3.5%;
				margin-top: 3.5%;
				text-align: center;
				font-size: 60px;
			}
		</style>
	</head>
	<body>
		<header>
			<h1>ToDo's</h1>
		</header>
		<div class="main">
			<ul id="mainlist" class="todolist">
			</ul>
			<ul id="input" class="todolist">
				<li><form action="javascript:add_todo();"><input id="todo" type="text"><button type="submit">+</button></form></li>
			</ul>
		</div>
	</body>
</html>