Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C++] Wat doet dit stukje code?

Pagina: 1
Acties:

  • Petervanakelyen
  • Registratie: December 2006
  • Laatst online: 30-04 12:52
Ik heb een stukje C++ code waar ik helaas niet helemaal van weet wat het doet.

code:
1
2
3
4
5
6
7
8
char list[65536] = "";
char *ptr = list;

void add2list( char *list, char *name ) {
    for ( char *ptr = list; *ptr; ptr += strlen(ptr) + 1 );
    strcpy( ptr, name );
    ptr[ strlen(name) + 1 ] = 0;
}


Het maakt deel uit van een stukje source code dat wordt gebruikt om een proprietair filesystem te unpacken. Helaas heb ik het niet zelf geschreven en kan ik na een paar uur zoeken enkel tot de conclusie komen dat ik te weinig van C++ ken om hieruit af te leiden wat er juist gebeurd. :'(

Somewhere in Texas there's a village missing its idiot.


Verwijderd

De list is een character array. Die functie skipt over de lijst zolang er op de pointer iets anders staat dan een nul byte. Eigenlijk concatenate het ding strings maar laat de nul byte staan als separator. Zodra de conditie false is (*ptr) staat er niets op die pointer en wordt daar de inhoud van name achter geplakt, gevolgd door een nul byte.

Voorbeeldje:
code:
1
2
3
4
5
6
7
........................................
add2list(list, "piet");
piet....................................
add2list(list, "henk");
piet.henk...............................
add2list(list, "sjaak");
piet.henk.sjaak.........................

[ Voor 28% gewijzigd door Verwijderd op 19-06-2014 21:23 ]


  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Verwijderd schreef op donderdag 19 juni 2014 @ 21:17:
en wordt daar de inhoud van name achter geplakt, gevolgd door een nul byte.
Past dat altijd?

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


  • Petervanakelyen
  • Registratie: December 2006
  • Laatst online: 30-04 12:52
Zo lang concat(list,name) niet > 65536 bytes vermoed ik van wel?

Somewhere in Texas there's a village missing its idiot.


  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

En dat "komt toch nooit voor", dus daar wordt zo te zien niet op gecontroleerd. :P

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Verwijderd

Ik denk dat er wat te weinig checks op zitten want als er meer dan 65536 tekens in zijn opgeslagen (minus separator) zit je buiten het gereserveerde geheugen te peuren.
Nee :D Dit gaat soms keihard stuk natuurlijk.

[ Voor 34% gewijzigd door Verwijderd op 19-06-2014 21:37 ]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22:57
Merk op dat de list en ptr die bovenaan gedeclareerd worden niet de variabelen zijn die in de functie add2list() gebruikt worden; je weet dus eigenlijk niet hoe groot de buffer zal zijn, en misschien kan de caller wel van te voren bepalen of de buffer groot genoeg is of niet.

Dit is trouwens zuivere C code – er is niets C++ aan (al zal het ook best compileren in C++).

  • Petervanakelyen
  • Registratie: December 2006
  • Laatst online: 30-04 12:52
@Cheatah: het is volkomen duidelijk, een betere uitleg had ik mij niet kunnen wensen :)

@Soultaker: mijn fout, de rest van de code maakt hier en daar wel gebruik van C++ specifieke functies.

Somewhere in Texas there's a village missing its idiot.

Pagina: 1