以下代码片段是对正在运行的SW的提取和简化我是逆向工程(我试图强调这个问题,而不用打扰所有细节)。
在win64机器上构建以下代码会导致操作期间崩溃:
#include "stdafx.h"
#include <stdio.h>
#include <string>
#include <stdlib.h>
using namespace std;
struct vaArgLookAlikePtrs
{
char* pPtr[1000];
};
int _tmain(int argc, _TCHAR* argv[])
{
typedef std::basic_string<char> BasicString;
static char buffer[132000];
BasicString sFormatStr = "Var0=%s\nVar1=%.4f\nVar2=%d\n";
struct vaArgLookAlikePtrs oData;
void* pVoidPtr;
int j=0;
oData.pPtr[j] = "val0";
j++;
double dVar1 = 1.265;
pVoidPtr = (void*)(&(oData.pPtr[j]));
double* pDoublePtr = (double*)pVoidPtr;
*pDoublePtr = dVar1;
j++;// increment the buffer counter twice because doubles require 64 bits for storage (This is how it works on the 32 bit machine)
j++;
int nVar2 = 2;
pVoidPtr = &(oData.pPtr[j]);
int* pIntPtr = (int*)pVoidPtr;
*pIntPtr = nVar2;
sprintf_s(buffer,sFormatStr.c_str(),oData); // <-----
cout << buffer << "\n";
return 0;
}
我几乎没有问题:
J++
)两次? - win32平台如何知道“跳过”两次char *点两次?我认为这是指针大小在32位和64位之间的差异,但我正在寻求你的帮助来解释这种行为。
答案 0 :(得分:3)
原作者只是一起发表C语句,直到它对他有用。真的,这段代码没有其他解释。
答案 1 :(得分:1)
您发布的代码毫无意义。您似乎试图使用数组作为ad-hock方式为可变参数函数准备可变参数序列?对不起,它在C和C ++中都不起作用。对于可变参数函数,根本没有办法“准备”一系列可变参数。
如果您正在尝试实施某种丑陋的黑客攻击,那么请继续攻击sprintf_s
的实现。也许你会以某种方式让它工作。但这与C ++语言无关。而且充其量也毫无意义。