理论和实践中未定义的行为

9 c++

我很久以前就有别人写的大型C++项目.它包含如下代码:

string CVersion::GetVersionStr() const
{
  string ret;
  char VersionStr[100];
  DWORD v1, v2, v3, Build;
  GetVersion(&v1, &v2, &v3, &Build);
  sprintf(VersionStr, "%d.%d.%d.%d", v1, v2, v3, Build);
  return string(VersionStr);
}
Run Code Online (Sandbox Code Playgroud)

现在我认为由于格式说明符(%d)格式错误,此代码具有未定义的行为.

DWORD 在我的电脑上声明为

typedef unsigned long DWORD;
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 代码是否包含未定义的行为?
  • 是否有任何平台/情况不会出现未定义的行为?也许对于v1的某些值可能没问题?
  • 该软件已经长时间正常工作,所以在实践中,尽管上面是未定义的行为,软件仍能正常工作吗?

PS.这个软件是用10年前的Visual Studio编写的

Bat*_*eba 4

是的,如果 DWORD 是unsigned long. 正确的格式说明符是%lu.

因为未定义的行为正是如此,所以你的第二个问题和第三个问题没有意义。

为什么不使用像 astd::stringstream和exploit这样的东西<<呢?