根据我的阅读,这个函数应该有效,但对于我的生活,我无法弄清楚为什么它不是。
我覆盖了无效参数处理程序,因此如果传递了无效参数(例如缓冲区太小),我可以继续运行。 asprintf_s宏获取标准sprintf_s的参数,添加文件名和行号,然后调用asprintf_s2。它会检查结果是否溢出缓冲区,打印文件名以及溢出发生的位置。
问题:我猜测我对可变参数做错了,因为 始终 会返回溢出。
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <string>
#include <excpt.h>
#include <stdarg.h>
#define asprintf_s(...) asprintf_s2( __FILE__, __LINE__, __VA_ARGS__)
//#define asprintf_s(...) sprintf_s( __VA_ARGS__ )
inline int asprintf_s2(char *file, int line, char *dest, int sizeOfDest, char *Format, ...)
{
va_list pArgs;
va_start(pArgs, Format);
int sizeOfBuffer = sprintf_s(dest, sizeOfDest, Format, pArgs);
if (sizeOfBuffer == -1) printf("Buffer Overflow! File: %s LINE: %d\n", file, line );
va_end(pArgs);
return sizeOfBuffer;
}
void in_house_invalid_parameter(
const wchar_t * expression,
const wchar_t * function,
const wchar_t * file,
unsigned int line,
uintptr_t pReserved
)
{
// Do nothing on invalid parameter
}
int main()
{
char temp1[3];
char temp80[80];
std::string input;
int k = -3;
_set_invalid_parameter_handler(in_house_invalid_parameter);
strcpy_s(temp1, sizeof(temp1), "XX");
strcpy_s(temp80, sizeof(temp80), "1");
printf("Temp1:'%s'\n", temp1);
k = asprintf_s(temp1, sizeof(temp1), "%s\n", temp80);
printf("k:%d temp1:'%s', temp80:'%s'\n", k, temp1, temp80);
std::getline(std::cin, input);
return 0;
}