早就听说msdn里的例子代码问题多,今天也看到一处。

例子代码url:
http://msdn2.microsoft.com/en-us/library/bb250436.aspx

问题的代码:
msdn例子代码的一个潜在bug    // Convert the text from Unicode to ANSI
msdn例子代码的一个潜在bug
    LPTSTR psz = new TCHAR[SysStringLen(bstrHTMLText)];
msdn例子代码的一个潜在bug    lstrcpy(psz, OLE2T(bstrHTMLText));

两个问题:

1、这里Unicode转换ANSI,如果工程没有定义为UNICODE的话,TCHAR就等于char,把实际上SysStringLen * 2大小的串往SysStringLen大小的堆内存里拷贝,就会造成一个堆溢出。

2、SysStringLen大小也不对,该申请的内存大小应该是SysStringLen + 1。

严谨的代码应该这样写:

msdn例子代码的一个潜在bugDWORD dwLen = (SysStringLen(bstrHTMLText) + 1* (sizeof(WCHAR) / sizeof(TCHAR));
msdn例子代码的一个潜在bugLPTSTR psz 
= new TCHAR[dwLen];
msdn例子代码的一个潜在bugmemset(psz, 
0, dwLen * sizeof(TCHAR));
msdn例子代码的一个潜在buglstrcpy(psz, OLE2T(bstrHTMLText));

不知道实际情况下有没有有问题的程序,赫赫。

相关文章:

  • 2021-07-17
  • 2022-02-22
  • 2021-08-22
  • 2021-10-21
  • 2022-01-10
  • 2022-12-23
  • 2022-01-24
  • 2021-09-05
猜你喜欢
  • 2022-12-23
  • 2021-11-03
  • 2021-09-26
  • 2021-07-16
  • 2021-06-11
相关资源
相似解决方案