Valgrind Error

05/29/2016 16:36 .Scy#1
Wie der Titel bereits vermuten lässt, zeigt mir Valgrind einen Fehler an, welchen ich einfach nicht finde.
Here is what i wrote so far:

Code:
int login(char* input, int input_length){
	//input = base64encoded user:pass
	//decode data
	//find username
	//find pass
	//hash pass
	SHA1_CTX context;
	uint8_t digest[20];
	char* passlocation = NULL;
	char* decoded = NULL;
	char* username = NULL;
	char* pass = NULL;
	int temp = 0;
	int login_status = -1;
	int i = 0;
	decoded = NULL;

	if(input != NULL) {
		decoded = base64_decode(input, input_length);
	}
	if(decoded == NULL){
		return -1;
	}
	passlocation = strchr(decoded, ':'); //First Uninitalised error
	if(passlocation) {
		temp = strlen(input) - strlen(passlocation);
	}
	if(temp == 0 || temp == (input_length-1)){
		return -1;
	}
	username = calloc(temp+1, sizeof(char));
	strncpy(username, decoded, temp); //Second Uninitalised error
	pass = calloc((input_length - temp), sizeof(char)); //Third Uninitalised error

	strcpy(pass, (passlocation+1)); //inavlid read of size 1

	if(username != NULL && pass != NULL){
		printf("Username: %s\n", username); //Fourth Uninitalised error
		printf("Password: %s\n", pass); //Invalid read of size 1
	}


	SHA1_Init(&context);
	SHA1_Update(&context, (uint8_t *) pass, strlen(pass)); //invalid read of size 1
	SHA1_Final(&context, digest);


	login_status = identify_user(username, temp,(char*) digest);
	clean_free(username);
	clean_free(pass);
	clean_free(decoded);
	printf("%d\n",login_status);
	return login_status;
}

base64_decode:

Code:
char* base64_decode(char* toDecode, int toDecode_length){
	static char encoding_table[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
	                                'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
	                                'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
	                                'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
	                                'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
	                                'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
	                                'w', 'x', 'y', 'z', '0', '1', '2', '3',
	                                '4', '5', '6', '7', '8', '9', '+', '/'};
	char* i=toDecode;
	char* decoded = calloc(256,sizeof(char));
	int octets[24];
	int s=6;
	int sc=0;
	int c=0;
	int n=0;
	int threechars=0;
	int threecharC=0;
	int decodeC;
	int deLoop;
	int expo=1;
	int aValue;
	char temp;
	while(c<(toDecode_length)){													//länge des toDecode
			n=0;
		if(toDecode[c]!='='){
			while(toDecode[c]!=encoding_table[n]){								//base64 char Wert ermitteln
				n++;
			}
			for(sc=1;sc<7;sc++){												//base64 char Wert in binär
				octets[s-sc]=n%2;
				n=n/2;

			}
			for(sc=0;sc<6;sc++){												//Ausgabe des Binärwertes in Konsole (Debug)
				//printf("%d",octets[s-6+sc]);
			}
		}else{
			for(sc=1;sc<7;sc++){												//bei base64 wert '=' mit 0 füllen
				octets[s-sc]=0;
				}
		}
			s=s+6;
			i++;
			threechars++;
		if(threechars==4){														//ermitteln des ascii wertes und schreiben in decoded
			for(deLoop=8;deLoop<=24;deLoop=deLoop+8){
				for(decodeC=1;decodeC<=8;decodeC++){
					if(octets[deLoop-decodeC]==1){
						aValue=aValue+expo;
					}
					expo=expo*2;
				}
				temp=aValue;
				decoded[threecharC]=temp;
				expo=1;
				aValue=0;
				threecharC++;
			}
		threechars=0;
		s=6;
		}
		c++;

	}
	//printf("return value %d",n);
	return decoded;

}
Valgrind-log(via Command-line not Eclipse Plug-in)


Ich erwarte hier von keinem meinen code vollständig zu überarbeiten, ich möchte lediglich wissen warum ich den ersten fehler(und damit denke ich folgefehler) bekomme.
Mittlerweile sitze ich hier seit knappen 30stunden dran diesen fehler zu finden(-schlaf), habe auch schon verschiedene personen gefragt & es auch schon auf stackoverflow gepostet, wo mir aber keiner helfen konnte.
05/29/2016 17:42 Shadow992#2
Meine Vermutung liegt hier:
Code:
int aValue;
Wenn man in deinem Code einmal alle möglichen Verzweigungen und Sprünge im Kopf durchgeht, sieht man sehr schnell, dass da etwas gewaltig schief gehen kann, nämlich wenn man die Befehle in folgender Reihenfolge abarbeitet:

Code:
int aValue;
// ...
temp=aValue;
// ...
decoded[threecharC]=temp;
Da siehst du dann, dass du in decoded eine noch nicht initialisierte Variable reinhaust vom Typ int. Das heißt damit ist an einer Stelle im decoded-Array ein nicht initialisierter Wert vorhanden. Das merkt man aber erst, wenn der Wert tatsächlich für Vergleiche o.ä. benutzt wird.

Scheinbar wird in "strchr" verglichen (muss ja auch, ist also nix überraschendes :D), da aber in decoded min. ein Element nicht initialisiert ist, schmeißt er dir an genau dieser Stelle einen Fehler.

Am besten alle Variable initialisieren und dann noch einmal testen.

Kleine Anmerkung noch am Rande:
Ein paar schönere Variablennamen schaden auch nicht. :P
05/29/2016 18:31 .Scy#3
Du bist mein held, dadurch sind alle(bis auf ein speicher fehler) valgrind fehler behoben! (die logischen kann man dann jetzt verbesser)

VIELEN DANK!
ich hab echt seit heute morgen um 10 über stackoverflow und ähnliches versucht die fehler zu beheben(alleine sogar schon seit gestern mittag) und niemand kam auf diese idee!
05/30/2016 01:59 Lazeboy#4
Durch genau so einen Fehler, wirst du wahrscheinlich nie wieder einer Variable bei der Deklarierung keine Initialisierung geben ;) hat aber jeder schonmal durch gemacht :D
05/30/2016 18:22 Dr. Coxxy#5
praktisch jede vernünftige ide heutzutage gibt einem da schon sehr explizite warnungen.