I’m just starting with PREfast. It sounds like it should be a very useful tool. However I don’t quite understand why it’s not happy with the code
below. It says that I am dereferencing a NULL ptr in Dest.Buffer but I think I am making sure it’s OK. I know that I am null terminating a string
unecessarily, but I don’t think that it’s a bug.
void
TapUnicodeAppend
(
UNICODE_STRING & Dest,
UNICODE_STRING & Src
)
{
if ( !Dest.Buffer )
{
Dest.Buffer = (PWSTR) ExAllocatePoolWithTag( NonPagedPool, Src.Length + sizeof( WCHAR ), TAP_TAG);
RtlAppendUnicodeStringToString( &Dest, &Src );
Dest.Buffer[Dest.Length/sizeof(WCHAR)] = ‘\0’;
}
else
{
PWSTR pOldBuffer( NULL );
USHORT CombLen = Dest.Length + Src.Length + sizeof( WCHAR );
if ( CombLen > Dest.MaximumLength )
{
pOldBuffer = Dest.Buffer;
Dest.Buffer = (PWSTR) ExAllocatePoolWithTag( NonPagedPool, CombLen, TAP_TAG);
if ( pOldBuffer )
{
RtlCopyMemory( Dest.Buffer, pOldBuffer, Dest.Length );
ExFreePool( (PVOID) pOldBuffer );
}
Dest.MaximumLength = CombLen;
}
RtlAppendUnicodeStringToString( &Dest, &Src );
Dest.Buffer[Dest.Length/sizeof(WCHAR)] = ‘\0’; // PREfast says dereferencing NULL ptr here
}
}