摘要:
printf与程序安全:
学过半小时以上C程序设计的人都知道怎么用printf。如此简单的函数,用的不对,同样会造成严重的安全问题。例如下面一段代码:
void Output(const char* str) {
printf(str); /* 还是printf(“%s“, str); ? */
}
答案是printf("%s", str);。试想,如果输入的str是“%d“的情况下,前一种调用会输出什么?当然不会是"%d",而是调用堆栈上的某个数字。通过更巧妙的输入,输出结果就甚至可能是当前调用堆栈的返回地址等重要信息,这些信息可能被用作其他威胁系统安全的用途。
CComBSTR,内存泄漏:
ATL提供的CComBSTR极大便利了COM程序设计中BSTR字符串的使用。但是使用不当则可能造成内存泄漏。例如,CComBSTR提供了通过取地址到BSTR*的隐式类型转换:
CComBSTR outstr;
SomeFunctionReturnsABSTR(&outstr); //signature: SomeFunctionReturnsABSTR(BSTR* retval);
但是由于&操作符函数(operator&)不能获知当前操作中BSTR*的用途,具体地说,是用于输入字符串(In parameter)还是输出字符串(Out parameter),它也就不能适时的释放当前字符串占用的内存。例如下面的代码就会造成内存泄漏:
CComBSTR outstr = “I'm a Happy BSTR“;
//if outstr is assigned to another string value in this function, memory is leaked.
SomeFunctionReturnsABSTR(&outstr); ...[
阅读全文]