Codeguard pointer arithmetic over/underrun
-
Hallo zusammen,
zufällig hatte ich in einem Projekt die Codeguard Überprüfung aktiviert und Codeguard meldet an einer Stelle einen pointer arithmetic overrun/underrun, den ich nicht so recht erklären kann. Hier ist die entsprechende Codezeile:
// if( NULL != m_pStart && (m_pStart + uiSize) < m_pStorageEnd ) if( NULL != m_pStart && m_pStart < (m_pStorageEnd - uiSize) ) { // bestehender Puffer kann weiterbenutzt werden, da der bereits allokierte // Speicherblock grösser als der angeforderte Block ist m_pEnd = m_pStart + uiSize; return; }
Ich habe eine Array Klasse, deren Grösse über eine resize() Methode verändert werden kann. Statt bei einer Grössenänderung nur einen neuen Speicherblock anzufordern überprüfe ich zuerst, ob der bereits allokierte Block grösser als der neue Block ist. Wenn das der Fall ist brauche ich nur den Zeiger auf das Ende des Blocks zu verschieben und bin damit fertig.
In der auskommentierten Zeile stellt CG einen pointer arithmetic overrun fest, in der folgenden einen pointer arithmetic underrun.
Hat jemand eine Erklärung?PS:
Das Ganze ist eine template Klasse, wobei
- m_pStart der Zeiger auf den Anfang des allokierten Blocks ist
- m_pEnd der Zeiger auf das erste Element hinter dem nutzbaren Block ist
- m_pEndOfStorage der Zeiger auf das erste Element hinter dem allokierten Block ist
-
DocShoe schrieb:
// if( NULL != m_pStart && (m_pStart + uiSize) < m_pStorageEnd )
Bedenke, was passiert, wenn uiSize + m_pStart > 232. Dann gibt es einen Integerüberlauf, und
(m_pStart + uiSize) < m_pStorageEnd
ergibt wider deine Absichtentrue
. Das kann durchaus mal passieren, wenn der Speicherblock weiter hinten im Addreßraum alloziert wurde und du ein großes uiSize übergibst.DocShoe schrieb:
if( NULL != m_pStart && m_pStart < (m_pStorageEnd - uiSize) )
Entsprechend ist das ein potentieller Zeigerunterlauf.
Korrekt wäre es so:
if (m_pStart != 0 && m_pStorageEnd - m_pStart >= uiSize)
-
Da hab ich das naheliegendste mal wieder übersehen, danke audacia.
Die Gefahr des Überlaufs habe ich auch erst bei der CG Meldung gesehen, ich war nur etwas verwirrt, dass CG nicht einen möglichen Über- oder Unterlauf erkennt, sondern behauptet, da sei einer.