Permalänk
Medlem

Spot the bug

Microsoft Security Developer Center , http://msdn.microsoft.com/security/ , har börjat med nåt som kallas "spot the bug", jag tror att ni fattar vad det går ut på så här kommer koden. Första exemplet är ganska enkelt så de flesta bör hitta felet.

#define MAX (50) char szDest[MAX]; strncpy(szDest,pszSrc,MAX); pszDest[MAX] = '\0';

Får hålla tråden uppdaterad med fler exempel när det kommer. Om ni har nån egen klurig och buggig kod kan ni ju paste:a den här också. Vi håller oss till C/C++ i denna tråd så inget annat tack.

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk
Medlem

MAX - 1 borde det väl stå på sista raden?

Visa signatur

void@qnet
teeworlds, stålverk80, evil schemer, c, c++
Languages shape the way we think, or don't.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av jdv
MAX - 1 borde det väl stå på sista raden?

Japp

Permalänk
Hedersmedlem

Hmm...
det ska vara MAX - 1 som sagt, dessutom ska det vara szDest och inte pszDest. Sedan är inte pszSrc deklarerad och har fått ett värde någonstans i koden...

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av m0REc
Hmm...
det ska vara MAX - 1 som sagt, dessutom ska det vara szDest och inte pszDest. Sedan är inte pszSrc deklarerad och har fått ett värde någonstans i koden...

"pszDest" är ju bara ett stavfel, skulle man ju hittat vid kompileringen, man får väl anta att pszSrc är en null-terminerad sträng då den inte finns deklarerad i koden. Handlar ju om att hitta buggar och inte kompileringsspel ..

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk
Avstängd

Kan någon förklara vad den kodsnutten gör?

Visa signatur

. C++
. PHP

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Ashim
Kan någon förklara vad den kodsnutten gör?

Kopierar en sträng till en array. Sista raden ska ju se till att strängen blir null-terminerad men koden skriver utanför arrayen, då arrayen går ifrån 0-(MAX-1). Är egentligen ett ganska jobbigt fel då man inte alltid märker att felet uppstår.

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av MagnusL
"pszDest" är ju bara ett stavfel, skulle man ju hittat vid kompileringen, man får väl anta att pszSrc är en null-terminerad sträng då den inte finns deklarerad i koden. Handlar ju om att hitta buggar och inte kompileringsspel ..

Mjo, iof.

Men jag skulle nog klassa det som buggar, dock av den typ som uppdagas vid kompilering.

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk
Avstängd

Varför ska det vara MAX - 1 på sista raden?

Visa signatur

. C++
. PHP

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av Ashim
Varför ska det vara MAX - 1 på sista raden?

En array börjar på 0 och inte på 1. 50 är längden på den men sista indexet är 49.

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk
Avstängd

Aha, tack så mycket

Vad betyder :

szDest

pszSrc

pszDest

strncpy

Visa signatur

. C++
. PHP

Permalänk
Medlem

strncpy() = string copy .. kopierar en sträng .. max n st bokstäver, bör användas istället för strcpy() ..
szDest = en array
pszSrc = en pekare till en null (zero) terminerad sträng. Dvs. en sträng som slutar med en byte med värdet 0..
pszDest = szDest = stavfel ..

[EDIT] 'p' i variabelnamnet betyder "pointer" .. dvs. pekare ..
's' = string
'z' = zero-terminated, dvs. null-terminerad

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk
Avstängd

Jaså! Tack så mycket MagnusL.

Visa signatur

. C++
. PHP

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av MagnusL
strncpy() = string copy .. kopierar en sträng .. max n st bokstäver, bör användas istället för strcpy() ..
szDest = en array
pszSrc = en pekare till en null (zero) terminerad sträng. Dvs. en sträng som slutar med en byte med värdet 0..
pszDest = szDest = stavfel ..

[EDIT] 'p' i variabelnamnet betyder "pointer" .. dvs. pekare ..
's' = string
'z' = zero-terminated, dvs. null-terminerad

Angående p, s och z är det långt ifrån universalt. Stämmer bara om man kör med ungersk notation. Jag gillar det inte riktigt, jag håller mig till väl beskrivande variabelnamn istället.

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av m0REc
Angående p, s och z är det långt ifrån universalt. Stämmer bara om man kör med ungersk notation. Jag gillar det inte riktigt, jag håller mig till väl beskrivande variabelnamn istället.

Anledningen att det används är ju att ha en "standard" att använda, iallafall på Windows plattformen. All dokumentation på t.ex. msdn använder ju ungerska notationen så då gäller det ju att iallafall förstå grunderna. Personligen använder jag den ibland, beror på vilka som ska läsa min kod. Om man programmerar på windows plattformen är det rekommenderat att använda den.

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410