Nieuws:

We zijn er weer.

Na lange tijd van afwezigheid zijn we er weer  :laugh:
We hebben alle wachtwoorden gereset, je oude wachtwoord werkt niet meer.Je moet via het "wachtwoord vergeten"-linkje je wachtwoord resetten. Je krijgt hiervoor een mailtje op het adres dat je bij ons geregistreerd hebt.

De komende tijd zijn we nog druk bezig om de rest van de site op te bouwen, dus het kan zijn dat sommige onderdelen (tijdelijk) niet werken.

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: [C] Getal groter als short als input, erg ?  (gelezen 1815 keer)

Offline Joshua822

  • Documentatieteam
  • Steunpunt: Nee
[C] Getal groter als short als input, erg ?
« Gepost op: 2009/11/07, 18:59:25 »
Hallo allemaal.

Iedereen die C heeft geleerd kent dat kleine programma waarin de gebruiker om een getal wordt gevraagd wel. Maar is het ook veilig ? Stel dat ik de gebruiker vraag om een unsigned short ( de maximumwaarde is in limits.h vastgelegd op +65535 voor dit type variabel ), maar hij / zij een te groot getal, bijvoorbeeld 1000000 geeft. Kan dit kwaad ? Zal er dan geschreven worden op een geheugenlocatie waar het niet bedoeld is ( bijvoorbeeld in het geheugen van een ander programma, of op het opvolgend element in een array ).

Zo ja, kan dit dan voorkomen worden, in een programma als dit :

#include <stdio.h>

short i;

void set_memory ( char * memory_block, unsigned short value, int size_of_block );

int main ()
{
  unsigned short user_input[3];
  printf ( "Give three short integer numbers : " );
  scanf ( "%d", user_input[0] ); scanf ( "%d", user_input[1] ); scanf ( "%d", user_input[2] );
  printf ( "The following numbers have been stored : %d %d %d \n", user_input[0], user_input[1], user_input[2] );
  if ( user_input[0] > user_input[1] && user_input[0] > user_input[2] )
    set_memory ( ( char * ) user_input, user_input[0], 3 );
  else if ( user_input[1] > user_input[0] && user_input[1] > user_input[2] )
    set_memory ( ( char * ) user_input, user_input[1], 3 );
  else
    set_memory ( ( char * ) user_input, user_input[2], 3 );
  getchar ();
  return 0;
}

void set_memory ( char * memory_block, unsigned short value, int size_of_block );
{
  for ( i = 0; i < size_of_block; i++ )
    memory_block[i] = value;
}

Alvast bedankt.

Offline commandoline

  • LoCo-contact
    • marten-de-vries
    • Marten-de-Vries.nl
  • Steunpunt: Nee
Re: [C] Getal groter als short als input, erg ?
« Reactie #1 Gepost op: 2009/11/07, 23:24:41 »
Zelf heb ik geen ervaring met C, maar als ik me niet vergis gaat de short nadat er meer wordt opgeteld dan die max-waarde terug naar 0, en wordt wat er nog resteert bij die nul opgeteld.

Offline Mossie

  • Lid
  • Steunpunt: Nee
Re: [C] Getal groter als short als input, erg ?
« Reactie #2 Gepost op: 2009/11/08, 09:49:54 »
Zelf heb ik geen ervaring met C, maar als ik me niet vergis gaat de short nadat er meer wordt opgeteld dan die max-waarde terug naar 0, en wordt wat er nog resteert bij die nul opgeteld.
Klopt helemaal. Ik heb het net even getest met 2 kleine testprogrammaatjes. De hoogste 16 bits vallen gewoon weg.

Offline Joshua822

  • Documentatieteam
  • Steunpunt: Nee
Re: [C] Getal groter als short als input, erg ?
« Reactie #3 Gepost op: 2009/11/08, 11:00:43 »
Is het ook mogelijk om dan gewoon te zorgen dat als het getal groter is dan 65535 het array element gewoon de waarde 65535 krijgt ?

Offline Mossie

  • Lid
  • Steunpunt: Nee
Re: [C] Getal groter als short als input, erg ?
« Reactie #4 Gepost op: 2009/11/08, 13:49:44 »
Dat is wel mogelijk, maar dan moet je inlezen in een int, en dan controleren of de waarde groter is dan USHRT_MAX, en dan het array item de invoerwaarde of USHRT_MAX te geven.

Offline ertai

  • Lid
    • programming
    • http://www.ertai.nl
  • Steunpunt: Nee
Re: [C] Getal groter als short als input, erg ?
« Reactie #5 Gepost op: 2009/11/08, 15:05:24 »
ehm.. overflow's in C zijn niet goed.. deze worden niet afgevangen en schrijven gewoon verder.. dus je overschrijft andere waardes. Dit moet je dus zeker omvormen..
Is je vraag opgelost? Markeer het als [OPGELOST] in de titel van je bericht!

Offline Joshua822

  • Documentatieteam
  • Steunpunt: Nee
Re: [C] Getal groter als short als input, erg ?
« Reactie #6 Gepost op: 2009/11/08, 16:46:32 »
Citaat
ehm.. overflow's in C zijn niet goed.. deze worden niet afgevangen en schrijven gewoon verder.. dus je overschrijft andere waardes. Dit moet je dus zeker omvormen..

Heeft dit wel iets te maken met een overflow ? Een overflow is toch als er meer waardes naar een array geschreven worden dan er in die array kunnen zitten ?

Offline Rachid

  • Vertaalteam
    • rachidbm
    • Mijn blog
  • Steunpunt: Nee
Re: [C] Getal groter als short als input, erg ?
« Reactie #7 Gepost op: 2009/11/08, 17:16:59 »
Heeft dit wel iets te maken met een overflow ? Een overflow is toch als er meer waardes naar een array geschreven worden dan er in die array kunnen zitten ?
Onder andere
Ben je ook blij dat Ubuntu zo toegankelijk en gratis is, en wil je graag net als ik iets terugdoen, kijk dan eens rond bij mwanzo, dé poort naar het bijdragen aan Ubuntu en haar gemeenschap!

Offline ertai

  • Lid
    • programming
    • http://www.ertai.nl
  • Steunpunt: Nee
Re: [C] Getal groter als short als input, erg ?
« Reactie #8 Gepost op: 2009/11/08, 17:56:36 »
als je het niet netjes afvangt dan zijn het denk ik wel overflow's en schrijf je gewoon verder. (denk ik.. lang geleden dat ik in C heb geprogt.. dus weet het niet zeker meer)
Is je vraag opgelost? Markeer het als [OPGELOST] in de titel van je bericht!

_san

  • Gast
Re: [C] Getal groter als short als input, erg ?
« Reactie #9 Gepost op: 2009/11/08, 18:09:19 »
Heeft dit wel iets te maken met een overflow ? Een overflow is toch als er meer waardes naar een array geschreven worden dan er in die array kunnen zitten ?
Onder andere

Om het even simpel te houden, het is gewoon een waarde aan een adres toekennen die groter is dan de capaciteit. Bijvoorbeeld een unsigned char (0-255) de waarde 591313545 geven. Ik denk dat je het beste getchar kunt gebruiken als je een 'oneindige' buffer wilt.

EDIT: voorbeeld toegevoegd.

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

char * str = 0;

void __exit ( void );

int main ( void )
{
char c = 0;
int i = 0;

atexit ( __exit );

while ( 1 ) {
if ( ( c = getchar ( ) ) != '\r' && c != '\n' ) {
i++; str = realloc ( str, sizeof ( char ) * i );
str [ i - 1 ] = c; str [ i ] = 0;
printf ( "str: %s (%d)\n", ( char * ) str, i );
}
}

return 0;
}

void __exit ( void )
{
if ( str ) {
free ( str );
}
}

Net even getest en het werkt zoals het zou moeten werken!
« Laatst bewerkt op: 2009/11/08, 18:39:24 door _san »

Offline Joshua822

  • Documentatieteam
  • Steunpunt: Nee
Re: [C] Getal groter als short als input, erg ?
« Reactie #10 Gepost op: 2009/11/10, 19:30:05 »
Het probleem is dat dit inderdaad een oplossing is voor het werken met strings, maar niet voor shorts limiteren tot hun maximale waarde.


_san

  • Gast
Re: [C] Getal groter als short als input, erg ?
« Reactie #11 Gepost op: 2009/11/15, 19:33:00 »
Het probleem is dat dit inderdaad een oplossing is voor het werken met strings, maar niet voor shorts limiteren tot hun maximale waarde.

Waarom niet?

In je 1e post is het probleem dat je bang bent dat iemand een te groot getal intikt. Als je met chars werkt (zoals je in mijn voorbeeld ziet) hoef je je hier geen zorgen meer om te maken, maar heb je toch dezelfde uitkomst.